連載
» 2010年02月24日 00時00分 公開

Spreadsheets Data APIを使うための基礎知識(2):APIでGoogleスプレッドシートの追加/更新/削除 (3/3)

[能登諭,株式会社トップゲート]
前のページへ 1|2|3       

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("行の更新が完了しました。");
    }
}
ListUpdate.java

 行を更新するには、更新対象の行に対応する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("行の削除が完了しました。");
    }
}
ListDelete.java

 「みかん」の行が削除されて、「バナナ」の行だけが残っていると思います。また、行を削除した場合は空行になるのではなく、削除した行が詰められます。そのため「バナナ」の行が3行目から2行目に移動しています。

図6 行の削除後 図6 行の削除後

 行を削除するには削除対象の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();
ListDelete.javaより抜粋

 行番号を利用して取得する場合にも、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行まとめ

 今回のポイントは、以下です。

  1. エントリー(ワークシートや行)を追加する際はSpreadsheetServiceのinsertメソッドを利用
  2. エントリーを更新する際はエントリーのupdateメソッドを、エントリーを削除する際はエントリーのdeleteメソッドを利用
  3. 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

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。