Zugriff auf Google Spreadsheets mit C # über die Google Data API


104

Ich habe einige Informationen in Google Spreadsheets als einzelnes Blatt. Gibt es eine Möglichkeit, wie ich diese Informationen aus .NET lesen kann, indem ich die Google-Anmeldeinformationen und die Tabellenkalkulationsadresse bereitstelle? Ist es möglich, Google Data APIs zu verwenden? Letztendlich muss ich die Informationen aus der Google-Tabelle in einer DataTable abrufen. Wie kann ich es tun? Wenn jemand es versucht hat, teilen Sie bitte einige Informationen.


Überprüfen Sie meine Antwort stackoverflow.com/questions/48432846/…
Mike Darwish

Antworten:


175

Laut .NET-Benutzerhandbuch :

Laden Sie die .NET-Clientbibliothek herunter :

Fügen Sie diese mit Anweisungen hinzu:

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

Authentifizieren:

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

Holen Sie sich eine Liste der Tabellenkalkulationen:

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

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

Bei einem bereits abgerufenen Tabellenkalkulationseintrag können Sie eine Liste aller Arbeitsblätter in dieser Tabelle wie folgt abrufen:

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

Und erhalten Sie einen zellbasierten Feed:

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
Was soll ich für den Zeichenfolgenwert für den neuen SpreadsheetsService (" exampleCo-exampleApp-1") verwenden? Ist es wichtig, was ich dort hineingesteckt habe? Vielen Dank!
Ian Davis

Eine Liste der Tabellen abrufen: "SpreadsheetQuery query = new SpreadsheetQuery ();" sollte lauten "SpreadsheetFeed feed = myService.Query (Abfrage);" Versucht, nicht genug Zeichen zu bearbeiten geändert!
SQLBobScot

5
developer.google.com/google-apps/spreadsheets/authorize Wichtig: OAuth 1.0 wird nicht mehr unterstützt und am 5. Mai 2015 deaktiviert. Wenn Ihre Anwendung OAuth 1.0 verwendet, müssen Sie auf OAuth 2.0 migrieren, da Ihre Anwendung sonst nicht mehr funktioniert .
Kiquenet

1
Dieser Link von @wescpy unten hat mir geholfen, relevantere Informationen für Mitte 2016 zu finden: googleappsdeveloper.blogspot.com/2016/05/…
joon

Funktioniert nach dem 03.03.2020 nicht mehr, da die verwendete Bibliothek die Google Sheets v3-API cloud.google.com/blog/products/g-suite/… verwendet.
Ogglas

22

Ich habe einen einfachen Wrapper um die .Net-Clientbibliothek von Google geschrieben , der eine einfachere datenbankähnliche Oberfläche mit stark typisierten Datensatztypen bietet. Hier ist ein Beispielcode:

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

Es gibt auch einen LINQ-Anbieter, der in die strukturierten Abfrageoperatoren von Google übersetzt :

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

@Kiquenet Was meinst du? Die letzte Version von Google.GData. * Ist
Mauricio Scheffer


@Kiquenet Lassen Sie mich wissen, wenn Google seine .NET-Bibliotheken aktualisiert. Aber ich denke, Google.GData. * 2.2.0 verwendet bereits API v3.
Mauricio Scheffer

developer.google.com/google-apps/spreadsheets/authorize Wichtig: OAuth 1.0 wird nicht mehr unterstützt und am 5. Mai 2015 deaktiviert. Wenn Ihre Anwendung OAuth 1.0 verwendet, müssen Sie auf OAuth 2.0 migrieren, da Ihre Anwendung sonst nicht mehr funktioniert .
Kiquenet

17

(Jun-Nov 2016) Die Frage und ihre Antworten sind jetzt veraltet als: 1) GData-APIs sind die vorherige Generation von Google-APIs. Obwohl nicht alle GData APIs veraltet sind, alle die neuesten Google - APIs Sie nicht verwenden das Google Data Protocol ; und 2) es gibt eine neue Google Sheets API v4 (auch nicht GData).

Von hier aus müssen Sie die Google APIs Client Library für .NET herunterladen und die neueste Sheets-API verwenden , die viel leistungsfähiger und flexibler ist als jede vorherige API. Hier ist ein C # -Codebeispiel , um Ihnen den Einstieg zu erleichtern. Überprüfen Sie auch die .NET-Referenzdokumente für die Sheets-API und das Entwicklerhandbuch für die .NET Google APIs-Clientbibliothek .

Wenn Sie nicht gegen Python allergisch sind (wenn ja, tun Sie einfach so, als wäre es ein Pseudocode;)), habe ich mehrere Videos mit etwas längeren, "realistischeren" Beispielen für die Verwendung der API erstellt, aus denen Sie lernen und auf Wunsch auf C # migrieren können ::


Können diese Tools auch für den Zugriff auf Microsoft Excel-Dateien verwendet werden?
Afr0

1
Leider stellen sowohl Microsoft als auch Google wettbewerbsfähige Produkte her, die nicht einem gemeinsamen Standard entsprechen. Daher müssen Sie Ihre eigenen Tools finden, um auf Excel-Dateien zugreifen zu können. Wenn Sie ein Python-Entwickler sind, besuchen Sie python-excel.org . Für andere Sprachen müssen Sie die jeweiligen Communitys durchsuchen. Alternativ können Sie Excel-Dateien (mithilfe der Drive-API) in Google importieren und dann mithilfe der Sheets-API die gewünschten Vorgänge ausführen. Google APIs unterstützen eine Vielzahl von Sprachen ... siehe developer.google.com/api-client-library
wescpy

3

Sie können das, was Sie verlangen, auf verschiedene Arten tun:

  1. Verwenden der Google-Tabellenkalkulations-C # -Bibliothek (wie in der Antwort von Tacoman667) zum Abrufen eines ListFeed, das eine Liste von Zeilen (ListEntry im Google-Sprachgebrauch) zurückgeben kann, von denen jede eine Liste von Name-Wert-Paaren enthält. Die Dokumentation zur Google-Tabellenkalkulations-API ( http://code.google.com/apis/spreadsheets/code.html ) enthält mehr als genug Informationen, um Ihnen den Einstieg zu erleichtern.

  2. Verwenden der Google-Visualisierungs-API, mit der Sie komplexere (fast wie SQL) Abfragen senden können, um nur die gewünschten Zeilen / Spalten abzurufen.

  3. Der Tabelleninhalt wird als Atom-Feeds zurückgegeben, sodass Sie XPath- oder SAX-Parsing verwenden können, um den Inhalt eines Listen-Feeds zu extrahieren. Ein Beispiel dafür finden Sie unter http://gqlx.twyst.co.za (in Java und Javascript, obwohl ich Angst habe) .


2

Ich bin mir ziemlich sicher, dass es dafür einige C # SDKs / Toolkits in Google Code geben wird. Ich habe dieses gefunden , aber es kann auch andere geben, also lohnt es sich, sich umzuschauen.




2

Die am besten bewertete Antwort von @Kelly ist nicht mehr gültig, wie @wescpy sagt. Nach dem 03.03.2020 funktioniert es jedoch überhaupt nicht mehr, da die verwendete Bibliothek verwendet wird Google Sheets v3 API.

Die Google Sheets v3-API wird am 3. März 2020 heruntergefahren

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

Dies wurde am 10.09.2019 von Google angekündigt:

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

Neues Codebeispiel für Google Sheets v4 API:

Gehe zu

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

und generieren credentials.json. Dann installierenGoogle.Apis.Sheets.v4 NuGet und probieren Sie das folgende Beispiel aus:

Beachten Sie, dass ich den Fehler Unable to parse range: Class Data!A2:Emit dem Beispielcode, aber mit meiner Tabelle erhalten habe. Der Wechsel zu Sheet1!A2:Efunktionierte jedoch, da mein Blatt so genannt wurde. Auch nur mit gearbeitet 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();
        }
    }
}

Wie komme ich darum, dass ich keine Client-ID / Geheimnisse und Bereiche angeben muss? Ich habe bereits den OAuth-Flow durchgeführt und habe ein Zugriffstoken und ein Aktualisierungstoken (denken Sie an den Offline-Modus), und ich möchte nichts von diesem zusätzlichen Mist. Ich habe keinen Zugriff auf die Client-ID und das Client-Geheimnis, da sie sich auf einem Oauth-Relay-Server befinden, auf den ich auch in Hintergrunddiensten keinen Zugriff habe.
Blake Niemyjski

@BlakeNiemyjski Verwenden Sie die Rest-API direkt unter folgendem Link: developer.google.com/sheets/api/reference/rest
Ogglas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.