Hatena::ブログ(Diary)

hya10の日記

2012-01-04

JavaからGoogle Spreadsheetを参照する

以下を参考にGoogle Spreadsheetのデータを参照してみた。(ほぼそのまま)

GData APIでGoogleスプレッドシートを参照するには(1/3)- @IT

Google Spreadsheet API入門 - にュウさいと


本当にそのままコピーして自分のusername/passwordを設定し実行したらエラーになった。

公開範囲の影響(?)なのか分らなかったので自分でデータを作った。

使用したデータはこれ。

https://docs.google.com/spreadsheet/ccc?key=0AkxY01rLRjOfdElOZ3B0YXhQZjk0QkpWYnlPQmNaRkE


SpreadsheetSearch.java

package sample;

import java.io.IOException;

import com.google.gdata.client.spreadsheet.FeedURLFactory;
import com.google.gdata.client.spreadsheet.ListQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetQuery;
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.SpreadsheetFeed;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.google.gdata.util.ServiceException;

public class SpreadsheetSearch {

    /**
     * @param args
     */
    public static void main(String[] args) throws IOException, ServiceException {
        // このアプリケーションの名称。任意の名前を設定
        String applicationName = "com-SpreadsheetSearch-1";
        // Google AppsもしくはGoogleアカウントのメールアドレスとパスワードを設定
        String username = "";
        String password = "";
        // Spreadsheetsサービスへの認証を行う
        SpreadsheetService service = new SpreadsheetService(applicationName);
        service.setUserCredentials(username, password);

        // 検索対象のスプレッドシートを取得
        FeedURLFactory urlFactory = FeedURLFactory.getDefault();
        SpreadsheetQuery spreadsheetQuery = new SpreadsheetQuery(urlFactory
                .getSpreadsheetsFeedUrl());
        spreadsheetQuery.setTitleQuery("検索データ"); // 検索対象のスプレッドシート名を指定している
        SpreadsheetFeed spreadsheetFeed = service.query(spreadsheetQuery,
                SpreadsheetFeed.class);
        SpreadsheetEntry spreadsheetEntry = spreadsheetFeed.getEntries().get(0);
        System.out.println("名前:" + spreadsheetEntry.getTitle().getPlainText());

        // 検索対象のワークシートを取得
        WorksheetEntry worksheetEntry = spreadsheetEntry.getDefaultWorksheet();

        // ワークシート内を検索
        ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl());
//        listQuery.setSpreadsheetQuery("HEADER1 = HEADER1-1"); エラーになる
//        listQuery.setSpreadsheetQuery("header1 = HEADER1-1"); エラーになる
        listQuery.setSpreadsheetQuery("header1 = \"HEADER1-1\""); // OK
//        listQuery.setSpreadsheetQuery("\"HEADER1\" = \"HEADER1-1\""); ダメでした
//        listQuery.setSpreadsheetQuery("\"header1-9\" = \"HEADER1-1\""); // OK
        ListFeed listFeed = service.query(listQuery, ListFeed.class);
        ListEntry listEntry = listFeed.getEntries().get(0);
        CustomElementCollection elements = listEntry.getCustomElements();
        System.out.println("HEADER1:" + elements.getValue("HEADER1"));
        System.out.println("HEADER2:" + elements.getValue("header2"));
        System.out.println("HEADER3:" + elements.getValue("header3"));
    }

}

実行結果

名前:検索データ
HEADER1:HEADER1-1
HEADER2:HEADER2-1
HEADER3:HEADER3-1

よくわからなかった点

(1)検索時はカラム部分に大文字が使えない?

Spreadsheet上ではカラムをHEADER1と記述しているのにsetSpreadsheetQueryの部分でHEADER1と記述するとエラーになる。

小文字でheader1と記述すると大丈夫だった。

そのわりにはgetValue("HEADER1")でちゃんと値がとれる。

名前:検索データ
Exception in thread "main" com.google.gdata.util.InvalidEntryException: Bad Request
Parse error: Invalid column name: HEADER1

    at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:594)
    at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:563)
    at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:552)
    at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:530)
    at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:535)
    at com.google.gdata.client.Service.getFeed(Service.java:1135)
    at com.google.gdata.client.Service.getFeed(Service.java:1077)
    at com.google.gdata.client.GoogleService.getFeed(GoogleService.java:662)
    at com.google.gdata.client.Service.query(Service.java:1237)
    at com.google.gdata.client.Service.query(Service.java:1178)
    at sample.SpreadsheetSearch.main(SpreadsheetSearch.java:48)

(2)setSpreadsheetQueryでハイフンを入れるとエラー

文字通りハイフンを入れて検索を行ったらエラーになった。

ただアンスコ(_)は大丈夫だった。

        // ワークシート内を検索
        ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl());
//        listQuery.setSpreadsheetQuery("HEADER1 = HEADER1-1"); //エラーになる
//        listQuery.setSpreadsheetQuery("header1 = HEADER1-1"); //エラーになる
        listQuery.setSpreadsheetQuery("header1 = \"HEADER1-1\""); // OK
//        listQuery.setSpreadsheetQuery("\"HEADER1\" = \"HEADER1-1\""); //ダメでした
//        listQuery.setSpreadsheetQuery("\"header1-9\" = \"HEADER1-1\""); // OK(header1-9というカラム名にした場合)
名前:検索データ
Exception in thread "main" com.google.gdata.util.InvalidEntryException: Bad Request
Parse error: null

    at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:594)
    at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:563)
    at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:552)
    at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:530)
    at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:535)
    at com.google.gdata.client.Service.getFeed(Service.java:1135)
    at com.google.gdata.client.Service.getFeed(Service.java:1077)
    at com.google.gdata.client.GoogleService.getFeed(GoogleService.java:662)
    at com.google.gdata.client.Service.query(Service.java:1237)
    at com.google.gdata.client.Service.query(Service.java:1178)
    at sample.SpreadsheetSearch.main(SpreadsheetSearch.java:50)

どうにかならないものかと適当に""でくくってみたら大丈夫だった。

ただカラム部分を大文字にして""でくくってみても駄目だった。

まとめ

  • 検索時はカラム部分を小文字にする。
  • ハイフンを使うときは""でくくる。

Groovy

参考にしました。

Java使いをGroovyに引き込むサンプル集 - No Programming, No Life

Eclipseで作成。

手順

01.Groovy Projectを作成(Google Spreadsheetを参照するにあたって必要なjarも設定する)

02.SpreadsheetSearch.groovyを作成

03.SpreadsheetSearch.javaのmainメソッドの中をコピー

04.SpreadsheetSearch.groovyのmainメソッドに3.でコピーしたコードを貼り付け

05.ctrl+shift+oでインポートの編成

ここまででひとまず動いた。*1

06.行末のセミコロンを削除

07.String等の型をdefに変更する

08.ctrl+shift+oでインポートの編成

09.インポートするクラスに別名をつける

10.別名をつけたクラスに変更する

11.ちょっと手を加える


SpreadsheetSearch.groovy(コメント部分は削除)

package sample

import com.google.gdata.client.spreadsheet.FeedURLFactory as FUF
import com.google.gdata.client.spreadsheet.ListQuery as LQ
import com.google.gdata.client.spreadsheet.SpreadsheetQuery as SQ
import com.google.gdata.client.spreadsheet.SpreadsheetService as SS
import com.google.gdata.data.spreadsheet.ListFeed as LF
import com.google.gdata.data.spreadsheet.SpreadsheetFeed as SF

class SpreadsheetSearch {

    static main(args) {
        def applicationName = "com-SpreadsheetSearch-1"
        def username = ""
        def password = ""

        def service = new SS(applicationName)
        service.setUserCredentials(username, password)

        def urlFactory = FUF.getDefault()
        def spreadsheetQuery = new SQ(urlFactory.getSpreadsheetsFeedUrl())
        spreadsheetQuery.setTitleQuery("検索データ")
        def spreadsheetFeed = service.query(spreadsheetQuery, SF.class)
        def spreadsheetEntry = spreadsheetFeed.getEntries().get(0)
        println "名前:${spreadsheetEntry.getTitle().getPlainText()}"

        def worksheetEntry = spreadsheetEntry.getDefaultWorksheet()

        def listQuery = new LQ(worksheetEntry.getListFeedUrl())
        listQuery.setSpreadsheetQuery("header1 = \"HEADER1-1\"")
        def listFeed = service.query(listQuery, LF.class)
        def listEntry = listFeed.getEntries().get(0)
        def elements = listEntry.getCustomElements()
        println "HEADER1:${elements.getValue("HEADER1")}"
        println "HEADER2:${elements.getValue("header2")}"
        println "HEADER3:${elements.getValue("header3")}"
    }

}

もっと簡単に書けると思うけど知っている知識ではここまで。

名前の付け方によるかもしれないが別名インポートを使うと分かりにくくなりそう。

*1:SpreadsheetSearch.java拡張子を.groovyに変更してGroovy Projectにつっこんでも動く。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hya10/20120104/1325659956