Как да получите публични данни от Google Spreadsheet с помощта на Java библиотека на Google Spreadsheet API без удостоверяване

- какво искам да правя

Бих искал да получа данни от Google Spreadsheet с помощта на Java библиотеката на Google Spreadsheet API без удостоверяване. Електронната таблица на Google се публикува публично. Бих искал да използвам следния метод: com.google.gdata.data.spreadsheet.CustomElementCollection

-Проблем

CustomElementCollection връща събиране на данни с удостоверяване. Но CustomElementCollection връща нула без удостоверяване.

Тъй като 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") );
        }
    }
}

Google електронна таблица:

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

-Резултат

Без удостоверяване

content=[възраст: 23]    name=null възраст=null

С удостоверяване

content=[възраст: 23]    name=Taro age=23

Моля, дайте ми полезна информация, за да избегна проблема.


person user2128521    schedule 03.03.2013    source източник


Отговори (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.

person Michał Ziober    schedule 03.03.2013
comment
Благодаря ви за отделеното време и усилия! Ще опитам. - person user2128521; 04.03.2013
comment
Моля, погледнете отговора на euclio. Обяснява защо кодовете във въпроса не работят. - person xhe8; 18.02.2015
comment
моля, погледнете: stackoverflow.com/questions/58844821/ - person gstackoverflow; 14.11.2019

Вярвам, че проблемът е, че използвате проекцията "basic" за вашата електронна таблица. Ако използвате проекцията "values", всичко трябва да работи според очакванията.

person euclio    schedule 22.12.2014
comment
Това не дава отговор на въпроса. За да критикувате или поискате разяснение от автор, оставете коментар под неговата публикация - винаги можете да коментирате собствените си публикации и след като имате достатъчно репутация ще можете да коментирате всяка публикация. - person Sid M; 22.12.2014
comment
Какво имаш предвид? Приетият отговор със сигурност не отговаря на въпроса. Превключването от основната проекция към проекцията на стойностите коригира проблема. - person euclio; 28.12.2014
comment
Мисля, че това трябва да е правилният отговор. Тествал съм го. Приетият отговор донякъде работи, но не постига това, което първоначалният въпрос наистина иска. - person xhe8; 18.02.2015
comment
моля, погледнете: stackoverflow.com/questions/58844821/ - person gstackoverflow; 14.11.2019

И аз се чудех за това. Погледнах емисията, която идва (просто поставете URL адреса към листа в Chrome) и изглежда, че няма XML маркиране и всички идват под етикета ‹content›. Така че има смисъл анализаторът да обединява всичко в текстовото съдържание на BaseEntry (вместо да прави ListEntry).

person dunno    schedule 22.04.2013