これを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行のコードを使用する代わりに、スプレッドシートを手動で列挙して、探しているものを見つける必要があります。私は、それが機能しないことを報告し始める前に、全員が知っていることを確認したかっただけです。