Google Spread SheetをPHP(ZendFramework)で読み込む

プログラムしたことをまとめておこう.
まず,Google Spread Sheetに関してですが,詳しいことはわかりませんw
簡単に,というか自分が把握している限りで言えば,オンラインで(ブラウザを通して)Excelのような物が使え,複数のユーザと共有できるものです.

んでもって,この情報をCSVファイル読むかのように取得したいにはどうしたらいいか.各言語でライブラリがあるようですが,PHPではZend Frameworkから,「Zend_Gdata_Spreadsheets」なるAPIが出ています.今回はこれを使って,簡単にスプレッドシートの取得を行ってみます.

【環境】Ubuntu 9.10 PHP 5.2.10-2 Zend Framework 1.9.4
(パスの設定等は省きます.)

スプレッドシートオブジェクトの準備


require_once 'Zend/Loader.php';

Zend_Loader::loadClass('Zend_Gdata_Docs');
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
$user = "test@gmail.com";
$pass = "password";

$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Spreadsheets($client);

細かい仕様等は調べていませんが,こんな感じ.


$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
ここでスプレッドシートの種類?を指定して器を生成している模様.
次の行で自分のユーザ名,パスワードを指定してクライアントの情報を取得します.
最後にこのクライアント情報を利用してスプレッドシートのオブジェクトを生成します.

ドキュメントのシート情報を取得する.

ドキュメントの情報体系は「フィード」をルート要素として,その下に複数の「エントリー」がぶら下がっている形になります.
エントリーとしては,シートであったり行データ,セルデータ等々が代表するところかと思います.それで,各エントリーのメソッドを利用してシートであればシート名,行データであればそこからセルデータへなどの情報へのアクセスを行います.

今回利用するシート.

2つのシート「profile」と「fruit」を用意しました.
このシート情報を取得するコードは次のとおり.


  $ssid = 'tfBsvHbpf1iuDZaZUlKMtKQ';
$docQuery = new Zend_Gdata_Spreadsheets_DocumentQuery();
$docQuery->setSpreadsheetKey($ssid);
$sheetFeed = $service->getWorksheetFeed($docQuery);
foreach($sheetFeed->entries as $sheetEntry) {
echo "Name:".$sheetEntry->getTitle()."<br>";
echo "ID:".$sheetEntry->getId()."<br>";
}
変数ssidには,スプレッドシートの「キー」を設定します.これはURL中のクエリ「key=」の値になります.
これをZend_Gdata_Spreadsheets_DocumentQueryのパラメータとしてセットします.
このオブジェクトにパラメータを指定することで,特定の情報(ここではssidのキー値を持つスプレッドシート)を取得します.
getWorksheetFeedによって,該当ドキュメントのシートのフィードが返されます.
後はforeachによって,シートの数分ループを繰り返し,情報を取得する.
ここではシートのタイトルと,シートのIDを取得しています.(このIDがどのように決まるかは不明.)
ここでIDの最後のスラッシュの後の文字列が,ドキュメントの各シートの固有IDとして利用することになります.

シートの行データを取得する.

シートの情報(ID)が分かったら,次はシートのデータを取得してみます.


$wid = 'od6';
$listQuery = new Zend_Gdata_Spreadsheets_ListQuery();
$listQuery->setSpreadsheetKey($ssid);
$listQuery->setWorksheetId($wid);
$listFeed = $service->getListFeed($listQuery);
foreach($listFeed as $rowData) {
$rowEntry = $rowData->getCustom();
foreach($rowEntry as $cellData) {
echo $cellData->getColumnName()."=".$cellData->getText().'<br>';
}
echo '<br>';
}
実行結果

行データの取得にはListQueryクラスを利用します.
これに先ほでのキーと,ワークシートのIDをセットして,getListFeedにて取得します.
実際の行データは一つ目の配列のループのgetCustomで取得し,2つ目のループで該当業の各カラム情報を首都良くしています.

特定の行を取得する

ここで,実用的な使い方として,条件で絞った行検索をしてみます.
といっても簡単で,上のコードでgetListFeedを行う前に以下のコードを入れてみます.


$listQuery->setSpreadSheetQuery('id > 1');
実行結果

idが1より大きい値のデータを取得してみました.

セルデータを取得してみる

セル情報は行からわざわざ取得しなくても,一気に取得することができます.


$cellQuery = new Zend_Gdata_Spreadsheets_CellQuery();
$cellQuery->setSpreadsheetKey($ssid);
$cellQuery->setWorksheetId($wid);
$cellFeed = $service->getCellFeed($cellQuery);
foreach($cellFeed as $cellEntry) {
$cellData = $cellEntry->getCell();
echo $cellData->getRow().','.$cellData->getColumn().','.$cellData->getText().'<br>';
}
先程のListQuery,ListFeedがCellQuery,CelFeedになったぐらいで,使い方は大きは変わりません.
実行結果

セルデータなので,項目カラムから取得しています.(行番号,カラム番号,値)

特定のセルデータを取得する.

行と同じように条件付きでセル情報を取得してみます.等号を使って取得することも可能ですが,今回は最大行と最大カラムを指定して取得してみます.


$cellQuery->setMinRow(2);
$cellQuery->setMaxRow(3);
$cellQuery->setMaxCol(2);
$cellFeed = $service->getCellFeed($cellQuery);
foreach($cellFeed as $cellEntry) {
$cellData = $cellEntry->getCell();
echo $cellData->getRow().','.$cellData->getColumn().','.$cellData->getText().'<br>';
}
行番号は1から始まるので,setMinRowで2行目から取得,setMaxRowで3行目まで取得,結果として2行分のデータを取得します.
カラムも2カラム目まで取得します.

実行結果

2,3行目と,2カラム目のnameまでのセルデータを取得しました.


参考サイト
http://framework.zend.com/manual/ja/zend.gdata.spreadsheets.html