APIでGoogleスプレッドシートの追加/更新/削除:Spreadsheets Data APIを使うための基礎知識(2)(3/3 ページ)
SaaS形式のさまざまなGoogle Appsを操作するGData APIの1つ、Googleスプレッドシートを操作するSpreadsheets Data APIのJavaライブラリの使い方を基本から紹介する入門連載(編集部)
Spreadsheets Data APIで行単位でデータ更新するには
次は、行の更新です。サンプルの「ListUpdate.java」を実行すると、行の挿入で追加した「りんご」の行を以下のように更新できます。ListUpdate.javaをコピーして実行してください。
- 名称:りんご → みかん
- 数量:1 → 2
- 価格:100 → 120
package sample; import java.net.URL; import java.util.List; import com.google.gdata.client.spreadsheet.SpreadsheetService; 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 ListUpdate { public static void main(String[] args) throws Exception { // 操作対象のワークシートを取得 SpreadsheetService service = SpreadsheetUtil.getSpreadsheetService(); SpreadsheetEntry spreadsheetEntry = SpreadsheetUtil.findSpreadsheet( service, "行単位でのデータ操作"); WorksheetEntry worksheetEntry = spreadsheetEntry.getDefaultWorksheet(); // 全件取得 URL listFeedUrl = worksheetEntry.getListFeedUrl(); ListFeed listFeed = service.getFeed(listFeedUrl, ListFeed.class); List<ListEntry> entries = listFeed.getEntries(); // 1行目を更新 ListEntry listEntry = entries.get(0); listEntry.getCustomElements().setValueLocal("名称", "みかん"); listEntry.getCustomElements().setValueLocal("数量", "2"); listEntry.getCustomElements().setValueLocal("価格", "120"); listEntry.update(); System.out.println("行の更新が完了しました。"); } }
行を更新するには、更新対象の行に対応するListEntryを取得し、値を設定した後に、ListEntryのupdateメソッドを実行します。
Spreadsheets Data APIで行単位でデータ削除するには
最後に、行の削除です。サンプルの「ListDelete.java」を実行すると、先ほど更新した「みかん」の行を削除できます。ListDelete.javaをコピーして実行してください。
package sample; import java.util.List; import com.google.gdata.client.spreadsheet.ListQuery; import com.google.gdata.client.spreadsheet.SpreadsheetService; 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 ListDelete { public static void main(String[] args) throws Exception { // 操作対象のワークシートを取得 SpreadsheetService service = SpreadsheetUtil.getSpreadsheetService(); SpreadsheetEntry spreadsheetEntry = SpreadsheetUtil.findSpreadsheet( service, "行単位でのデータ操作"); WorksheetEntry worksheetEntry = spreadsheetEntry.getDefaultWorksheet(); // 行番号を利用して取得 ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl()); int rowCount = 1; // 行番号。ワークシート上の行番号 - 1(ヘッダ行) listQuery.setStartIndex(rowCount); // 取得開始番号 listQuery.setMaxResults(1); // 取得件数 ListFeed listFeed = service.query(listQuery, ListFeed.class); List<ListEntry> entries = listFeed.getEntries(); // 1行目を削除 ListEntry listEntry = entries.get(0); listEntry.delete(); System.out.println("行の削除が完了しました。"); } }
「みかん」の行が削除されて、「バナナ」の行だけが残っていると思います。また、行を削除した場合は空行になるのではなく、削除した行が詰められます。そのため「バナナ」の行が3行目から2行目に移動しています。
行を削除するには削除対象のListEntryを取得し、そのListEntryのdeleteメソッドを実行するだけです。
ListEntryを取得する3つの方法
ListEntryの取得方法を更新時(ListUpdate.java)と削除時(ListDelete.java)で変えています。これは、ListEntryの取得方法が何通りかあるので、その点について紹介したかったためです。ListEntryの取得方法は、以下の3通りの方法があります。
- 全件取得
- 検索キーワードによる取得
- 行番号による取得
全件取得はListUpdate.javaに書いてある方法です。SpreadsheetServiceのgetFeedメソッドを利用します。
検索キーワードによる取得は、前回紹介したListQueryのsetSpreadsheetQueryメソッドを利用する方法です。
ここでは、ListDelete.javaに書いてある行番号による取得方法の詳細について解説します。
// 行番号を利用して取得 ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl()); int rowCount = 1; // 行番号。ワークシート上の行番号 - 1(ヘッダ行) listQuery.setStartIndex(rowCount); // 取得開始番号 listQuery.setMaxResults(1); // 取得件数 ListFeed listFeed = service.query(listQuery, ListFeed.class); List<ListEntry> entries = listFeed.getEntries();
行番号を利用して取得する場合にも、ListQueryを利用します。ただし、利用するメソッドはsetStartIndexメソッドとsetMaxResultsメソッドです。setStartIndexメソッドは、ListEntryの取得開始行です。行単位で操作する場合、ワークシートの1行目はヘッダ行として扱われるため、setStartIndexメソッドの引数には「ワークシートの行番号 - 1」を指定します。
また開始インデックスは、0ではなく1からです。setMaxResultsメソッドは開始行からの取得件数です。ここでは「りんご」の行のみを更新対象としていたため「1」を指定しています。このようにsetStartIndexメソッドとsetMaxResultsメソッドを併用することで任意の行のみの取得もできますし、特定の範囲の行の取得もできます。
なお、setSpreadsheetQueryメソッドと setStartIndex、setMaxResultsメソッドは併用できます。そのため、例えば金額が1000以上の行のトップ10を検索するといった使い方ができます。
なお、startIndexおよびmaxResultsの詳細については「Spreadsheets query parameters reference」を、spreadsheetQuery(sq)については「List-feed query parameters」を参照してください。
少しだけ補足すると、startIndexおよびmaxResultsはGDataAPIで検索する際に共通的に利用できるオプションです。一方、spreadsheetQueryはSpreadsheets Data API 固有のオプションで、ほかのAPIでは利用できません。
コラム 「空行が入っているかも……」
行単位で検索する場合(ListFeedの場合)は先頭行から空行までを検索対象とします。そのため、ワークシートの途中に空行があると、そこから下の行は検索対象となりません。
もし、思い通りの検索結果が得られない場合は、誤って途中に空行を入れていないか確認してみてください。
今回の3行まとめ
今回のポイントは、以下です。
- エントリー(ワークシートや行)を追加する際はSpreadsheetServiceのinsertメソッドを利用
- エントリーを更新する際はエントリーのupdateメソッドを、エントリーを削除する際はエントリーのdeleteメソッドを利用
- QueryにはGDataAPI共通のオプションとSpreadsheets Data API 固有のオプションが存在
次回は、セル単位での更新処理や排他制御について紹介します。
@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.