Доступ до електронних таблиць Google за допомогою C # за допомогою API даних Google


104

Я маю деяку інформацію в електронних таблицях Google як єдиний аркуш. Чи є спосіб, за допомогою якого я можу прочитати цю інформацію з .NET, надавши дані облікових даних google та електронну таблицю. Чи можливо за допомогою API даних Google. Зрештою, мені потрібно отримати інформацію з електронної таблиці Google у DataTable. Як я можу це зробити? Якщо хтось спробував це, будь ласка, поділіться деякою інформацією.


перевірити мою відповідь stackoverflow.com/questions/48432846/…
Майк Дарвіш

Відповіді:


176

Відповідно до посібника користувача .NET :

Завантажте бібліотеку клієнтів .NET :

Додайте їх за допомогою операторів:

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);
}

З огляду на електронну таблицю, яку ви вже отримали, ви можете отримати список усіх робочих таблиць у цій електронній таблиці таким чином:

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
Що слід використовувати для рядкового значення для нового SpreadsheetsService (" exampleCo-exampleApp-1")? чи має значення те, що я туди помістив Дякую!
Ian Davis

Отримайте список електронних таблиць: "Запит SpreadsheetQuery = новий 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, або ваша програма перестане функціонувати .
Кікенет

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

Не працює після 2020-03-03, оскільки бібліотека використовує API Google Sheets v3 API cloud.google.com/blog/products/g-suite/…
Огглас

22

Я написав просту обгортку навколо бібліотеки клієнтів .Net , він відкриває простіший інтерфейс, схожий на базу даних, із сильно типізованими типами записів. Ось приклад коду:

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. * - це 2.2.0 nuget.org/packages/Google.GData.Documents
Маурісіо Шеффер

developers.google.com/google-apps/spreadsheets Версія 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, або ваша програма перестане функціонувати .
Кікенет

17

(Червень-листопад 2016 р.) Питання та його відповіді застаріли, оскільки: 1) API GData - це попереднє покоління API Google. Хоча не всі інтерфейси GData застаріли, всі останні API , Google нічого НЕ використовують протокол даних Google ; і 2) є а новий API Google Sheets v4 (також не GData).

Просунувшись звідси, вам потрібно отримати бібліотеку клієнтів API API для .NET та скористатися найновішим API таблиць , який набагато потужніший та гнучкіший, ніж будь-який попередній API. Ось зразок коду C #, який допоможе розпочати роботу. Також перевірте .NET-довідкові документи для API Sheets та керівництво розробників бібліотеки клієнтів API .NET API .

Якщо у вас немає алергії на Python (якщо ви є, просто зробіть вигляд, що це псевдокод;)), я зробив декілька відео з трохи довшими, більш "реальними" прикладами використання API, з якого ви можете дізнатися і перейти на C # за бажанням :


Чи можна використовувати ці інструменти і для доступу до файлів Microsoft Excel?
afr0

1
На жаль, і Microsoft, і Google виробляють конкурентоспроможні продукти, які не дотримуються загального стандарту, тому вам потрібно знайти власні інструменти для доступу до файлів Excel. Якщо ви розробник Python, перегляньте сторінку python-excel.org . Для інших мов вам доведеться шукати відповідні спільноти. Крім того, ви можете імпортувати файли Excel до Google (за допомогою API API), а потім використовувати API Таблиць для виконання потрібних операцій. API API підтримують широкий спектр мов ... див. Developers.google.com/api-client-library
wescpy

3

Ви можете робити те, що просите, кількома способами:

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

  2. Використовуючи API візуалізації Google, який дозволяє надсилати більш складні (майже як SQL) запити, щоб отримати лише потрібні рядки / стовпці.

  3. Вміст електронної таблиці повертається як канал Atom, щоб ви могли використовувати XPath або SAX розбір для вилучення вмісту каналу списку. На прикладі http://gqlx.twyst.co.za є приклад робити це таким чином (лише в Java та Javascript, хоча я боюся) .


2

Я впевнений, що для цього в коді Google знайдеться декілька C # SDK / наборів інструментів. Я знайшов цю , але можуть бути й інші, тому варто переглядати.




2

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

API Google Sheets v3 буде закрито 3 березня 2020 року

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

Про це повідомив Google-09-09-10:

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
Огглас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.