使用 Google Data API 通过 C# 访问 Google 电子表格

问题描述 投票:0回答:9

我在 Google 电子表格中将一些信息作为一张表保存。 有什么方法可以通过提供 google 凭据和电子表格地址来从 .NET 读取此信息。是否可以使用 Google Data API。 最终我需要从数据表中的 Google 电子表格中获取信息。 我该怎么做?如果有人尝试过,请分享一些信息。

c# google-sheets google-api-dotnet-client google-data-api google-sheets-api
9个回答
186
投票

根据 .NET 用户指南

下载 .NET 客户端库:

添加这些 using 语句:

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

验证:

SpreadsheetsService myService = new SpreadsheetsService("exampleCo-exampleApp-1");
myService.setUserCredentials("[email protected]", "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);
}

23
投票

我围绕 Google 的 .Net 客户端库编写了一个简单的包装器,它公开了一个更简单的类似数据库的接口,具有强类型记录类型。这是一些示例代码:

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("[email protected]", "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;

23
投票

(2016 年 6 月至 11 月) 该问题及其答案现已过时,因为:1) GData API 是上一代 Google API。虽然并非所有 GData API 均已弃用,但所有最新的 Google API 使用 Google 数据协议; 2) 有一个新的 Google Sheets API v4(也不是 GData)。

从这里开始,您需要获取 .NET 的 Google API 客户端库并使用最新的 Sheets API,它比以前的任何 API 都更强大、更灵活。这是一个 C# 代码示例,可帮助您入门。另请查看 .NET Sheets API 参考文档.NET Google API 客户端库开发人员指南

如果您对 Python 不过敏(如果您过敏,请假装它是伪代码;)),我制作了几个视频,其中包含稍长、更“真实”的 API 使用示例,您可以从中学习并迁移到 C#,如果想要的:


4
投票

Marcos Placona 于 2017 年 3 月 24 日创建的这个 Twilio 博客页面可能会有所帮助。

Google 电子表格和 .NET Core

它引用了 Google.Api.Sheets.v4OAuth2


4
投票

@Kelly 得到最多支持的答案不再有效,正如 @wescpy 所说。然而,在 2020 年 3 月 3 日之后,它将根本无法工作,因为所使用的库使用了

Google Sheets v3 API

Google Sheets v3 API 将于 2020 年 3 月 3 日关闭

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

Google 于 2019 年 9 月 10 日宣布:

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

3
投票

您可以通过多种方式完成您所要求的事情:

  1. 使用 Google 的电子表格 C# 库(如 Tacoman667 的答案)获取 ListFeed,它可以返回行列表(Google 术语中的 ListEntry),每行都有一个名称-值对列表。 Google 电子表格 API (http://code.google.com/apis/spreadsheets/code.html) 文档包含足够的信息来帮助您入门。

  2. 使用 Google 可视化 API,您可以提交更复杂的(几乎像 SQL)查询来仅获取您需要的行/列。

  3. 电子表格内容作为 Atom feed 返回,因此您可以使用 XPath 或 SAX 解析来提取列表 feed 的内容。在 http://gqlx.twyst.co.za.

  4. 有一个这样做的示例(尽管我担心,仅在 Java 和 Javascript 中)

2
投票

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

这应该可以帮助您开始。我最近没有玩过它,但不久前我下载了一个非常旧的版本,它看起来相当可靠。这个也更新到了 Visual Studio 2008,所以请查看文档!


1
投票

我很确定 Google Code 上会有一些 C# SDK/工具包用于此目的。我找到了这个,但可能还有其他的,所以值得浏览一下。


0
投票

我觉得使用 Google AppScript 编写 Webhook 并使用它获取和设置数据是个好主意。 试试这个帮助https://www.youtube.com/watch?v=occ4CC3Fo3s

© www.soinside.com 2019 - 2024. All rights reserved.