Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする(3)
この記事は賞味期限切れです。(更新から1年が経過しています)
前回までは Google APIs Client Library for PHP を使って直接Googleスプレッドシートにアクセスしていましたが、 今回は読み書きを簡略化できるクライアントライブラリを書いてみました。
書いてみたもの
mach3/google-spreadsheet.php @ GitHub
Google Spreadsheet Client for PHP. This requires “google/apiclient” package.
導入方法
Composer で導入出来ます。
{
"require": {
"mach3/google-spreadsheet": "*"
}
}
Composer を使わない場合は Github からソースをダウンロードしますが、 その場合は、google/google-api-php-client に依存していますのでそちらも一緒に導入します。
<?php
// Composer の場合
require "vendor/autoload.php";
// ソースを直接ダウンロードした場合
require "the/path/to/google/apiclient/src/Google/autoload.php";
require "the/path/to/google-spreadsheet/src/autoload.php";
使い方
今までの例と同様に鍵ファイルを使用して認証をしますので、 Google Developper Console で鍵ファイルを生成しておきましょう。
認証してスプレッドシートを開く
シートを開いた時点でシート内のデータは取得されています。 なお、シートの1行目はヘッダ行としてフィールド名を連ねるようにしてください。
// 鍵ファイルでクライアントを初期化
$client = Google_Spreadsheet::getClient("the/path/to/key.json");
// スプレッドシートのIDでファイルを取得
$file = $client->file("XXXxxxXXXXxxxXXXX");
// シートのタイトルでシートを取得
$sheet = $file->sheet("Sheet1");
var_dump($sheet->items);
条件で行を選択する
クロージャまたは配列で条件を指定してリストを取得します。
// クロージャ
$items = $sheet->select(function($row){
return $row["email"] === "foo@example.com";
});
// 配列
$items = $sheet->select(array(
"id" => 23
));
// 条件がない場合は全部返ってきます
$items = $sheet->select();
行を追加する
シートに新しい行を追加します。
$sheet->insert(array(
"name" => "Bob",
"age" => 23,
"email" => "bob@example.com"
));
セルの値を変更する
行番号と列番号(またはフィールド名)を指定して値を変更します。
// 8行目の"name"の値を"Tom"に変更します
$sheet->update(8, "name", "Tom");
// 8行目の2カラム目を"50"に変更します
$sheet->update(8, 2, 50);
キャッシュを保存する
サーバ上にファイルとしてキャッシュを保存する事ができます。
$client->config(array(
"cache" => true,
"cache_dir" => "cache",
"cache_expires" => 3600
));
データを最新の情報に更新する
// キャッシュを無視したい場合は引数にTRUEを渡します
$sheet->fetch(true);
どこで使えるのか
スプレッドシートをお手軽な簡易データベースとして使うことが出来ますが、 毎度リクエストを飛ばす関係でパフォーマンスはどうしても落ちてしまいます。 また、データを丸ごと引っ張って来ているので大きなデータを扱うのには全く適していません。
- サーバーの都合でデータベースが使用出来ない
- データベースを使うほどのものではない
- エクセルライクなインターフェースで簡単にコンテンツを更新したい!
といったようなニーズにお応えする物でしょうか。 簡単なアンケート集計等にも使えるかもしれませんね。
まとめ
スプレッドシートについてはひとまずこれでやりきった感がありますね。 もっと便利なAPIの使い方があるかもしれないので、 都度ライブラリは改善していきたいと思っています。
良い使い道がある事を祈って。
コメント
それから、シート内に空列がある場合にnoticeが出ることがわかったので、
見よう見まねで修正してみました!
プルリク出させていただきましたので、問題なさそうであればマージしていただけると幸いです!
ご報告いただいたnoticeのバグを修正いたしました。
最新版にてご確認いただければ幸いです。
https://github.com/mach3/google-spreadsheet.php/releases/tag/v0.1.3
なるほど、確かに日本語のキー名が通った時は「いけるのか!」と思いましたが、
そういう穴があるのであれば避けた方が良さそうですね。
ありがとうございました。
中黒の件については、GoogleのAPI側(というよりXMLの)制約でマルチバイト文字自体がキーとして想定されていないのだと思います。(中黒以外の文字でinsertできたのは逆に驚きでした)
insert時には <gsx:キー>値</gsx:キー> のようなXMLでリクエストを飛ばしていますので、XMLに則ったシングルバイトの文字で命名してやるのが賢明ですね。
insert()で行を追加する際、フィールド値として入力する連想配列のkeyに全角の「・」(中黒)が入っていると命令自体が無視されてしまうようです。
中黒を使わなければいいだけなので問題ないといえばないんですが、
文字コードとかの問題でしょうか…
原因調査してまいりますので今暫くお待ち下さい。
PHP7.0.6で、クライアントライブラリを使わせていただいているのですが、シート取得の際に以下のようなNoticeが出ます。
Notice: Undefined offset: 2 in 〜〜〜/mach3/google-spreadsheet/src/Google/Spreadsheet/Sheet.php on line 144
offsetが2からスプレッドシートの埋まっている行数になるまで複数回出ているので、フィールド名以外の取得のところで何か問題があるようです。
初心者なのでこれ以上はっきりしたことはわからなかったんですが、ライブラリ側の問題であれば解決策を教えていただけると幸いです。