2

GData APIのC#実装のバージョン3を使用するすべてのスプレッドシートのリストを認証してフェッチできるプログラムがあります(ドキュメントにある例に従います)。私が理解するのに苦労しているのは、ドキュメントキーによって単一のリソースをフェッチする方法です。Google Documents List APIでドキュメントのリストを取得する例をたくさん見ることができ、正確な名前検索で特定のドキュメントをゼロにする方法を見ることができますが、スプレッドシートの名前が変更されても存続するコードを作成しようとしています。これまでに書いたコードは次のとおりです。

using System;
using Google.GData.Client;
using Google.GData.Spreadsheets;
using Microsoft.VisualBasic;

namespace q14201622
{
  class Program
  {
    static void Main(string[] args)
    {
      //OAuth 2 Stuff
      var parameters = new OAuth2Parameters() {
        ClientId = CLIENT_ID,
        ClientSecret = CLIENT_SECRET,
        RedirectUri = REDIRECT_URI,
        Scope = SCOPE
      };
      Process.Start(OAuthUtil.CreateOAuth2AuthorizationUrl(parameters));
      var response = Interaction.InputBox("Enter oAuth Code:", "q14201622", "", 0, 0);
      parameters.AccessCode = response;
      OAuthUtil.GetAccessToken(parameters);
      var accessToken = parameters.AccessToken;

      //Fetch Documents
      var requestFactory = new GOAuth2RequestFactory(null, "q14201622-v1", parameters);
      var service = new SpreadsheetsService("q14201622-v1");
      var query = new SpreadsheetQuery();
      query.Title = "Exact Title";
      query.Exact = true;

      //Iterate over the results
      var feed = service.Query(query);
      foreach (var entry in feed.Entries)
      {
        Console.WriteLine(entry.Id + ":"+ entry.Title.Text);
      }
    }
  }
}
4

2 に答える 2

2

私はこれをテストしませんでしたが、このhttps://developers.google.com/gdata/client-csによると、URLを使用して特定のエントリをリクエストできます。

FeedQuery singleQuery = new FeedQuery();
singleQuery.Uri = new Uri(newEntry.SelfUri.ToString()); 
AtomFeed newFeed = service.Query(singleQuery);
AtomEntry retrievedEntry = newFeed.Entries[0];    

これで、ドキュメントキーがあれば、簡単なURL(https://docs.google.com/spreadsheet/ccc?key=[ここにキーを挿入])も使用できます。

string docKey = "nice doc key";
string  gDocsURL = "https://docs.google.com/spreadsheet/ccc?key={0}";
string docURL = String.Format(gDocsURL,docKey);

その後

FeedQuery singleQuery = new FeedQuery();
singleQuery.Uri = new Uri(docURL); 
AtomFeed newFeed = service.Query(singleQuery);
AtomEntry retrievedEntry = newFeed.Entries[0];  

そして、ドキュメントを取得できるはずです。ドキュメントをHDDに保存する場合は、単に追加します

string docFormat ="xlsx";// or xls or csv or pdf etc.
string gDocsDownloadURL="https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key={0}&exportFormat={1}"
string downloadUrl = String.format(gDocsDownloadURL,docKey,docFormat);
Stream stream = service.Query(new Uri(downloadUrl));
于 2013-01-07T20:49:49.570 に答える
2

これをGoogle.Apis.Drive.v2クライアントライブラリのnugetパッケージバージョン1.9.2.1890に対してテストしました。ただし、注意すべき点の1つは、デベロッパーのアカウントをGoogle APIに登録し、ここにあるGoogleデベロッパーコンソールからアプリケーションのAPIアクセスとクレデンシャルを設定する必要があることです。

これをサービスアカウントに使用する場合、つまりユーザーに代わってファイルにアクセスするのではなく、自動化または内部ツールに使用する場合は、次のようなものを使用します。

(私が正しく覚えている場合でも、サービスアカウントは、サービスアカウントの承認されたアプリにアプリを追加するために、OAuthブラウザーポップアップを介した人間による1回限りのOAuth承認操作を必要とします)

private const string SERVICE_ACCOUNT_EMAIL = "YOUR_SERVICE_ACCOUNT_EMAIL_HERE"; //looks like XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX@developer.gserviceaccount.com;

static DriveService BuildServiceAccountService()
{
  var certificate = new X509Certificate2(PATH_TO_YOUR_X509_CERT,
      "notasecret", X509KeyStorageFlags.Exportable);
  var credential = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(SERVICE_ACCOUNT_EMAIL)
      {
          Scopes = new[] { DriveService.Scope.Drive },
          User = "ACTUAL_EMAIL_ADDRESS" // this should be the normal xxxxxx@gmail account that has the google drive files
      }.FromCertificate(certificate));

  // Create the service.
  var service = new DriveService(new BaseClientService.Initializer()
  {
      HttpClientInitializer = credential,
      ApplicationName = "Drive API Service Account Sample",
  });

  return service;
}

public static void DownloadSpreadsheetAsXlsx(string spreadsheetName, string filePath)
{
  var service = BuildServiceAccountService();
  var request = service.Files.List();
  request.Q = String.Format("title = '{0}'", spreadsheetName);
  var files = request.Execute();
  var file = files.Items.FirstOrDefault();

  var dlUrl = String.Format("https://docs.google.com/spreadsheets/d/{0}/export?format=xlsx&id={0}", file.Id);

  File.WriteAllBytes(filePath, service.HttpClient.GetByteArrayAsync(dlUrl).Result);
}

ユーザーに代わってファイルにアクセスするには、代わりに次のようなサービスを構築する必要があります。

static DriveService BuildUserAccountService(string userEmail)
{
  UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
  new ClientSecrets
  {
     ClientId = "YOUR_CLIENT_ID", // your client Id
     ClientSecret = "YOUR_CLIENT_SECRET", // Your client secret
  },
  new[] { DriveService.Scope.Drive },
  userEmail,
  CancellationToken.None).Result;

  // Create the service.
  var service = new DriveService(new BaseClientService.Initializer()
  {
      HttpClientInitializer = credential,
      ApplicationName = "Drive API User Account Sample",
  });

  return service;
}

後世のための古い回答(古いGoogle GData APIは非推奨になり、このポイントより下の値は関連しなくなり、機能することは期待できません):

ドキュメントキーの検索でも同じ問題が発生していました。私はAlternateUriでそれを見つけることになりました。これが私がしたことです(これはコンパイルされ、新しいプロジェクトで動作することが確認されており、NuGetでGData.Spreadsheetsを追加しています):

//Use your authentication method here:    
SpreadsheetsService service = new SpreadsheetsService("DownloadSpreadsheet");
service.setUserCredentials("your username", "your password");

SpreadsheetQuery query = new SpreadsheetQuery();
SpreadsheetFeed feed = service.Query(query);
SpreadsheetEntry fileEntry = feed.Entries.Cast<SpreadsheetEntry>().FirstOrDefault(entry => entry.Title.Text == "Name of spreadsheet");

//This is the good part
string key = fileEntry.AlternateUri.Content.Substring(fileEntry.AlternateUri.Content.IndexOf("?key="));
string dlUrl = "https://docs.google.com/feeds/download/spreadsheets/Export" + key + "&exportFormat=xlsx&format=xlsx";
Stream stream = service.Query(new Uri(dlUrl));
using (FileStream fstream = new FileStream("something.xlsx", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
{
    stream.CopyTo(fstream);
    fstream.Flush();
}

回線が原因で、これにはLINQ(.NET Framework 3.5以降)が必要です.Cast<SpreadsheetEntry>().FirstOrDefault()。これはLINQなしで実行できます。1行のコードを使用する代わりに、スプレッドシートを手動で列挙して、探しているものを見つける必要があります。私は、それが機能しないことを報告し始める前に、全員が知っていることを確認したかっただけです。

于 2013-06-18T00:17:19.950 に答える