การเข้าถึง Google Spreadsheets ด้วย C # โดยใช้ Google Data API


104

ฉันมีข้อมูลบางอย่างใน Google สเปรดชีตเป็นแผ่นเดียว มีวิธีใดบ้างที่ฉันสามารถอ่านข้อมูลนี้จาก. NET โดยการให้ข้อมูลรับรองของ Google และที่อยู่สเปรดชีต เป็นไปได้ไหมโดยใช้ Google Data API ในที่สุดฉันต้องการข้อมูลจาก Google สเปรดชีตใน DataTable ฉันจะทำมันได้อย่างไร? หากใครลองแล้วโปรดแบ่งปันข้อมูล


คำตอบ:


178

ตามคู่มือผู้ใช้. NET :

ดาวน์โหลดไลบรารีไคลเอ็นต์. NET :

เพิ่มสิ่งเหล่านี้โดยใช้คำสั่ง:

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

รับรองความถูกต้อง:

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

รับรายการสเปรดชีต:

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

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

เมื่อได้รับ SpreadsheetEntry ที่คุณได้รับมาแล้วคุณจะได้รับรายการเวิร์กชีตทั้งหมดในสเปรดชีตนี้ดังนี้:

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

และรับฟีดตามเซลล์:

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
ฉันควรใช้อะไรเป็นค่าสตริงสำหรับ SpreadsheetsService (" exampleCo-exampleApp-1") ใหม่ ฉันใส่อะไรลงไปในนั้นหรือเปล่า ขอบคุณ!
Ian Davis

รับรายการสเปรดชีต: "SpreadsheetQuery query = new SpreadsheetQuery ();" ควรอ่าน "SpreadsheetFeed feed = myService.Query (query);" พยายามแก้ไขเปลี่ยนอักขระไม่เพียงพอ!
SQLBobScot

5
Developers.google.com/google-apps/spreadsheets/authorize สิ่งสำคัญ: OAuth 1.0 ไม่ได้รับการสนับสนุนอีกต่อไปและจะปิดใช้งานในวันที่ 5 พฤษภาคม 2015 หากแอปพลิเคชันของคุณใช้ OAuth 1.0 คุณต้องย้ายไปที่ OAuth 2.0 มิฉะนั้นแอปพลิเคชันของคุณจะหยุดทำงาน .
Kiquenet

1
การเชื่อมโยงนี้จาก @wescpy ด้านล่างช่วยให้ฉันพบข้อมูลที่เกี่ยวข้องมากขึ้นสำหรับกลาง 2016 googleappsdeveloper.blogspot.com/2016/05/...
จุน

จะไม่ทำงานหลังจาก 2020/03/03 ตั้งแต่ห้องสมุดที่ใช้การใช้งาน Google ชี v3 API cloud.google.com/blog/products/g-suite/...
Ogglas

22

ฉันเขียน Wrapper แบบธรรมดารอบ ๆไลบรารีไคลเอนต์ . นี่คือโค้ดตัวอย่างบางส่วน:

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

นอกจากนี้ยังมีผู้ให้บริการ LINQ ที่แปลเป็นตัวดำเนินการสืบค้นที่มีโครงสร้างของ Google :

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

@Kiquenet คุณหมายถึงอะไร? Google
Mauricio Scheffer

Developers.google.com/google-apps/spreadsheets Versión 3.0 API (OAuth ฯลฯ )
Kiquenet

@Kiquenet แจ้งให้เราทราบเมื่อ Google อัปเดตไลบรารี. NET แต่ฉันคิดว่า Google.GData * 2.2.0 ใช้ API v3 แล้ว
Mauricio Scheffer

Developers.google.com/google-apps/spreadsheets/authorize สิ่งสำคัญ: OAuth 1.0 ไม่ได้รับการสนับสนุนอีกต่อไปและจะปิดใช้งานในวันที่ 5 พฤษภาคม 2015 หากแอปพลิเคชันของคุณใช้ OAuth 1.0 คุณต้องย้ายไปที่ OAuth 2.0 มิฉะนั้นแอปพลิเคชันของคุณจะหยุดทำงาน .
Kiquenet

17

(มิ.ย. - พ.ย. 2559)ขณะนี้คำถามและคำตอบไม่เป็นปัจจุบันดังนี้ 1) GData APIคือ Google API รุ่นก่อนหน้า ขณะที่ไม่ทั้งหมด APIs GData ได้รับการเลิกทั้งหมด APIs ล่าสุดของ Googleจะไม่ใช้ข้อมูลของ Google พิธีสาร ; และ 2) มีGoogle Sheets API v4 ใหม่ (ไม่ใช่ GData)

ต่อจากนี้คุณจะต้องได้รับไลบรารีไคลเอ็นต์ Google APIs สำหรับ. NETและใช้ชีต APIล่าสุดซึ่งมีประสิทธิภาพและยืดหยุ่นมากกว่า API ก่อนหน้านี้มาก นี่คือตัวอย่างรหัส C #เพื่อช่วยในการเริ่มต้น นอกจากนี้ยังตรวจสอบเอกสารอ้างอิง NET สำหรับแผ่น APIและคู่มือพัฒนาลูกค้าห้องสมุด .NET Google APIs

หากคุณไม่แพ้ Python (ถ้าคุณเป็นเช่นนั้นเพียงแค่แสร้งทำเป็นว่าเป็นรหัสเทียมเท่านั้น)) ฉันได้สร้างวิดีโอหลายรายการโดยมีตัวอย่าง "โลกแห่งความจริง" ที่ยาวขึ้นเล็กน้อยเกี่ยวกับการใช้ API ที่คุณสามารถเรียนรู้และย้ายไปยัง C # ได้หากต้องการ :


เครื่องมือเหล่านี้สามารถใช้ในการเข้าถึงไฟล์ Microsoft Excel ได้หรือไม่
afr0

1
น่าเสียดายที่ทั้ง Microsoft และ Google กำลังสร้างผลิตภัณฑ์ที่แข่งขันได้ซึ่งไม่เป็นไปตามมาตรฐานทั่วไปดังนั้นคุณต้องหาเครื่องมือของคุณเองเพื่อเข้าถึงไฟล์ Excel หากคุณเป็นนักพัฒนาหลามแล้วตรวจสอบpython-excel.org สำหรับภาษาอื่น ๆ คุณจะต้องค้นหาชุมชนนั้น ๆ หรือคุณสามารถนำเข้าไฟล์ Excel ไปยัง Google (โดยใช้ Drive API) จากนั้นใช้ชีต API เพื่อดำเนินการตามที่คุณต้องการ Google API รองรับภาษาที่หลากหลาย ... ดูdevelopers.google.com/api-client-library
wescpy

3

คุณสามารถทำสิ่งที่ต้องการได้หลายวิธี:

  1. การใช้สเปรดชีต C # ไลบรารีของ Google (เช่นเดียวกับคำตอบของ Tacoman667) เพื่อดึงข้อมูล ListFeed ซึ่งสามารถส่งคืนรายการของแถว (ListEntry ใน Google parlance) ซึ่งแต่ละรายการมีคู่ชื่อ - ค่า เอกสาร Google สเปรดชีต API ( http://code.google.com/apis/spreadsheets/code.html ) มีข้อมูลมากพอที่จะช่วยให้คุณเริ่มต้นได้

  2. การใช้ Google Visualization API ซึ่งช่วยให้คุณสามารถส่งคำค้นหาที่ซับซ้อนมากขึ้น (เกือบจะเหมือนกับ SQL) เพื่อดึงเฉพาะแถว / คอลัมน์ที่คุณต้องการ

  3. เนื้อหาสเปรดชีตจะถูกส่งคืนเป็นฟีด Atom ดังนั้นคุณสามารถใช้การแยกวิเคราะห์ XPath หรือ SAX เพื่อแยกเนื้อหาของฟีดรายการ มีตัวอย่างของการทำอย่างนี้ (ใน Java และ Javascript เพียง แต่ฉันกลัว) ที่เป็นhttp://gqlx.twyst.co.za



2

ฉันค่อนข้างมั่นใจว่าจะมี C # SDK / ชุดเครื่องมือใน Google Code สำหรับสิ่งนี้ ฉันพบสิ่งนี้แต่อาจมีคนอื่น ๆ ดังนั้นจึงควรค่าแก่การดูรอบ ๆ


2

http://code.google.com/apis/gdata/articles/dotnet_client_lib.html

สิ่งนี้ควรช่วยให้คุณเริ่มต้นได้ ฉันไม่ได้เล่นมันเมื่อเร็ว ๆ นี้ แต่ฉันดาวน์โหลดเวอร์ชันเก่ามากในขณะที่กลับมาและดูเหมือนว่าจะค่อนข้างมั่นคง สิ่งนี้ได้รับการอัปเดตเป็น Visual Studio 2008 เช่นกันดังนั้นโปรดดูเอกสาร!


2

คำตอบที่โหวตมากที่สุดจาก @Kelly ใช้ไม่ได้อีกต่อไปตามที่ @wescpy กล่าว อย่างไรก็ตามหลังจากที่ 2020/03/03 Google Sheets v3 APIมันจะไม่ทำงานเลยตั้งแต่ห้องสมุดที่ใช้การใช้งาน

Google Sheets v3 API จะปิดตัวลงในวันที่ 3 มีนาคม 2020

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

สิ่งนี้ประกาศเมื่อวันที่ 2019-09-10 โดย Google:

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

ตัวอย่างโค้ดใหม่สำหรับ Google Sheets v4 API :

ไปที่

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

credentials.jsonและสร้าง จากนั้นติดตั้งGoogle.Apis.Sheets.v4 NuGet และลองใช้ตัวอย่างต่อไปนี้:

โปรดทราบว่าฉันได้รับข้อผิดพลาดUnable to parse range: Class Data!A2:Eกับโค้ดตัวอย่าง แต่มีสเปรดชีตของฉัน Sheet1!A2:Eอย่างไรก็ตามการเปลี่ยนไปใช้งานได้เนื่องจากแผ่นงานของฉันมีชื่อว่านั้น 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();
        }
    }
}

ฉันจะไม่ต้องระบุรหัสลูกค้า / ความลับและขอบเขตได้อย่างไร ฉันได้ทำขั้นตอน OAuth ไปแล้วและมีโทเค็นการเข้าถึงและโทเค็นการรีเฟรช (คิดว่าเป็นโหมดออฟไลน์) และฉันไม่ต้องการอึเพิ่มเติมใด ๆ นี้ ฉันไม่สามารถเข้าถึงรหัสไคลเอ็นต์และรหัสลับไคลเอ็นต์เนื่องจากอยู่บนเซิร์ฟเวอร์รีเลย์ oauth ซึ่งฉันไม่สามารถเข้าถึงได้ในบริการเบื้องหลัง
Blake Niemyjski

@BlakeNiemyjski ใช้ API ที่เหลือโดยตรงลิงค์: developers.google.com/sheets/api/reference/rest
Ogglas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.