0

我想从 appengine 读取特定的 Google Drive 电子表格。正在使用来自网络客户端的 Google 选择器选择电子表格。我正在尝试使用按标题查询来访问电子表格。标题被传递给我的 appengine servlet,然后我使用 Gdata Java Client Lib 进行查询。

在 appengine 我有这个代码:

public static FeedURLFactory factory = FeedURLFactory.getDefault();
public static SpreadsheetService spreadsheetService= new SpreadsheetService("evermedcpr");

List scopes = Arrays.asList("https://spreadsheets.google.com/feeds"); 
AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService();
AppIdentityService.GetAccessTokenResult accessToken = appIdentity.getAccessToken(scopes);

Credential creds = new Credential(BearerToken.authorizationHeaderAccessMethod());         
creds.setAccessToken(accessToken.getAccessToken());

SpreadsheetService ss = new SpreadsheetService("DBM4G-demo"); 
ss.setOAuth2Credentials(creds);

getSpreadsheet(spreadsheetName);


public SpreadsheetEntry getSpreadsheet(String spreadsheet)
      throws Exception {

      SpreadsheetQuery spreadsheetQuery 
        = new SpreadsheetQuery(new URL("https://spreadsheets.google.com/feeds/"));
      spreadsheetQuery.setTitleQuery(spreadsheet);

      SpreadsheetFeed spreadsheetFeed = spreadsheetService.query(spreadsheetQuery, 
          SpreadsheetFeed.class);
      List<SpreadsheetEntry> spreadsheets = spreadsheetFeed.getEntries();
      if (spreadsheets.isEmpty()) {
        throw new Exception("No spreadsheets with that name");
      }

      return spreadsheets.get(0);
  }

}

我的日志中总是收到 404 响应:

com.google.api.client.googleapis.services.AbstractGoogleClient <init>: Application name is not set. Call Builder#setApplicationName.
W 2013-07-15 14:50:31.665
[s~evermedcpr/1.368807282351251748].<stderr>: An error occurred: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 OK
{
  "code" : 404,
  "errors" : [ {
    "domain" : "global",
    "message" : "Not Found",
    "reason" : "notFound"
  } ],
  "message" : "Not Found"
}

如何访问选定的电子表格?

4

2 回答 2

2

你定义了SpreadsheetService两次。一次spreadsheetService和一次ss。您只需将 OAuth2 凭据设置为ss,但spreadsheetService在您的getSpreadsheet方法中使用。

你应该替换这个:

SpreadsheetService ss = new SpreadsheetService("DBM4G-demo"); 
ss.setOAuth2Credentials(creds);

有了这个:

spreadsheetService.setOAuth2Credentials(creds);

您还可以使用两个不同的应用程序名称 -BM4G-demoevermedcpr. 我不确定哪个是正确的,但可能是evermedcpr根据服务器日志。

另一个问题是SpreadsheetQuery构造函数中的提要 URL。它应该是https://spreadsheets.google.com/feeds/spreadsheets(如果您想要所有电子表格)或https://spreadsheets.google.com/feeds/spreadsheets/private/full(如果您只想要私人电子表格)。有关提要 URL 的更多详细信息,请参阅Google 电子表格文档

于 2013-07-16T17:05:48.407 回答
1

App Engine + Google Spreadsheet API - 基本设置。

1)谷歌云端硬盘 OAuth

使用 DrEdit 教程启动并运行 OAuth。需要 OAuth 才能使用电子表格 API。

请注意,您需要向其添加刷新令牌。但这正如您所期望的那样有效。

2)电子表格 API

了解如何使用 Google 电子表格 API。查看 CellDemo.java(电子表格样式访问)和 ListDemo.java(SQL 数据库样式访问)

https://gdata-java-client.googlecode.com/svn-history/r51/trunk/java/sample/spreadsheet/cell/CellDemo.java

该代码有效,并且没有花费很长时间来启动和运行。还展示了如何按名称选择电子表格:

3) SpreadsheetService oauth 令牌

SpreadsheetService spreadsheetService = null;
spreadsheetService = new SpreadsheetService("mydomain.com.au-v0.2");
spreadsheetService.setHeader("Authorization", "Bearer " + accessToken);
spreadsheetService.setConnectTimeout(0); // optional
于 2013-07-18T06:59:35.330 回答