Google Data APIを使用してC#でGoogleスプレッドシートにアクセスする


104

Googleスプレッドシートにいくつかの情報が1つのシートとして含まれています。Googleの資格情報とスプレッドシートのアドレスを提供することで、.NETからこの情報を読み取る方法はありますか?Google Data APIを使用することは可能ですか?最終的には、DataTableのGoogleスプレッドシートから情報を取得する必要があります。どうすればできますか?誰かがそれを試みた場合、plsはいくつかの情報を共有します。


回答:


176

.NETユーザーガイドによると:

.NETクライアントライブラリをダウンロードします

次のusingステートメントを追加します。

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
new SpreadsheetsService( " exampleCo-exampleApp-1")の文字列値には何を使用すればよいですか?私がそこに入れたものは重要ですか?ありがとう!
Ian Davis

スプレッドシートのリストを取得する: "SpreadsheetQuery query = new SpreadsheetQuery();" "SpreadsheetFeed feed = myService.Query(query);"と読みます。変更された文字数が不足しているため、編集しようとしました!
SQLBobScot 2015年

5
developers.google.com/google-apps/spreadsheets/authorize 重要:OAuth 1.0はサポートされなくなり、2015年5月5日に無効になります。アプリケーションがOAuth 1.0を使用している場合、OAuth 2.0に移行する必要があります。そうしないと、アプリケーションは機能しなくなります。
Kiquenet

1
:以下@wescpyから、このリンクは、私は半ば2016年のためのより適切な情報を見つける助けgoogleappsdeveloper.blogspot.com/2016/05/...
ジュン

使用されているライブラリはGoogle Sheets v3 APIcloud.google.com/blog/products/g-suite/…を
Ogglas

22

私は、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("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);

googleの構造化クエリ演算子に変換するLINQプロバイダーもあります

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

@Kiquenetどういう意味ですか?私が見るGoogle.GData。*の最後のバージョンは2.2.0 nuget.org/packages/Google.GData.Documents
Mauricio Scheffer


@Kiquenet Googleが.NETライブラリを更新したときにお知らせください。しかし、Google.GData。* 2.2.0はすでにAPI v3を使用していると思います。
Mauricio Scheffer、2014

developers.google.com/google-apps/spreadsheets/authorize 重要:OAuth 1.0はサポートされなくなり、2015年5月5日に無効になります。アプリケーションがOAuth 1.0を使用している場合、OAuth 2.0に移行する必要があります。そうしないと、アプリケーションは機能しなくなります。
Kiquenet

17

(2016年11月11日)質問とその回答は次のように古くなっています。1)GData APIは前世代のGoogle APIです。すべてのGData APIが廃止されているわけでありませんが、最新のすべてのGoogle APIGoogle Data Protocolを使用しません。2)新しいGoogle Sheets API v4(GDataも含まない)があります。

ここから先は、.NET用のGoogle APIクライアントライブラリを入手して以前のどのAPIよりもはるかに強力で柔軟な最新のSheets APIを使用する必要があります。以下は、開始するのに役立つC#コードサンプルです。Sheets API.NETリファレンスドキュメント.NET Google APIクライアントライブラリ開発者ガイドも確認してください

Pythonにアレルギーがない場合は(疑似コードであると疑うだけです;))、いくつかのビデオを作成し、必要に応じて、C#に移行して学ぶことができる、APIの使用例を少し長く、より「現実的な」例にまとめました。 :


これらのツールは、Microsoft Excelファイルへのアクセスにも使用できますか?
afr0

1
残念ながら、MicrosoftとGoogleの両方が共通の標準に準拠していない競争力のある製品を作っているので、Excelファイルにアクセスするには独自のツールを見つける必要があります。あなたがPython開発者なら、python-excel.orgをチェックしてください。他の言語については、それぞれのコミュニティを検索する必要があります。または、Drive APIを使用してExcelファイルをGoogleにインポートし、Sheets APIを使用して必要な操作を実行することもできます。Google APIはさまざまな言語をサポートしています... developer.google.com/api-client-libraryを
wescpy

3

あなたはいくつかの方法であなたが求めていることをすることができます:

  1. GoogleのスプレッドシートC#ライブラリ(Tacoman667の回答のように)を使用して、それぞれが名前と値のペアのリストを持つ行のリスト(Google用語ではListEntry)を返すことができるListFeedをフェッチします。GoogleスプレッドシートAPI(http://code.google.com/apis/spreadsheets/code.html)のドキュメントには、始めるのに十分な情報が含まれています。

  2. より高度な(ほとんどSQLに似た)クエリを送信して必要な行/列のみをフェッチできるGoogle視覚化APIを使用します。

  3. スプレッドシートのコンテンツはAtomフィードとして返されるため、XPathまたはSAX解析を使用してリストフィードのコンテンツを抽出できます。http://gqlx.twyst.co.zaに、この方法で実行する例があります(私は怖いのですが、JavaとJavascriptのみです)。


2

これのためにGoogle CodeにいくつかのC#SDK /ツールキットがあると確信しています。私はこれを見つけましたが、他にもあるかもしれないので、見回る価値があります。




2

@Kellyからの最も投票された回答は、@ wescpyが言うように、もはや有効ではありません。ただし、2020-03-03以降は使用するライブラリが使用するため、まったく機能しませんGoogle Sheets v3 API

Google Sheets v3 APIは2020年3月3日に廃止されます

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

これはGoogleによって2019-09-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();
        }
    }
}

クライアントID /シークレットとスコープを指定する必要がないようにするにはどうすればよいですか?私はすでにOAuthフローを実行しており、アクセストークンと更新トークン(オフラインモードを考えてください)を持っているので、この余分ながらくたは不要です。クライアントIDとクライアントシークレットにはアクセスできません。バックグラウンドサービスではアクセスできないoauthリレーサーバー上にあるためです。
Blake Niemyjski

@BlakeNiemyjski残りのAPIを直接使用します。リンク:developer.google.com/sheets/api/reference/rest
Ogglas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.