Mach3.laBlog

新しくなったスプレッドシートと簡易データベース化

この記事は賞味期限切れです。(更新から1年が経過しています)

いつであったかあまり記憶は定かではないですが、去年ぐらいに Google スプレッドシートが新しくアップデートされました。 今回は、新しい Google スプレッドシートでも旧バージョンと同じようにAjaxで簡易データベース化出来ないかと考えてみた話です。

新しくなったスプレッドシートと簡易データベース化

新しくなった Google スプレッドシート

今までは個人設定をいじる事で旧バージョンのスプレッドシートを使い続ける事ができたのですが、 先日からそのオプションが設定画面から消えていて、特別な方法をとらないと旧バージョンのスプレッドシートを新規作成出来なくなりました。 (すでに作成したスプレッドシートは変更されない様です)

刷新された Google スプレッドシートにどのような素晴らしい機能が追加されたかは未だあまり把握していませんが、 現状で確かな事は、旧バージョンで使えたRSSやJSONでの公開APIが実装されていないという事です。 今後実装されるかどうかはわかりません。

以前書いたGhostsheetはそれらの公開APIを利用した物だったので、新しいスプレッドシートでは使用する事ができません

2014/11/20 追記
現在ではAPIが整備された様で、新しいスプレッドシートでも旧Ghostsheetが正常に動作する事を確認しました。
Googleスプレッドシートを簡易DBとして利用する - PHP+Ajax編

Ghostsheet も新しくしました

とはいえ、pubhtml(Webページの公開)APIは利用可能なので、それをスクレイピングしてデータ化する物を新たに書きました。 全く別物になったのでリポジトリも改めています。

簡単な使い方

以前と同様に、スプレッドシートを作成して「Webに公開」します。

name age:integer email active:bool
John 23 john@example.com true
Tom 18 tom@example.com false

一行目のヘッダ部分でデータの型を指定する事が出来ます。 上記にある integerbool の他に、floatjson が利用出来ます。 省略時は string になります。

そしてスプレッドシートのキーをメモしておきます。スプレッドシートのキーはURLの下記太文字の箇所になります。

https://docs.google.com/spreadsheets/d/00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX/edit#gid=0

このキーをそのまま引数にしてメソッドの呼び出しをします。

<?php

require "the/path/to/ghostsheet/phplib/Ghostsheet.php";

$gs = new Ghostsheet();
$gs->config("cache_dir", "./cache");
$data = $gs->load("00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX");
var_dump($data);

結果は連想配列で返され、”sheets” の中に各シートのデータが格納されるようになっています。

array(3) {
  ["title"]=>
  string(4) "My Spreadsheet"
  ["key"]=>
  string(44) "00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"
  ["sheets"]=>
  array(2) { ... }
}

旧版との大きな違い

旧版ではスプレッドシートに含まれるシート名で引くためには複数回リクエストしなければなりませんでしたが、 pubhtmlでは全てのシートがひとつのWebページで公開される為、一回のリクエストで済みます。 あまり大量のデータになると辛そうですが、そういった大きなデータでは利用すべきではないと思うので、 結果的には効率が良くなったと言えそうです。

メソッドの使い分け

Ghostsheet にはデータを取得する為に4つのメソッドがあります。

  • load
    • キャッシュファイルが期限切れでなければそれを使用
    • そうでなければリモートから最新のデータを取得し、キャッシュファイルを更新
  • cache
    • キャッシュの生死に関わらずキャッシュのデータを返す
  • fetch
    • キャッシュの生死に関わらずリモートからデータを取得
    • キャッシュの更新は行わない
  • update
    • キャッシュの生死に関わらずリモートからデータを取得
    • キャッシュの更新を行う

一見すると load で良さそうですが、その場合、キャッシュの期限が切れるたびにレスポンスが遅くなるタイミングが出てきてしまいます。 対策としてはデータの取得は常にキャッシュから行い、非同期で load を呼び出すのがレスポンスに優しそうです。

(おまけ) Gruntタスク

おまけ機能としてGruntタスクをつけておきました。 スプレッドシートのデータを引っ張ってJSONファイルとしてローカルに保存するだけの簡単な物です。 シートのデータを元に静的サイトをジェネレートしたい場合などに使えたり、使えなかったり。

grunt.initConfig({
    ghostsheet: {
        dev: {
            files: {
                "./data/mydata.json": "00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"
            }
        }
    }
});

grunt.loadNpmTasks("ghostsheet2");

まとめ

わりと力技なパースなので、できれば用意されたAPIを使いたい気持ちもありますが…

ちなみに一応旧版でも新規作成する方法は残されていて、下記指定のURLにアクセスするだけで可能です。 旧版のデータが残されている以上、当面は使えそうです。

cf) 新しい Google スプレッドシートについて – ドキュメント エディタ ヘルプ

コメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*