Mengakses Google Spreadsheets dengan C # menggunakan Google Data API


104

Saya memiliki beberapa informasi di Google Spreadsheets sebagai satu lembar. Apakah ada cara agar saya dapat membaca informasi ini dari .NET dengan memberikan kredensial Google dan alamat spreadsheet. Apakah mungkin menggunakan Google Data API. Akhirnya saya perlu mendapatkan informasi dari spreadsheet Google di DataTable. Bagaimana saya bisa melakukannya? Jika ada yang pernah mencobanya, tolong bagikan beberapa informasi.


Jawaban:


176

Menurut panduan pengguna .NET :

Unduh perpustakaan klien .NET :

Tambahkan ini menggunakan pernyataan:

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

Otentikasi:

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

Dapatkan daftar spreadsheet:

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

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

Dengan adanya SpreadsheetEntry yang telah Anda ambil, Anda bisa mendapatkan daftar dari semua lembar kerja dalam spreadsheet ini sebagai berikut:

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

Dan dapatkan pakan berbasis sel:

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
Apa yang harus saya gunakan untuk nilai string untuk SpreadsheetsService baru (" exampleCo-exampleApp-1")? apakah penting apa yang saya taruh di sana? Terima kasih!
Ian Davis

Dapatkan daftar spreadsheet: "SpreadsheetQuery query = new SpreadsheetQuery ();" harus membaca "Feed SpreadsheetFeed = myService.Query (query);" Mencoba mengedit tidak cukup banyak karakter yang diubah!
SQLBobScot

5
developers.google.com/google-apps/spreadsheets/authorize Penting: OAuth 1.0 tidak lagi didukung dan akan dinonaktifkan pada 5 Mei 2015. Jika aplikasi Anda menggunakan OAuth 1.0, Anda harus bermigrasi ke OAuth 2.0 atau aplikasi Anda akan berhenti berfungsi .
Kiquenet

1
tautan ini, dari @wescpy di bawah, membantu saya menemukan info yang lebih relevan untuk pertengahan 2016: googleappsdeveloper.blogspot.com/2016/05/…
joon

Tidak akan berfungsi setelah 2020-03-03 karena pustaka yang digunakan menggunakan Google Sheets v3 API cloud.google.com/blog/products/g-suite/…
Ogglas

22

Saya menulis pembungkus sederhana di sekitar pustaka klien .Net Google , itu memperlihatkan antarmuka seperti database yang lebih sederhana, dengan jenis catatan yang diketik dengan kuat. Berikut beberapa contoh kode:

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

Ada juga penyedia LINQ yang diterjemahkan menjadi google operator kueri terstruktur Google :

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

@Kiquen Apa maksudmu? Versi terakhir yang saya lihat dari Google.GData. * Adalah 2.2.0 nuget.org/packages/Google.GData.Documents
Mauricio Scheffer


@Kiquenet Beri tahu saya jika Google memperbarui pustaka .NET mereka. Namun menurut saya Google.GData. * 2.2.0 sudah menggunakan API v3.
Mauricio Scheffer

developers.google.com/google-apps/spreadsheets/authorize Penting: OAuth 1.0 tidak lagi didukung dan akan dinonaktifkan pada 5 Mei 2015. Jika aplikasi Anda menggunakan OAuth 1.0, Anda harus bermigrasi ke OAuth 2.0 atau aplikasi Anda akan berhenti berfungsi .
Kiquenet

17

(Jun-Nov 2016) Pertanyaan dan jawabannya sekarang sudah usang karena: 1) GData API adalah generasi Google API sebelumnya. Meskipun tidak semua API GData telah usang, semua API Google terbaru yang tidak menggunakan Google Data Protocol ; dan 2) ada Google Sheets API v4 baru (juga bukan GData).

Selanjutnya, Anda perlu mendapatkan Library Klien Google API untuk .NET dan menggunakan Sheets API terbaru , yang jauh lebih kuat dan fleksibel daripada API sebelumnya. Berikut adalah contoh kode C # untuk membantu Anda memulai. Periksa juga dokumen referensi .NET untuk Sheets API dan panduan pengembang Library Klien Google API .NET .

Jika Anda tidak alergi terhadap Python (jika ya, anggap saja itu pseudocode;)), saya membuat beberapa video dengan sedikit lebih lama, lebih banyak contoh "dunia nyata" tentang penggunaan API yang dapat Anda pelajari dan bermigrasi ke C # jika diinginkan :


Bisakah alat ini digunakan untuk mengakses file Microsoft Excel juga?
afr0

1
Sayangnya, baik Microsoft & Google membuat produk kompetitif yang tidak mengikuti standar umum, jadi Anda harus menemukan alat Anda sendiri untuk mengakses file Excel. Jika Anda seorang pengembang Python, lihat python-excel.org . Untuk bahasa lain, Anda harus mencari komunitasnya masing-masing. Atau, Anda dapat mengimpor file Excel ke Google (menggunakan Drive API), lalu menggunakan Sheets API untuk melakukan operasi yang Anda inginkan. Google API mendukung berbagai bahasa ... lihat developers.google.com/api-client-library
wescpy

3

Anda dapat melakukan apa yang Anda minta dengan beberapa cara:

  1. Menggunakan pustaka C # spreadsheet Google (seperti dalam jawaban Tacoman667) untuk mengambil ListFeed yang dapat mengembalikan daftar baris (ListEntry dalam bahasa Google) yang masing-masing memiliki daftar pasangan nama-nilai. Dokumentasi Google spreadsheet API ( http://code.google.com/apis/spreadsheets/code.html ) memiliki lebih dari cukup informasi untuk Anda mulai.

  2. Menggunakan API visualisasi Google yang memungkinkan Anda mengirimkan kueri yang lebih canggih (hampir seperti SQL) untuk mengambil hanya baris / kolom yang Anda butuhkan.

  3. Konten spreadsheet dikembalikan sebagai feed Atom sehingga Anda dapat menggunakan penguraian XPath atau SAX untuk mengekstrak konten dari feed daftar. Ada contoh melakukannya dengan cara ini (saya khawatir hanya di Java dan Javascript) di http://gqlx.twyst.co.za .


2

Saya cukup yakin akan ada beberapa C # SDK / toolkit di Google Code untuk ini. Saya menemukan yang ini , tetapi mungkin ada yang lain jadi ada baiknya untuk melihat-lihat.




2

Jawaban yang paling banyak mendapat suara positif dari @Koleksi tidak lagi valid seperti yang dikatakan @wescape. Namun setelah 2020-03-03 itu tidak akan berfungsi sama sekali karena pustaka yang digunakan digunakan Google Sheets v3 API.

Google Sheets v3 API akan ditutup pada 3 Maret 2020

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

Ini diumumkan pada 2019-09-10 oleh Google:

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

Contoh kode baru untuk Google Sheets v4 API:

Pergi ke

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

dan menghasilkan credentials.json. Kemudian instal Google.Apis.Sheets.v4NuGet dan coba contoh berikut:

Perhatikan bahwa saya mendapat kesalahan Unable to parse range: Class Data!A2:Edengan kode contoh tetapi dengan spreadsheet saya. Namun berubah menjadi Sheet1!A2:Ebekerja karena lembar saya dinamai itu. Juga bekerja dengan hanya 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();
        }
    }
}

Bagaimana cara agar saya tidak perlu menentukan id / rahasia dan cakupan klien? Saya telah melakukan aliran OAuth dan memiliki token akses dan token penyegaran (pikirkan mode offline) dan saya tidak ingin omong kosong tambahan ini. Saya tidak memiliki akses ke id klien dan rahasia klien karena mereka berada di server relai oauth yang juga tidak saya akses di layanan latar belakang.
Blake Niemyjski

@BlakeNiemyjski Gunakan API lainnya secara langsung, tautan: developers.google.com/sheets/api/reference/rest
Ogglas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.