Как получить общедоступные данные Google Spreadsheet с помощью библиотеки Java API Google Spreadsheet без аутентификации

-Что я хочу сделать

Я хотел бы получить данные из электронной таблицы Google, используя библиотеку Java API электронных таблиц 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") );
        }
    }
}

Таблица Google:

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

-Результат

Без аутентификации

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

С аутентификацией

content=[возраст: 23]    name=Таро 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
Пожалуйста, взгляните на ответ эвклиона. Это объясняет, почему коды в вопросе не работают. - 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