Google Data API kullanarak C # ile Google E-Tablolara erişim


104

Google E-Tablolarda bazı bilgileri tek bir sayfa halinde görüyorum. Google kimlik bilgilerini ve elektronik tablo adresini sağlayarak bu bilgileri .NET'ten okuyabilmemin herhangi bir yolu var mı? Google Veri API'larını kullanmak mümkün mü? Nihayetinde bir DataTable'da Google elektronik tablosundaki bilgileri almam gerekiyor. Nasıl yapabilirim? Herhangi biri denediyse, lütfen bazı bilgileri paylaşın.


Yanıtlar:


176

Göre .NET kullanıcı kılavuzunda :

.NET istemci kitaplığını indirin :

Bunları kullanarak ifadeleri ekleyin:

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

Doğrula:

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

Elektronik tabloların bir listesini alın:

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

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

Zaten aldığınız bir Elektronik Tablo Girişine göre, bu elektronik tablodaki tüm çalışma sayfalarının bir listesini aşağıdaki gibi alabilirsiniz:

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

Ve hücreye dayalı bir besleme alın:

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
Yeni SpreadsheetsService (" exampleCo-exampleApp-1") için dize değeri olarak ne kullanmalıyım ? oraya ne koyduğum önemli mi? Teşekkürler!
Ian Davis

Elektronik tabloların bir listesini alın: "SpreadsheetQuery query = new SpreadsheetQuery ();" "SpreadsheetFeed feed = myService.Query (sorgu);" şeklinde olmalıdır Yeterli sayıda karakter değiştirilmedi!
SQLBobScot

5
Developers.google.com/google-apps/spreadsheets/authorize Önemli: OAuth 1.0 artık desteklenmiyor ve 5 Mayıs 2015'te devre dışı bırakılacak. Uygulamanız OAuth 1.0 kullanıyorsa, OAuth 2.0'a geçiş yapmanız gerekir, aksi takdirde uygulamanız çalışmayı durdurur .
Kiquenet

1
Aşağıdaki @wescpy'deki bu bağlantı, 2016 ortası için daha alakalı bilgiler bulmama yardımcı oldu: googleappsdeveloper.blogspot.com/2016/05/…
joon

Kullanılan kitaplık Google E-Tablolar v3 API cloud.google.com/blog/products/g-suite/…
Ogglas

22

Google'ın .Net istemci kitaplığının etrafına basit bir sarmalayıcı yazdım , kesin olarak yazılmış kayıt türleri ile daha basit bir veritabanı benzeri arayüz ortaya koyuyor. İşte bazı örnek kodlar:

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

Ayrıca, Google'ın yapılandırılmış sorgu operatörlerine çeviren bir LINQ sağlayıcısı da vardır :

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

@Kiquenet Ne demek istiyorsun? Google.GData
Mauricio Scheffer


@Kiquenet Google, .NET kitaplıklarını güncellediğinde bana haber ver. Ancak Google.GData. * 2.2.0'ın zaten API v3'ü kullandığını düşünüyorum.
Mauricio Scheffer

Developers.google.com/google-apps/spreadsheets/authorize Önemli: OAuth 1.0 artık desteklenmiyor ve 5 Mayıs 2015'te devre dışı bırakılacak. Uygulamanız OAuth 1.0 kullanıyorsa, OAuth 2.0'a geçiş yapmanız gerekir, aksi takdirde uygulamanız çalışmayı durdurur .
Kiquenet

17

(Haziran-Kasım 2016) Soru ve yanıtları artık güncel değil, çünkü: 1) GData API'leri önceki nesil Google API'leridir. Tüm GVeri API'leri kaldırılmış olsa da, tüm son Google API'leri do not kullanmak Google Veri Protokolü ; ve 2) yeni bir Google E-Tablolar API v4 (ayrıca GData değil) var.

Buradan sonra, .NET için Google API'leri İstemci Kitaplığı'nı edinmeniz ve önceki herhangi bir API'den çok daha güçlü ve esnek olan en yeni E-Tablolar API'sini kullanmanız gerekir . İşte başlamanıza yardımcı olacak bir C # kodu örneği . Ayrıca E-Tablolar API'si için .NET referans belgelerine ve .NET Google API'leri İstemci Kitaplığı geliştiriciler kılavuzuna bakın .

Python'a alerjiniz yoksa (öyleyse, sahte kod olduğunu varsayalım;), API'yi kullanmanın biraz daha uzun, daha "gerçek dünyadan" örnekleriyle birkaç video hazırladım ve isterseniz C #'dan öğrenebilir ve C #'a geçebilirsiniz. :


bu araçlar Microsoft Excel dosyalarına erişmek için de kullanılabilir mi?
afr0

1
Ne yazık ki, hem Microsoft hem de Google ortak bir standarda uymayan rakip ürünler üretiyor, bu nedenle Excel dosyalarına erişmek için kendi araçlarınızı bulmanız gerekiyor. Bir Python geliştiricisiyseniz, python- excel.org'a bakın . Diğer diller için, kendi topluluklarında arama yapmanız gerekir. Alternatif olarak, Excel dosyalarını Google'a aktarabilir (Drive API'sını kullanarak), ardından istediğiniz işlemleri gerçekleştirmek için E-Tablolar API'sını kullanabilirsiniz. Google API'leri çok çeşitli dilleri destekler ... bkz. Developer.google.com/api-client-library
wescpy

3

İstediğinizi birkaç şekilde yapabilirsiniz:

  1. Google'ın elektronik tablo C # kitaplığını (Tacoman667'nin cevabında olduğu gibi), her biri ad-değer çiftlerinin bir listesine sahip olan bir satır listesi (Google sözlüğünde ListEntry) döndürebilen bir ListFeed getirmek için kullanmak. Google elektronik tablo API'si ( http://code.google.com/apis/spreadsheets/code.html ) dokümantasyonu, başlamanıza yardımcı olmak için fazlasıyla yeterli bilgiye sahiptir.

  2. Yalnızca ihtiyaç duyduğunuz satırları / sütunları getirmek için daha karmaşık (neredeyse SQL gibi) sorgular göndermenize olanak tanıyan Google görselleştirme API'sini kullanma.

  3. Elektronik tablo içerikleri Atom beslemeleri olarak döndürülür, böylece bir liste beslemesinin içeriğini çıkarmak için XPath veya SAX ayrıştırmasını kullanabilirsiniz. Http://gqlx.twyst.co.za adresinde bunu bu şekilde yapmanın bir örneği var (sadece Java ve Javascript'te korktuğum halde) .


2

Bunun için Google Code'da bazı C # SDK'lar / araç setleri olacağından oldukça eminim. Bunu buldum , ama başkaları da olabilir, bu yüzden etrafa göz atmaya değer.




2

@Kelly'den en çok oy alan cevap, @wescpy'nin dediği gibi artık geçerli değil. Ancak 2020-03-03'ten sonra kullanılan kütüphane kullanıldığı için hiç çalışmayacaktır Google Sheets v3 API.

Google E-Tablolar v3 API, 3 Mart 2020'de kapatılacak

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

Bu, Google tarafından 2019-09-10 tarihinde duyuruldu:

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

Şunun için yeni kod örneği Google Sheets v4 API:

Git

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

ve üretin credentials.json. Ardından Google.Apis.Sheets.v4NuGet'i yükleyin ve aşağıdaki örneği deneyin:

Hatayı Unable to parse range: Class Data!A2:Eörnek kodda ancak elektronik tablomda aldığımı unutmayın . İçin değiştirme Sheet1!A2:EBenim sayfanın söz konusu seçildi beri Ancak çalıştı. Ayrıca sadece çalıştı 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();
        }
    }
}

İstemci kimliği / sırları ve kapsamları belirtmek zorunda kalmadan nasıl başa çıkabilirim? OAuth akışını zaten yaptım ve bir erişim belirteci ve yenileme belirtecim var (çevrimdışı modu düşünün) ve bu fazladan saçmalıkların hiçbirini istemiyorum. Arka plan hizmetlerinde de erişimim olmayan bir oauth aktarma sunucusunda oldukları için istemci kimliğine ve istemci sırrına erişimim yok.
Blake Niemyjski

@BlakeNiemyjski Geri kalan API'yi doğrudan kullanın, bağlantı: developers.google.com/sheets/api/reference/rest
Ogglas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.