【问题标题】:Google spreadsheets from appengine problems来自 appengine 问题的 Google 电子表格
【发布时间】:2013-07-12 06:44:05
【问题描述】:

我想从 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"
}

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

【问题讨论】:

  • OAuth 位是否有效?如果没有,请使用 DrEdit 教程让 OAuth 在 App Engine 上运行。之后查看 CellDemo.java 以了解如何使用 API。 (注意谷歌应用脚​​本是更简单的选项,而不是电子表格 API)
  • 我想这需要有人发布完整的解决方案。我有执行此操作的代码,但要花费我太多时间来提取所需的位并进行调试等。DrEdit 位非常大,需要进行一些更改。
  • @eddyparkinson 是的,oauth 正在工作。我发现了这个问题。我使用了错误的 feedurl。很快就会更新。

标签: java google-app-engine gdata gdata-api google-spreadsheet-api


【解决方案1】:

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

你应该替换这个:

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 Spreadsheets documentation

【讨论】:

  • 眼光不错,但这不是问题所在。我已经在我的代码中修复了这个问题......我的问题是电子表格提要网址
  • 我错过了那个 :-) 我编辑了我的答案(对于其他人,因为你显然不再需要它了)。
【解决方案2】:

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

1) Google 云端硬盘 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多