Acessando planilhas do Google com C # usando API de dados do Google


104

Estou tendo algumas informações no Google Spreadsheets como uma única folha. Existe alguma maneira de ler essas informações do .NET, fornecendo as credenciais do Google e o endereço da planilha. É possível usar APIs de dados do Google. Em última análise, preciso obter as informações da planilha do Google em um DataTable. Como eu posso fazer isso? Se alguém tentou, pls compartilhe algumas informações.


Respostas:


176

De acordo com o guia do usuário .NET :

Faça download da biblioteca cliente .NET :

Adicione estes usando declarações:

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

Autenticar:

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

Obtenha uma lista de planilhas:

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

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

Dado um SpreadsheetEntry que você já recuperou, você pode obter uma lista de todas as planilhas nesta planilha da seguinte maneira:

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

E obtenha um feed baseado em células:

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
O que devo usar para o valor da string para o novo SpreadsheetsService (" exampleCo-exampleApp-1")? importa o que eu coloquei lá? Obrigado!
Ian Davis

Obtenha uma lista de planilhas: "SpreadsheetQuery query = new SpreadsheetQuery ();" deve ler "SpreadsheetFeed feed = myService.Query (query);" Tentei editar, mas não foram alterados caracteres suficientes!
SQLBobScot

5
developers.google.com/google-apps/spreadsheets/authorize Importante: OAuth 1.0 não é mais compatível e será desativado em 5 de maio de 2015. Se seu aplicativo usa OAuth 1.0, você deve migrar para o OAuth 2.0 ou seu aplicativo deixará de funcionar .
Kiquenet 14/07/2015

1
este link, de @wescpy abaixo, me ajudou a encontrar informações mais relevantes para meados de 2016: googleappsdeveloper.blogspot.com/2016/05/…
joon

Não funcionará após 03-03-2020, pois a biblioteca usada usa a API do Google Sheets v3 cloud.google.com/blog/products/g-suite/…
Ogglas

22

Eu escrevi um invólucro simples em torno da biblioteca de cliente .Net do Google , ele expõe uma interface semelhante a um banco de dados mais simples, com tipos de registro fortemente tipados. Aqui está um exemplo de código:

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

Há também um provedor LINQ que se traduz em operadores de consulta estruturada do Google :

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

@Kiquenet O que você quer dizer? A última versão que vejo de Google.GData. * É 2.2.0 nuget.org/packages/Google.GData.Documents
Mauricio Scheffer


@Kiquenet Avise-me quando o Google atualizar suas bibliotecas .NET. Mas acho que Google.GData. * 2.2.0 já usa API v3.
Mauricio Scheffer

developers.google.com/google-apps/spreadsheets/authorize Importante: OAuth 1.0 não é mais compatível e será desativado em 5 de maio de 2015. Se seu aplicativo usa OAuth 1.0, você deve migrar para o OAuth 2.0 ou seu aplicativo deixará de funcionar .
Kiquenet 14/07/2015

17

(Jun-Nov 2016) A pergunta e suas respostas agora estão desatualizadas como: 1) GData APIs são a geração anterior de APIs do Google. Embora nem todas as APIs GData tenham sido descontinuadas, todas as APIs do Google mais recentes não usam o protocolo de dados do Google ; e 2) há uma nova API do Planilhas Google v4 (também não GData).

Daqui para frente, você precisa obter a biblioteca cliente de APIs do Google para .NET e usar a API Sheets mais recente , que é muito mais poderosa e flexível do que qualquer API anterior. Aqui está um exemplo de código C # para ajudá-lo a começar. Verifique também os documentos de referência do .NET para a API Sheets e o guia para desenvolvedores da biblioteca cliente de APIs do .NET do Google .

Se você não é alérgico a Python (se for, finja que é um pseudocódigo;)), fiz vários vídeos com exemplos um pouco mais longos e "reais" do uso da API com a qual você pode aprender e migrar para C # se desejar :


essas ferramentas também podem ser usadas para acessar arquivos do Microsoft Excel?
afr0

1
Infelizmente, tanto a Microsoft quanto o Google estão fazendo produtos competitivos que não seguem um padrão comum, então você precisa encontrar suas próprias ferramentas para acessar os arquivos do Excel. Se você é um desenvolvedor Python, verifique python-excel.org . Para outros idiomas, você terá que pesquisar suas respectivas comunidades. Como alternativa, você pode importar arquivos do Excel para o Google (usando a API do Drive) e, a seguir, usar a API do Planilhas para realizar as operações que deseja. As APIs do Google suportam uma ampla variedade de idiomas ... consulte developers.google.com/api-client-library
wescpy

3

Você pode fazer o que está pedindo de várias maneiras:

  1. Usando a biblioteca C # da planilha do Google (como na resposta de Tacoman667) para buscar um ListFeed que pode retornar uma lista de linhas (ListEntry no jargão do Google), cada uma das quais tem uma lista de pares nome-valor. A documentação da API de planilhas do Google ( http://code.google.com/apis/spreadsheets/code.html ) contém informações mais do que suficientes para você começar.

  2. Usando a API de visualização do Google, que permite enviar consultas mais sofisticadas (quase como SQL) para buscar apenas as linhas / colunas de que você precisa.

  3. O conteúdo da planilha é retornado como feeds Atom para que você possa usar a análise XPath ou SAX para extrair o conteúdo de um feed de lista. Há um exemplo de como fazer dessa forma (em Java e Javascript, mas estou com medo) em http://gqlx.twyst.co.za .


2

Tenho certeza de que haverá alguns C # SDKs / kits de ferramentas no Google Code para isso. Eu encontrei este , mas pode haver outros, então vale a pena dar uma olhada.




2

A resposta mais votada por @Kelly não é mais válida, como diz @wescpy. No entanto, depois de 2020-03-03, ele não funcionará, já que a biblioteca usada usa Google Sheets v3 API.

A API do Google Sheets v3 será encerrada em 3 de março de 2020

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

Isso foi anunciado em 10/09/2019 pelo Google:

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

Novo exemplo de código para Google Sheets v4 API:

Vamos para

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

e gerar credentials.json. Em seguida, instale o Google.Apis.Sheets.v4NuGet e experimente o seguinte exemplo:

Observe que recebi o erro Unable to parse range: Class Data!A2:Ecom o código de exemplo, mas com minha planilha. Mudar para Sheet1!A2:Efuncionou, no entanto, desde que minha folha foi chamada assim. Também trabalhou apenas com 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();
        }
    }
}

Como posso evitar a necessidade de especificar ID / segredos de cliente e escopos? Eu já fiz o fluxo OAuth e tenho um token de acesso e um token de atualização (pense no modo offline) e não quero nada dessa porcaria extra. Não tenho acesso ao ID do cliente e ao segredo do cliente, pois eles estão em um servidor de retransmissão oauth, ao qual também não tenho acesso nos serviços de segundo plano.
Blake Niemyjski

@BlakeNiemyjski Use a API restante diretamente, link: developers.google.com/sheets/api/reference/rest
Ogglas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.