Accéder aux feuilles de calcul Google avec C # à l'aide de l'API Google Data


104

J'ai des informations dans Google Spreadsheets sous forme de feuille unique. Existe-t-il un moyen par lequel je peux lire ces informations à partir de .NET en fournissant les informations d'identification Google et l'adresse de la feuille de calcul. Est-il possible d'utiliser les API de données Google. En fin de compte, j'ai besoin d'obtenir les informations de la feuille de calcul Google dans un DataTable. Comment puis-je le faire? Si quelqu'un l'a tenté, veuillez partager certaines informations.


Réponses:


176

Selon le guide de l'utilisateur .NET :

Téléchargez la bibliothèque cliente .NET :

Ajoutez ces instructions using:

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

Authentifier:

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

Obtenez une liste de feuilles de calcul:

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

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

Étant donné un SpreadsheetEntry que vous avez déjà récupéré, vous pouvez obtenir une liste de toutes les feuilles de calcul de cette feuille de calcul comme suit:

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

Et obtenez un flux basé sur les cellules:

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
Que dois-je utiliser pour la valeur de chaîne pour le nouveau SpreadsheetsService (" exampleCo-exampleApp-1")? est-ce important ce que je mets là-dedans? Merci!
Ian Davis

Obtenez une liste de feuilles de calcul: "SpreadsheetQuery query = new SpreadsheetQuery ();" devrait lire "SpreadsheetFeed feed = myService.Query (query);" J'ai essayé de modifier pas assez de caractères modifiés!
SQLBobScot

5
developer.google.com/google-apps/spreadsheets/authorize Important: OAuth 1.0 n'est plus pris en charge et sera désactivé le 5 mai 2015. Si votre application utilise OAuth 1.0, vous devez migrer vers OAuth 2.0 ou votre application cessera de fonctionner .
Kiquenet le

1
ce lien, de @wescpy ci-dessous, m'a aidé à trouver des informations plus pertinentes pour la mi-2016: googleappsdeveloper.blogspot.com/2016/05/…
joon

Ne fonctionnera pas après le 03/03/2020, car la bibliothèque utilisée utilise l'API Google Sheets v3 cloud.google.com/blog/products/g-suite/…
Ogglas

22

J'ai écrit un simple wrapper autour de la bibliothèque cliente .Net de Google , il expose une interface plus simple semblable à une base de données, avec des types d'enregistrement fortement typés. Voici un exemple de code:

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

Il existe également un fournisseur LINQ qui se traduit par les opérateurs de requête structurés de Google :

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

@Kiquenet Que voulez-vous dire? La dernière version que je vois de Google.GData. * Est la 2.2.0 nuget.org/packages/Google.GData.Documents
Mauricio Scheffer


@Kiquenet Faites-moi savoir quand Google met à jour ses bibliothèques .NET. Mais je pense que Google.GData. * 2.2.0 utilise déjà l'API v3.
Mauricio Scheffer

developer.google.com/google-apps/spreadsheets/authorize Important: OAuth 1.0 n'est plus pris en charge et sera désactivé le 5 mai 2015. Si votre application utilise OAuth 1.0, vous devez migrer vers OAuth 2.0 ou votre application cessera de fonctionner .
Kiquenet le

17

(Juin-novembre 2016) La question et ses réponses sont désormais obsolètes car: 1) Les API GData sont la génération précédente d'API Google. Bien que toutes les API GData ont été désapprouvés, toutes les dernières API Google ne pas utiliser le protocole Google Data ; et 2) il existe une nouvelle API Google Sheets v4 (pas non plus GData).

À partir de là, vous devez obtenir la bibliothèque cliente des API Google pour .NET et utiliser la dernière API Sheets , qui est beaucoup plus puissante et flexible que n'importe quelle API précédente. Voici un exemple de code C # pour vous aider à démarrer. Consultez également la documentation de référence .NET pour l'API Sheets et le guide des développeurs de la bibliothèque cliente des API Google .NET .

Si vous n'êtes pas allergique à Python (si vous l'êtes, faites simplement comme si c'était un pseudocode;)), j'ai réalisé plusieurs vidéos avec des exemples légèrement plus longs et plus concrets d'utilisation de l'API dont vous pouvez apprendre et migrer vers C # si vous le souhaitez :


ces outils peuvent-ils également être utilisés pour accéder aux fichiers Microsoft Excel?
afr0

1
Malheureusement, Microsoft et Google fabriquent des produits compétitifs qui n'adhèrent pas à une norme commune, vous devez donc trouver vos propres outils pour accéder aux fichiers Excel. Si vous êtes un développeur Python, consultez python-excel.org . Pour les autres langues, vous devrez rechercher leurs communautés respectives. Vous pouvez également importer des fichiers Excel sur Google (à l'aide de l'API Drive), puis utiliser l'API Sheets pour effectuer les opérations que vous souhaitez. Les API Google prennent en charge une grande variété de langues ... voir developer.google.com/api-client-library
wescpy

3

Vous pouvez faire ce que vous demandez de plusieurs manières:

  1. Utilisation de la bibliothèque de feuilles de calcul C # de Google (comme dans la réponse de Tacoman667) pour récupérer un ListFeed qui peut renvoyer une liste de lignes (ListEntry dans le langage Google) dont chacune a une liste de paires nom-valeur. La documentation de l' API de feuille de calcul Google ( http://code.google.com/apis/spreadsheets/code.html ) contient plus que suffisamment d'informations pour vous aider à démarrer.

  2. Utilisation de l'API de visualisation Google qui vous permet de soumettre des requêtes plus sophistiquées (presque comme SQL) pour récupérer uniquement les lignes / colonnes dont vous avez besoin.

  3. Le contenu de la feuille de calcul est renvoyé sous forme de flux Atom afin que vous puissiez utiliser l'analyse XPath ou SAX pour extraire le contenu d'un flux de liste. Il y a un exemple de cette façon (en Java et Javascript seulement si j'en ai peur) sur http://gqlx.twyst.co.za .


2

Je suis presque sûr qu'il y aura des SDK / toolkits C # sur Google Code pour cela. J'ai trouvé celui-ci , mais il y en a peut-être d'autres, alors ça vaut le coup de le parcourir.




2

La réponse la plus votée de @Kelly n'est plus valide, comme le dit @wescpy. Cependant, après le 03/03/2020, cela ne fonctionnera pas du tout car la bibliothèque utilisée utilise Google Sheets v3 API.

L'API Google Sheets v3 sera fermée le 3 mars 2020

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

Cela a été annoncé le 10/09/2019 par Google:

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

Nouvel exemple de code pour Google Sheets v4 API:

Aller à

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

et générer credentials.json. Ensuite, installez Google.Apis.Sheets.v4NuGet et essayez l'exemple suivant:

Notez que j'ai eu l'erreur Unable to parse range: Class Data!A2:Eavec l'exemple de code mais avec ma feuille de calcul. Changer pour Sheet1!A2:Etravailler cependant puisque ma feuille a été nommée ainsi. Également travaillé avec seulement 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();
        }
    }
}

Comment éviter d'avoir à spécifier l'ID client / les secrets et les étendues? J'ai déjà fait le flux OAuth et j'ai un jeton d'accès et un jeton d'actualisation (pensez au mode hors ligne) et je ne veux pas de cette merde supplémentaire. Je n'ai pas accès à l'identifiant client et au secret client car ils sont sur un serveur relais oauth auquel je n'ai pas accès aux services d'arrière-plan.
Blake Niemyjski le

@BlakeNiemyjski Utilisez directement l'API rest, lien: developer.google.com/sheets/api/reference/rest
Ogglas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.