如何在没有身份验证的情况下使用Google电子表格API Java库获取公共Google电子表格数据

如何在没有身份验证的情况下使用Google电子表格API Java库获取公共Google电子表格数据,java,google-sheets,google-spreadsheet-api,google-authentication,Java,Google Sheets,Google Spreadsheet Api,Google Authentication,-我想做什么 我想使用Google电子表格API Java库从Google电子表格中获取数据,无需验证。 谷歌电子表格是公开发布的。 我想使用以下方法: com.google.gdata.data.spreadsheet.CustomElementCollection -发行 CustomElementCollection返回使用身份验证收集数据。 但是CustomElementCollection在没有身份验证的情况下返回null 由于listEntry.getPlainTextContent

-我想做什么

我想使用Google电子表格API Java库从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") );
        }
    }
}
import java.net.URL;
导入java.util.List;
导入com.google.gdata.client.spreadsheet.ListQuery;
导入com.google.gdata.client.spreadsheet.spreadsheet服务;
导入com.google.gdata.data.spreadsheet.CustomElementCollection;
导入com.google.gdata.data.spreadsheet.ListEntry;
导入com.google.gdata.data.spreadsheet.ListFeed;
导入com.google.gdata.data.spreadsheet.spreadsheet条目;
导入com.google.gdata.data.spreadsheet.WorksheetEntry;
公共类身份验证{
公共静态void main(字符串[]args)引发异常{
字符串applicationName=“AppName”;
字符串user=args[0];
字符串传递=args[1];
字符串键=args[2];
字符串查询=args[3];
电子表格服务=新的电子表格服务(应用程序名称);
service.setUserCredentials(用户,通过);//设置客户端身份验证
URL entryUrl=新URL(“http://spreadsheets.google.com/feeds/spreadsheets/“+键);
SpreadsheetEntry SpreadsheetEntry=service.getEntry(entryUrl,SpreadsheetEntry.class);
WorksheetEntry WorksheetEntry=电子表格条目。getDefaultWorksheet();
ListQuery ListQuery=新建ListQuery(worksheetEntry.getListFeedUrl());
setSpreadsheetQuery(查询);
ListFeed ListFeed=service.query(listQuery,ListFeed.class);
List List=listFeed.getEntries();
用于(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.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") );
        }
    }
}
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") );
        }
    }
}
import java.net.URL;
导入java.util.List;
导入com.google.gdata.client.spreadsheet.FeedURLFactory;
导入com.google.gdata.client.spreadsheet.ListQuery;
导入com.google.gdata.client.spreadsheet.spreadsheet服务;
导入com.google.gdata.data.spreadsheet.CustomElementCollection;
导入com.google.gdata.data.spreadsheet.ListEntry;
导入com.google.gdata.data.spreadsheet.ListFeed;
导入com.google.gdata.data.spreadsheet.WorksheetEntry;
导入com.google.gdata.data.spreadsheet.WorksheetFeed;
公共类NoAuth{
公共静态void main(字符串[]args)引发异常{
字符串applicationName=“AppName”;
字符串键=args[0];
字符串查询=args[1];
电子表格服务=新的电子表格服务(应用程序名称);
URL URL=FeedURLFactory.getDefault().getWorksheetFeedUrl(键“public”、“basic”);
WorksheetFeed提要=service.getFeed(url,WorksheetFeed.class);
List worksheetList=feed.getEntries();
WorksheetEntry WorksheetEntry=工作表列表.get(0);
ListQuery ListQuery=新建ListQuery(worksheetEntry.getListFeedUrl());
setSpreadsheetQuery(查询);
ListFeed ListFeed=service.query(listQuery,ListFeed.class);
List List=listFeed.getEntries();
用于(ListEntry ListEntry:list)
{
System.out.println(“content=[“+listEntry.getPlainTextContent()+”]);
CustomElementCollection elements=listEntry.getCustomElements();
System.out.println(
“name=“+elements.getValue(“name”)+
“age=“+elements.getValue”(“age”);
}
}
}
谷歌电子表格:

-结果

未经认证

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

通过身份验证

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


请告诉我一些有用的信息,以避免出现此问题。

我不知道为什么它会这样工作,但如果您不使用凭据访问请求,则无法通过以下方式检索单元格:

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());
}

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

我也想知道这一点。我看了看输入的提要(只需将工作表的URL粘贴到Chrome中),似乎没有XML标记,并且都是在标记下输入的。因此,解析器将其全部集中到BaseEntry的文本内容中(而不是进行ListEntry)是有意义的。我认为问题在于,您在电子表格中使用的是
“basic”
投影。如果您使用
“values”
投影,一切都会按预期进行。

感谢您的时间和努力!我会试试的。请看一下尤克里奥的答案。它解释了问题中的代码不起作用的原因。请看一看:这并没有提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论-您可以随时对自己的帖子发表评论,一旦您有足够的评论,您就可以发表评论。您的意思是什么?公认的答案肯定不能回答这个问题。从基本投影转换到价值投影解决了这个问题。我认为这应该是正确的答案。我已经测试过了。公认的答案是可行的,但并没有达到原来的效果