Googleスプレッドシートを簡易DBとして利用する - PHP+Ajax編
この記事は賞味期限切れです。(更新から1年が経過しています)
このお題は以前にも何度か関連記事を書いていますが、 いずれの方法もパフォーマンスがあまり良くなかったり、安定性に問題があるなどしました。 今回はその辺を解決する為のライブラリを考えてみるお話です。
- やりたい事
- 書いてみたもの
- 基本的な使い方
- Ajaxで利用する
- JSONPで利用する
- その他オプション・機能など
- 必ず気をつけなければならないこと
- まとめ : Googleスプレッドシートの活用について
「新しくなったスプレッドシートと簡易データベース化」でGhostsheetが使えなくなったと書きましたが、新スプレッドシートでもAPIが整備された様で、2014年11月20日現在では正常に動作する事を確認しています。但し、スクリーンショット類は古い物なのでご注意ください。(スプレッドシートIDの取得はURLを参照されるのが良いでしょう)
やりたい事
- Googleスプレッドシートからデータを利用して展開したい
- データは分かりやすい形に加工しておきたい
- 直接JSONで読めるけど、毎回読みに行くのは非効率なのでなんとかしたい
- スプレッドシートがメンテ中の時も対応したい
つまり、サーバ上に加工したデータをキャッシュとして保存しておけば良いわけですね。
書いてみたもの
Ghostsheet by mach3
今回はPHPで書いてみました。こんな感じにはたらきます。
- 渡されたIDを頼りにスプレッドシートをJSONで読み込んできます
- 加工したデータをキャッシュに保存し、返します
- 二回目以降のリクエストは、キャッシュの期限内であればキャッシュから返します
- キャッシュが期限切れならば再度リモートから読み込んできます
基本的な使い方
1. スプレッドシートを作る
Googleドライブ で、簡易DBにするスプレッドシートを作成します。 一行目はフィールドのキーで構成されるヘッダ行にします。これらのキーを元にデータは加工されます。
キーの末尾に書かれている :integer 等の文字は、値の型です。 これを指定しておくと、データを加工する際に値をその型にキャストするように頑張ってくれます。 省略時の初期設定は”string”です。 “integer”, “boolean”, “float”等が使用できるほか、”array” ではカンマで区切った配列が、 “json” ではJSON文字列としてパースされた結果が格納されます。
2. スプレッドシートを公開 & IDを取得する
「ファイル」→「ウェブに公開」でシートの公開設定ができます。
- 「公開開始」ボタンを押して公開します
- 「公開データへのリンクを取得」で「RSS」を選択します。
すると、次のようなURLが表示されるので、
https://spreadsheets.google.com/feeds/list/XXxxxxXXXxxxXx/od6/public/basic?alt=rss
太文字の “XXxxxxXXXxxxXx/od6” にあたる部分をコピーします。 これはこの後スプレッドシートのIDとして使用されます。
3. Ghostsheetで読み込む
Ghostsheet.php を任意の場所に設置してrequireし、初期化してスプレッドシートを読み込みます。
require "Ghostsheet.php";
$gs = new Ghostsheet();
// キャッシュ用のディレクトリを設定しておきます
// config() で配列を渡すこともできます
$gs->set("cacheDir", "./gscache/");
$mySpreadsheetId = "XXxxxxXXXxxxXx/od6";
$data = $gs->load($mySpreadsheetId); // $dataに加工されたデータが格納されます
あとは、読み込まれたデータを好きな様に料理してください。
Ajaxで利用する
Ghostsheetには、Ajaxで簡単に利用する為の ajax()
メソッドが用意されています。 ajax()
は引数の配列(省略時のデフォルトは $_GET
)を使用して処理し、JSON形式でレスポンスを返します。
ajax.php
require "Ghostsheet.php";
$gs = new Ghostsheet();
$gs->set("cacheDir", "./gscache/");
$gs->ajax();
jQueryによる読み込み例
$.getJSON("ajax.php", {
id : "XXxxxxXXXxxxXx/od6"
})
.then(function(data){
console.log(data.items);
});
JSONPで利用する
Ajax同様にJSONPでレスポンスを返すことも出来ます。 あまりおすすめできる機能ではないので、初期設定では無効化されています。
require "Ghostsheet.php";
$gs = new Ghostsheet();
$gs->config(array(
"cacheDir" => "./gscache",
"jsonp" => true // JSONP機能を有効に
));
$gs->ajax();
受け取るidのホワイトリストを作ったり、 キャッシュディレクトリを非公開にするなどの対策をして使用した方が良いかな、と思います。
その他のオプション・機能など
ざっくりとしか書いてませんが、APIドキュメントをどうぞ。
必ず気をつけなければならないこと
Googleスプレッドシートを簡易的なCMSとして使用する上で、気をつければならないこと。
非公開情報は載せない
「Webで公開」機能を利用しないと使えないライブラリなので、 そのスプレッドシートの内容は全て公開されてしまいます。
共有設定に気をつけて
第三者が編集できるような状態にしない。 クライアントと共有したい場合は、限定公開でユーザーを決め打ちしましょう。
「変更が加えられると自動的に再公開する」のチェックはオフに
編集途中の状態で公開されて恥ずかしい思いをする可能性があります。 自動公開ではなく、編集が終わったら都度「今すぐ再公開」ボタンを押すようにしましょう。
まとめ : Googleスプレッドシートの活用について
私は、優秀なクローンでも出ない限り、テーブルの編集でGoogleスプレッドシートの右に出るサービスは無いと思っています。 そして、WYSIWIGではなくテーブルでの管理をしたいWebコンテンツというのも多くあるでしょう。 例えば、
- お店のメニュー表
- 製品リスト
- 詳細画面の要らないニュースリスト
- その他リストコンテンツ
などなど。このようなデータコレクション的なコンテンツは、 CMSでがんばって実装したりするよりはテーブルで管理出来たほうが メンテナンスの効率も良いと感じるのです。
また、WordPressはわからないけどExcelならいつもつかってるからわかるよ! というWeb担当者も多くいらっしゃると思います。 (専任の枠を割けずに総務の方が兼任しているようなケースでは特に)
そんなわけで、私はこのお題を執拗に探求しているのであります。
コメント