10

-私がしたいこと

認証なしで 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") );
        }
    }
}

Google スプレッドシート:

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

-結果

認証なし

   content=[年齢: 23] name=null age=null

認証あり

   content=[年齢: 23] name=太郎 age=23

問題を回避するために役立つ情報を教えてください。

4

3 に答える 3

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

ご覧のとおり、テキストを解析し、rawから年齢を取得する必要がありますString

于 2013-03-03T10:42:20.637 に答える
2

問題は"basic"、スプレッドシートにプロジェクションを使用していることだと思います。プロジェクションを使用すると"values"、すべてが期待どおりに機能するはずです。

于 2014-12-22T07:15:52.690 に答える
0

私もこれについて疑問に思っていました。入ってくるフィードを調べました (シートの URL を Chrome に貼り付けるだけです)。XML マークアップがなく、すべて <content> タグの下に入っているようです。したがって、パーサーが (ListEntry を作成するのではなく) BaseEntry のテキスト コンテンツにすべてをまとめているのは理にかなっています。

于 2013-04-22T07:43:20.667 に答える