// 検索対象のスプレッドシートを取得 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());
スプレッドシートに対して検索を行うためには、検索対象のスプレッドシートに対応するSpreadsheetEntryインスタンスを取得する必要があります。そこで「検索データ」というスプレッドシートの名前を使って、Spreadsheetサービスに対して検索を行い、「検索データ」スプレッドシートに対応するSpreadsheetEntryを取得しています。
スプレッドシートの名前による検索を行うには、SpreadsheetQueryとSpreadsheetService、SpreadsheetFeedの3つのインスタンスが必要です。
検索結果は1件とは限らないため、getEntriesメソッドの戻り値は、List型となっています。
なおFeedURLFactoryは、Spreadsheets Data API関連のURLを生成するユーティリティクラスです。
SpreadsheetEntryを取得する方法は、今回のようにスプレッドシートの名前を利用する方法のほかにも、スプレッドシートのkey(ID)を利用する方法があります。「検索データ」スプレッドシートのkeyは、Webブラウザのアドレスバーに表示されるURLのkeyパラメータの値です。よって、「検索データ」スプレッドシートのkeyは「0AvZ3QlJ_lblRdFpDSFF0NkkzdDg2X1FyUnM0MFFybmc」です。
このkeyを利用してSpreadsheetEntryを取得するコードは、以下の通りです。スプレッドシートの取得処理を、以下の内容に置き換えても動きます。なお、URLクラスはJava標準のjava.net.URLクラスのことです。
// keyを利用してスプレッドシートを取得 String key = "0AvZ3QlJ_lblRdFpDSFF0NkkzdDg2X1FyUnM0MFFybmc"; URL entryUrl = new URL("http://spreadsheets.google.com/feeds/spreadsheets/" + key); SpreadsheetEntry spreadsheetEntry = service.getEntry(entryUrl, SpreadsheetEntry.class);
また、上記のようなSpreadsheets Data APIのURLのフォーマットについては「Reference Guide - Google Spreadsheets APIs and Tools - Google Code」を参照してください。
最後に、スプレッドシートの名前による検索を利用する際の注意点としては、「スプレッドシートの名前を一意にする」という点が挙げられます。これは、Googleドキュメントでは同じ名前のドキュメントを複数作成できるためです。そのため、同じ名前のスプレッドシートが複数存在した場合、名前による検索では意図しないスプレッドシートを取得してしまう可能性があります。
// 検索対象のワークシートを取得 WorksheetEntry worksheetEntry = spreadsheetEntry.getDefaultWorksheet();
検索は、ワークシート単位で行います。そのため、検索対象となるワークシートに対応するWorksheetEntryを取得する必要があります。ワークシートの取得方法は、スプレッドシートの取得方法と同様に、名前やIDを利用する方法がありますが、そのほかにもデフォルトのワークシートを取得する方法があります。
今回は、検索対象となるスプレッドシートにワークシートが1つしか存在しないため、SpreadsheetEntryのgetDefaultWorksheetメソッドを利用してWorksheetEntryを取得しています。
なおSpreadsheetEntry自身は、ワークシートに関する情報を持っていないため、getDefaultWorksheetメソッド内でHTTPリクエストを発行し、Spreadsheetsサービスからスプレッドシートの情報を取得しています。
// ワークシート内を検索 ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl()); listQuery.setSpreadsheetQuery("名称 = りんご"); ListFeed listFeed = service.query(listQuery, ListFeed.class); ListEntry listEntry = listFeed.getEntries().get(0); CustomElementCollection elements = listEntry.getCustomElements(); System.out.println("名称:" + elements.getValue("名称")); System.out.println("数量:" + elements.getValue("数量")); System.out.println("価格:" + elements.getValue("価格"));
WorksheetEntryを取得できれば、後はSpreadsheetEntryを取得したときと同様の手順になります。
ListQueryを利用して検索パラメータを構築し、SpreadsheetServiceのqueryメソッドで検索クエリを発行し、ListFeed型で検索結果を受け取ります。ListFeedから取得できるListEntryは、ワークシート上の各行に対応するクラスです。getCustomElementsメソッドでCustomElementCollectionを取得し、そのオブジェクトのgetValueメソッドを利用することで、各行のカラム名に対応する値を取得できます。
ListQueryのsetSpreadsheetQueryメソッドにおいて指定可能な演算子は、以下の通りです。なお、値はURLエンコードが必要ですが、エンコード処理は各Queryクラスが内部的に行ってくれるため、利用者側でのエンコード処理は不要です。
例えば、setSpreadsheetQueryメソッドの中身を以下のように変更することで、りんごではなくバナナの行を取得できます。ちなみに、カラム名は比較演算子の左辺に記述してください。右辺にカラム名を書くと、com.google.gdata.util.InvalidEntryExceptionがthrowされます。
listQuery.setSpreadsheetQuery("数量 = 1 and 価格
いかがだったでしょうか。GData APIによるスプレッドシートの操作方法について、イメージをつかんでいただけたでしょうか。今回のポイントは、以下の3点です。
次回は、スプレッドシートの更新処理を紹介します。
@IT関連記事
XMLを取り込んだ最新Officeフォーマットとは
「Office 2007」よりファイル形式として使われている「Office Open XML」ファイルフォーマットについて、その成り立ちやOpenOfficeとの比較、標準化の流れ、仕様の概要、Excelを例にJavaでOfficeファイルのデータを操作する方法を紹介する特集企画
「Java Solution」フォーラム
Eclipse BIRTとスプレッドシートでBIレポーティング
帳票ベンダ・インタビュー(17) Eclipseのレポート生成エンジンであるBIRTやExcel互換のスプレッドシートデータなどを使った製品はデータ分析業務の“壁”を崩せるのか?
リッチクライアント & 帳票」フォーラム 2007/8/21
Curlによるオブジェクト指向開発と強力な標準クラス
Curlで始めるリッチクライアント(2) オブジェクト指向でコンポーネントの再利用化を実現。さらにRecordSetクラスを使って、Excel相当のスプレッドシートを表現してみよう
「Web Client & Report」フォーラム 2005/6/17
Delphi for PHPでExcel帳票を作ろう
Delphi for PHPを使い倒す!(後編) PHPExcelを使ってExcel帳票を出力させる。また、オブジェクトのシリアライズについても触れる
「Coding Edge」フォーラム 2009/11/25
Copyright © ITmedia, Inc. All Rights Reserved.