Доступ к таблицам Google с помощью C # с помощью API данных Google


104

У меня есть некоторая информация в таблицах Google на одном листе. Есть ли способ, которым я могу прочитать эту информацию из .NET, предоставив учетные данные Google и адрес электронной таблицы. Возможно ли использование API данных Google. В конечном итоге мне нужно получить информацию из электронной таблицы Google в DataTable. Как мне это сделать? Если кто-то пытался это сделать, пожалуйста, поделитесь информацией.


Ответы:


176

Согласно руководству пользователя .NET :

Загрузите клиентскую библиотеку .NET :

Добавьте эти операторы using:

using Google.GData.Client;
using Google.GData.Extensions;
using Google.GData.Spreadsheets;

Аутентифицировать:

SpreadsheetsService myService = new SpreadsheetsService("exampleCo-exampleApp-1");
myService.setUserCredentials("jo@gmail.com", "mypassword");

Получите список таблиц:

SpreadsheetQuery query = new SpreadsheetQuery();
SpreadsheetFeed feed = myService.Query(query);

Console.WriteLine("Your spreadsheets: ");
foreach (SpreadsheetEntry entry in feed.Entries)
{
    Console.WriteLine(entry.Title.Text);
}

Учитывая уже полученный вами объект SpreadsheetEntry, вы можете получить список всех рабочих листов в этой таблице следующим образом:

AtomLink link = entry.Links.FindService(GDataSpreadsheetsNameTable.WorksheetRel, null);

WorksheetQuery query = new WorksheetQuery(link.HRef.ToString());
WorksheetFeed feed = service.Query(query);

foreach (WorksheetEntry worksheet in feed.Entries)
{
    Console.WriteLine(worksheet.Title.Text);
}

И получите фид на основе ячеек:

AtomLink cellFeedLink = worksheetentry.Links.FindService(GDataSpreadsheetsNameTable.CellRel, null);

CellQuery query = new CellQuery(cellFeedLink.HRef.ToString());
CellFeed feed = service.Query(query);

Console.WriteLine("Cells in this worksheet:");
foreach (CellEntry curCell in feed.Entries)
{
    Console.WriteLine("Row {0}, column {1}: {2}", curCell.Cell.Row,
        curCell.Cell.Column, curCell.Cell.Value);
}

3
Что мне следует использовать в качестве строкового значения для new SpreadsheetsService (" exampleCo-exampleApp-1")? имеет значение, что я туда вставил? Спасибо!
Ян Дэвис

Получите список электронных таблиц: «SpreadsheetQuery query = new SpreadsheetQuery ();» следует читать «SpreadsheetFeed feed = myService.Query (query);» Пытался отредактировать мало символов изменилось!
SQLBobScot

5
developers.google.com/google-apps/spreadsheets/authorize Важно: OAuth 1.0 больше не поддерживается и будет отключен 5 мая 2015 года. Если ваше приложение использует OAuth 1.0, вы должны перейти на OAuth 2.0, иначе ваше приложение перестанет работать. .
Kiquenet

1
эта ссылка из @wescpy ниже помогла мне найти более актуальную информацию на середину 2016 года: googleappsdeveloper.blogspot.com/2016/05/…
joon

Не будет работать после 03.03.2020, так как используемая библиотека использует Google Sheets v3 API cloud.google.com/blog/products/g-suite/…
Ogglas

22

Я написал простую обертку вокруг клиентской библиотеки .Net компании Google , он предоставляет более простой базы данных , как интерфейс, с сильно типизированных типов записей. Вот пример кода:

public class Entity {
    public int IntProp { get; set; }
    public string StringProp { get; set; }
}

var e1 = new Entity { IntProp = 2 };
var e2 = new Entity { StringProp = "hello" };
var client = new DatabaseClient("you@gmail.com", "password");
const string dbName = "IntegrationTests";
Console.WriteLine("Opening or creating database");
db = client.GetDatabase(dbName) ?? client.CreateDatabase(dbName); // databases are spreadsheets
const string tableName = "IntegrationTests";
Console.WriteLine("Opening or creating table");
table = db.GetTable<Entity>(tableName) ?? db.CreateTable<Entity>(tableName); // tables are worksheets
table.DeleteAll();
table.Add(e1);
table.Add(e2);
var r1 = table.Get(1);

Также существует поставщик LINQ, который преобразует операторы структурированных запросов Google :

var q = from r in table.AsQueryable()
        where r.IntProp > -1000 && r.StringProp == "hello"
        orderby r.IntProp
        select r;

@Kiquenet Что ты имеешь в виду? Последняя версия Google.GData. *, Которую
Маурисио Шеффер

developers.google.com/google-apps/spreadsheets Versión 3.0 API (OAuth и т. д.)
Kiquenet

@Kiquenet Сообщите мне, когда Google обновит свои библиотеки .NET. Но я думаю, что Google.GData. * 2.2.0 уже использует API v3.
Маурисио Схеффер

developers.google.com/google-apps/spreadsheets/authorize Важно: OAuth 1.0 больше не поддерживается и будет отключен 5 мая 2015 года. Если ваше приложение использует OAuth 1.0, вы должны перейти на OAuth 2.0, иначе ваше приложение перестанет работать. .
Kiquenet

17

(Июнь-ноябрь 2016 г.) Вопрос и ответы на него устарели, поскольку: 1) API-интерфейсы GData - это API-интерфейсы Google предыдущего поколения. Хотя не все интерфейсы GData устарели, все последние API , Google ничего не используют протокол данных Google ; и 2) появился новый Google Sheets API v4 (также не GData).

Двигаясь дальше, вам необходимо получить клиентскую библиотеку API Google для .NET и использовать последнюю версию API таблиц , которая намного мощнее и гибче, чем любой предыдущий API. Вот пример кода C #, который поможет вам начать работу. Также проверьте справочную документацию по .NET для Sheets API и руководство для разработчиков клиентской библиотеки .NET Google API .

Если у вас нет аллергии на Python (если да, просто представьте, что это псевдокод;)), я сделал несколько видеороликов с немного более длинными, более «реальными» примерами использования API, из которого вы можете научиться и при желании перейти на C # :


можно ли использовать эти инструменты для доступа к файлам Microsoft Excel?
afr0

1
К сожалению, и Microsoft, и Google создают конкурентоспособные продукты, которые не соответствуют общему стандарту, поэтому вам нужно найти свои собственные инструменты для доступа к файлам Excel. Если вы разработчик Python, посетите python-excel.org . Для других языков вам придется искать соответствующие сообщества. Кроме того, вы можете импортировать файлы Excel в Google (используя Drive API), а затем использовать Sheets API для выполнения желаемых операций. API , Google поддерживает множество языков ... см developers.google.com/api-client-library
wescpy

3

Вы можете сделать то, о чем просите, несколькими способами:

  1. Использование библиотеки C # для электронных таблиц Google (как в ответе Tacoman667) для получения ListFeed, который может возвращать список строк (ListEntry на языке Google), каждая из которых имеет список пар имя-значение. Документация по API таблиц Google ( http://code.google.com/apis/spreadsheets/code.html ) содержит более чем достаточно информации, чтобы вы могли начать работу.

  2. Использование API визуализации Google, который позволяет отправлять более сложные (почти как SQL) запросы для получения только нужных вам строк / столбцов.

  3. Содержимое электронной таблицы возвращается в виде каналов Atom, поэтому вы можете использовать синтаксический анализ XPath или SAX для извлечения содержимого канала списка. Пример того, как это сделать (боюсь, только на Java и Javascript) можно найти на http://gqlx.twyst.co.za .


2

Я почти уверен, что для этого в Google Code есть несколько SDK / инструментов для C #. Я нашел этот , но могут быть и другие, так что его стоит поискать.


2

http://code.google.com/apis/gdata/articles/dotnet_client_lib.html

Это должно вас начать. Я не играл с ним в последнее время, но некоторое время назад я скачал очень старую версию, и она показалась мне довольно надежной. Этот также обновлен до Visual Studio 2008, так что ознакомьтесь с документацией!



2

Ответ, получивший наибольшее количество голосов от @Kelly, больше не действителен, как говорит @wescpy. Однако после 2020-03-03 он не будет работать вообще, поскольку используемая библиотека использует Google Sheets v3 API.

API Google Таблиц v3 будет закрыт 3 марта 2020 г.

https://developers.google.com/sheets/api/v3

Об этом было объявлено 10 сентября 2019 года от Google:

https://cloud.google.com/blog/products/g-suite/migrate-your-apps-use-latest-sheets-api

Новый пример кода для Google Sheets v4 API:

Перейти к

https://developers.google.com/sheets/api/quickstart/dotnet

и генерировать credentials.json. Затем установите Google.Apis.Sheets.v4NuGet и попробуйте следующий пример:

Обратите внимание, что я получил ошибку Unable to parse range: Class Data!A2:Eс кодом примера, но с моей таблицей. Однако изменение на Sheet1!A2:Eсработало, так как мой лист был назван так. И работал с только A2:E.

using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;

namespace SheetsQuickstart
{
    class Program
    {
        // If modifying these scopes, delete your previously saved credentials
        // at ~/.credentials/sheets.googleapis.com-dotnet-quickstart.json
        static string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly };
        static string ApplicationName = "Google Sheets API .NET Quickstart";

        static void Main(string[] args)
        {
            UserCredential credential;

            using (var stream =
                new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
            {
                // The file token.json stores the user's access and refresh tokens, and is created
                // automatically when the authorization flow completes for the first time.
                string credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                Console.WriteLine("Credential file saved to: " + credPath);
            }

            // Create Google Sheets API service.
            var service = new SheetsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            // Define request parameters.
            String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms";
            String range = "Class Data!A2:E";
            SpreadsheetsResource.ValuesResource.GetRequest request =
                    service.Spreadsheets.Values.Get(spreadsheetId, range);

            // Prints the names and majors of students in a sample spreadsheet:
            // https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
            ValueRange response = request.Execute();
            IList<IList<Object>> values = response.Values;
            if (values != null && values.Count > 0)
            {
                Console.WriteLine("Name, Major");
                foreach (var row in values)
                {
                    // Print columns A and E, which correspond to indices 0 and 4.
                    Console.WriteLine("{0}, {1}", row[0], row[4]);
                }
            }
            else
            {
                Console.WriteLine("No data found.");
            }
            Console.Read();
        }
    }
}

Как мне обойтись без указания идентификатора клиента / секретов и областей действия? Я уже выполнил поток OAuth, и у меня есть токен доступа и токен обновления (подумайте о автономном режиме), и мне не нужна эта дополнительная чушь. У меня нет доступа к идентификатору клиента и секрету клиента, поскольку они находятся на сервере ретрансляции oauth, к которому у меня тоже нет доступа в фоновых службах.
Блейк Немийски,

@BlakeNiemyjski Используйте остальной API напрямую, ссылка: developers.google.com/sheets/api/reference/rest
Ogglas
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.