Dostęp do arkuszy kalkulacyjnych Google w C # przy użyciu interfejsu API danych Google

104

Mam pewne informacje w Arkuszach kalkulacyjnych Google w postaci pojedynczego arkusza. Czy istnieje sposób, w jaki mogę odczytać te informacje z .NET, podając dane logowania Google i adres arkusza kalkulacyjnego. Czy jest to możliwe przy użyciu interfejsów API danych Google. Ostatecznie muszę uzyskać informacje z arkusza kalkulacyjnego Google w DataTable. Jak mogę to zrobić? Jeśli ktoś próbował, proszę o podzielenie się informacjami.

blitzkriegz
źródło
sprawdź moją odpowiedź stackoverflow.com/questions/48432846/ ...
Mike Darwish

Odpowiedzi:

176

Zgodnie z podręcznikiem użytkownika .NET :

Pobierz bibliotekę klienta .NET :

Dodaj je za pomocą instrukcji:

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

Uwierzytelniać:

SpreadsheetsService myService = new SpreadsheetsService("exampleCo-exampleApp-1");
myService.setUserCredentials("[email protected]", "mypassword");

Pobierz listę arkuszy kalkulacyjnych:

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

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

Biorąc pod uwagę pobrany już wpis w arkuszu kalkulacyjnym, możesz uzyskać listę wszystkich arkuszy w tym arkuszu kalkulacyjnym w następujący sposób:

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

I uzyskaj kanał oparty na komórkach:

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);
}
Kelly
źródło
3
Czego należy użyć jako wartości ciągu dla nowej usługi SpreadsheetsService („ exampleCo-exampleApp-1”)? czy ma znaczenie, co tam umieściłem? Dzięki!
Ian Davis
Pobierz listę arkuszy kalkulacyjnych: "SpreadsheetQuery query = new SpreadsheetQuery ();" powinno brzmieć „SpreadsheetFeed feed = myService.Query (zapytanie);” Próbowałem edytować za mało zmienionych znaków!
SQLBobScot
5
developers.google.com/google-apps/spreadsheets/authorize Ważne: protokół OAuth 1.0 nie jest już obsługiwany i zostanie wyłączony 5 maja 2015 r. Jeśli Twoja aplikacja korzysta z protokołu OAuth 1.0, musisz przeprowadzić migrację do OAuth 2.0. W przeciwnym razie aplikacja przestanie działać .
Kiquenet
1
ten link, z @wescpy poniżej, pomógł mi znaleźć bardziej przydatne informacje na połowę 2016 roku: googleappsdeveloper.blogspot.com/2016/05/...
joon
Nie będzie działać po 2020-03-03, ponieważ używana biblioteka korzysta z interfejsu API Arkuszy Google v3 cloud.google.com/blog/products/g-suite/…
Ogglas
22

Napisałem prosty wrapper wokół biblioteki klienta .Net Google , który udostępnia prostszy interfejs podobny do bazy danych, z silnie wpisanymi typami rekordów. Oto przykładowy kod:

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("[email protected]", "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);

Istnieje również dostawca LINQ, który tłumaczy się na strukturalne operatory zapytań Google :

var q = from r in table.AsQueryable()
        where r.IntProp > -1000 && r.StringProp == "hello"
        orderby r.IntProp
        select r;
Mauricio Scheffer
źródło
@Kiquenet Co masz na myśli? Ostatnia wersja Google.GData. *, Jaką widzę,
Mauricio Scheffer
developers.google.com/google-apps/spreadsheets Interfejs API Versión 3.0 (OAuth itp.)
Kiquenet,
@Kiquenet Daj mi znać, gdy Google zaktualizuje swoje biblioteki .NET. Ale myślę, że Google.GData. * 2.2.0 już używa API v3.
Mauricio Scheffer
developers.google.com/google-apps/spreadsheets/authorize Ważne: protokół OAuth 1.0 nie jest już obsługiwany i zostanie wyłączony 5 maja 2015 r. Jeśli Twoja aplikacja korzysta z protokołu OAuth 1.0, musisz przeprowadzić migrację do OAuth 2.0. W przeciwnym razie aplikacja przestanie działać .
Kiquenet
17

(Czerwiec-listopad 2016) Pytanie i odpowiedzi na nie są już nieaktualne, ponieważ: 1) Interfejsy API GData to poprzednia generacja interfejsów API Google. Chociaż nie wszystkie funkcje API GData były przestarzałe, wszystkie najnowsze API Google czy nie użyć protokołu danych Google ; oraz 2) jest nowy interfejs API Arkuszy Google v4 (również nie GData).

Przechodząc dalej, musisz pobrać bibliotekę klientów interfejsów API Google dla .NET i korzystać z najnowszego interfejsu API Arkuszy , który jest znacznie bardziej wydajny i elastyczny niż jakikolwiek poprzedni interfejs API. Oto przykładowy kod C # ułatwiający rozpoczęcie pracy. Zapoznaj się również z dokumentacją referencyjną dotyczącą platformy .NET, aby uzyskać informacje o interfejsie Sheets API i podręczniku dla programistów .NET Google APIs Client Library .

Jeśli nie jesteś uczulony na Pythona (jeśli jesteś, po prostu udawaj, że to pseudokod;)), stworzyłem kilka filmów z nieco dłuższymi, bardziej "rzeczywistymi" przykładami używania API, z którego możesz się uczyć i migrować do C # w razie potrzeby :

wescpy
źródło
czy te narzędzia mogą być również używane do uzyskiwania dostępu do plików Microsoft Excel?
afr0
1
Niestety, zarówno Microsoft, jak i Google tworzą konkurencyjne produkty, które nie są zgodne ze wspólnym standardem, więc musisz znaleźć własne narzędzia, aby uzyskać dostęp do plików Excel. Jeśli jesteś programistą Pythona, odwiedź python-excel.org . W przypadku innych języków musisz przeszukać odpowiednie społeczności. Możesz też zaimportować pliki Excela do Google (przy użyciu interfejsu Drive API), a następnie użyć interfejsu API Arkuszy, aby wykonać żądane operacje. Interfejsy API Google obsługują wiele różnych języków ... patrz developers.google.com/api-client-library
wescpy
3

Możesz zrobić to, o co prosisz, na kilka sposobów:

  1. Używając biblioteki C # arkuszy kalkulacyjnych Google (jak w odpowiedzi Tacoman667), aby pobrać ListFeed, który może zwrócić listę wierszy (ListEntry w języku Google), z których każdy ma listę par nazwa-wartość. Dokumentacja interfejsu API arkuszy kalkulacyjnych Google ( http://code.google.com/apis/spreadsheets/code.html ) zawiera więcej niż wystarczającą ilość informacji, aby rozpocząć.

  2. Korzystanie z interfejsu API wizualizacji Google, który umożliwia przesyłanie bardziej wyrafinowanych (prawie jak SQL) zapytań w celu pobrania tylko wymaganych wierszy / kolumn.

  3. Zawartość arkusza kalkulacyjnego jest zwracana jako kanały Atom, więc możesz użyć analizy XPath lub SAX w celu wyodrębnienia zawartości źródła listy. Jest przykład robienia tego w ten sposób (choć obawiam się tylko w Javie i Javascript) na http://gqlx.twyst.co.za .

Tonys
źródło
2

Jestem prawie pewien, że w Google Code będzie do tego trochę C # SDK / toolkits. Znalazłem ten , ale mogą być i inne, więc warto się rozejrzeć.

Steve
źródło
2

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

To powinno zacząć. Nie bawiłem się nim ostatnio, ale jakiś czas temu ściągnąłem bardzo starą wersję i wydawała się całkiem solidna. Ten jest również zaktualizowany do Visual Studio 2008, więc sprawdź dokumentację!

Tacoman667
źródło
2

Najbardziej pozytywna odpowiedź od @Kelly nie jest już ważna, jak mówi @wescpy. Jednak po 2020-03-03 nie będzie działać w ogóle, ponieważ używana biblioteka używa Google Sheets v3 API.

Interfejs API Arkuszy Google w wersji 3 zostanie wyłączony 3 marca 2020 r

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

Zostało to ogłoszone 10.09.2019 przez Google:

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

Nowy przykładowy kod dla Google Sheets v4 API:

Iść do

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

i generuj credentials.json. Następnie zainstaluj Google.Apis.Sheets.v4NuGet i wypróbuj następujący przykład:

Zauważ, że otrzymałem błąd Unable to parse range: Class Data!A2:Ez przykładowym kodem, ale z moim arkuszem kalkulacyjnym. Zmiana na Sheet1!A2:Edziałała jednak, ponieważ mój arkusz został tak nazwany. Pracował również tylko z 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();
        }
    }
}
Ogglas
źródło
Jak obejść bez konieczności określania identyfikatora klienta / wpisów tajnych i zakresów? Zrobiłem już przepływ OAuth i mam token dostępu i token odświeżania (myślę o trybie offline) i nie chcę żadnego z tych dodatkowych bzdur. Nie mam dostępu do identyfikatora klienta i klucza klienta, ponieważ znajdują się one na serwerze przekazującym OAuth, do którego nie mam również dostępu w usługach w tle.
Blake Niemyjski
@BlakeNiemyjski Użyj pozostałego interfejsu API bezpośrednio, link: developers.google.com/sheets/api/reference/rest
Ogglas