【问题标题】:How to get public Google Spreadsheet data using Google Spreadsheet API Java library without authentication如何使用 Google 电子表格 API Java 库未经身份验证获取公共 Google 电子表格数据
【发布时间】:2013-02-17 12:39:31
【问题描述】:

-我想做的事

我想使用 Google 电子表格 API Java 库从 Google 电子表格获取数据,而无需进行身份验证。 Google 电子表格公开发布。 我想使用以下方法: com.google.gdata.data.spreadsheet.CustomElementCollection

-问题

CustomElementCollection 返回通过身份验证收集数据。 但是 CustomElementCollection 未经身份验证返回 null。

由于 listEntry.getPlainTextContent() 显示数据,所以我认为我应该能够以任何方式获取数据。

-附上源码

有认证:Auth.java

import java.net.URL;
import java.util.List;
import com.google.gdata.client.spreadsheet.ListQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.CustomElementCollection;
import com.google.gdata.data.spreadsheet.ListEntry;
import com.google.gdata.data.spreadsheet.ListFeed;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetEntry;

public class Auth {
    public static void main(String[] args) throws Exception{
        String applicationName = "AppName";
        String user = args[0];
        String pass = args[1];
        String key = args[2];
        String query = args[3];

        SpreadsheetService service = new SpreadsheetService(applicationName);
        service.setUserCredentials(user, pass); //set client auth 

        URL entryUrl = new URL("http://spreadsheets.google.com/feeds/spreadsheets/" + key);
        SpreadsheetEntry spreadsheetEntry = service.getEntry(entryUrl, SpreadsheetEntry.class);
        WorksheetEntry worksheetEntry = spreadsheetEntry.getDefaultWorksheet();

        ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl());
        listQuery.setSpreadsheetQuery( query );

        ListFeed listFeed = service.query(listQuery, ListFeed.class);
        List<ListEntry> list = listFeed.getEntries();
        for( ListEntry listEntry : list )
        {
            System.out.println( "content=[" + listEntry.getPlainTextContent() + "]");
            CustomElementCollection elements = listEntry.getCustomElements();
            System.out.println(
                    " name=" + elements.getValue("name") + 
                    " age="  + elements.getValue("age") );
        }
    }
}

没有认证:NoAuth.java

import java.net.URL;
import java.util.List;
import com.google.gdata.client.spreadsheet.FeedURLFactory;
import com.google.gdata.client.spreadsheet.ListQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.CustomElementCollection;
import com.google.gdata.data.spreadsheet.ListEntry;
import com.google.gdata.data.spreadsheet.ListFeed;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetFeed;

public class NoAuth {
    public static void main(String[] args) throws Exception{
        String applicationName = "AppName";
        String key = args[0];
        String query = args[1];

        SpreadsheetService service = new SpreadsheetService(applicationName);

        URL url = FeedURLFactory.getDefault().getWorksheetFeedUrl(key, "public", "basic");

        WorksheetFeed feed = service.getFeed(url, WorksheetFeed.class);
        List<WorksheetEntry> worksheetList = feed.getEntries();
        WorksheetEntry worksheetEntry = worksheetList.get(0);

        ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl());
        listQuery.setSpreadsheetQuery( query );

        ListFeed listFeed = service.query( listQuery, ListFeed.class );
        List<ListEntry> list = listFeed.getEntries();
        for( ListEntry listEntry : list )
        {
            System.out.println( "content=[" + listEntry.getPlainTextContent() + "]");
            CustomElementCollection elements = listEntry.getCustomElements();
            System.out.println(
                    " name=" + elements.getValue("name") + 
                    " age="  + elements.getValue("age") );
        }
    }
}

谷歌电子表格:

https://docs.google.com/spreadsheet/pub?key=0Ajawooo6A9OldHV0VHYzVVhTZlB6SHRjbGc5MG1CakE&output=html

-结果

无需认证

  内容=[年龄:23​​] name=null 年龄=null

有认证

  内容=[年龄:23​​] 姓名=芋头年龄=23

请告诉我有用的信息以避免此问题。

【问题讨论】:

    标签: java google-sheets google-spreadsheet-api google-authentication


    【解决方案1】:

    我认为问题在于您正在为电子表格使用"basic" 投影。如果您使用"values" 投影,一切都应该按预期工作。

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • 什么意思?接受的答案当然不能回答这个问题。从基本投影切换到值投影可以解决问题。
    • 我认为这应该是正确的答案。我已经测试过了。接受的答案有点工作,但没有完成原始问题真正想要的。
    【解决方案2】:

    我也想知道这个。我查看了进来的提要(只需将工作表的 URL 粘贴到 Chrome 中),似乎没有 XML 标记,并且都在 标记下。因此,解析器将其全部集中到 BaseEntry 的文本内容中(而不是创建 ListEntry)是有道理的。

    【讨论】:

      【解决方案3】:

      我不知道为什么会这样,但是当您不使用凭据访问请求时,您无法通过以下方式检索单元格:

      CustomElementCollection elements = listEntry.getCustomElements();
      System.out.println(" name=" + elements.getValue("name") + " age="  + elements.getValue("age") );
      

      我已经测试过了,我发现只有这种方式来检索数据:

      List<ListEntry> list = listFeed.getEntries();
      for (ListEntry row : list) {
          System.out.println(row.getTitle().getPlainText() + "\t"
                  + row.getPlainTextContent());
      }
      

      打印出来:

      Taro    age: 23
      Hanako  age: 16
      

      如您所见,您应该从原始String 中解析文本并检索年龄。

      【讨论】:

      • 感谢您的时间和精力!我会试试的。
      • 请看一下euclio的回答。它解释了为什么问题中的代码不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2018-01-21
      相关资源
      最近更新 更多