Node.jsでやることか、とか思いつつもやりたかったので仕方がない。npmに数多くのGoogleスプレッドシートに関するモジュールがあるけれど、GoogleさんがAPIのバージョンを上げていく一方、それに追従してメンテしてくれる人は、そんなに多くない…。
というわけで、いろいろ試したものの、まともに動くものがなかったので、自分でほんのちょっと改修してみました。
使用モジュール
- edit-google-spreadsheet
なかなかイケてるモジュールです。読み書き両方できます。使い方もサンプルが色々あるので分かりやすいと思います。若干コールバック地獄になりがちですが、node.js v0.12まで我慢…かな。
ただし、読む部分が今のGoogleSpreadsheetAPIだと動きません。昔は、認証さえされていれば非公開なドキュメントであっても、JSON形式でデータにアクセスできたんですが、今は公開状態のものでないと駄目。なぜかXML形式は非公開でも閲覧できる…。
XMLモジュール入れれば解決できるやん!と思ったら、なんと偉人がすでにプルリクを投げていらっしゃる。
しかし…edit-google-spreadsheet本家の人は、もうメンテできないから、誰かやって状態でプルリクも放置気味…まぁ仕方ないですね。というわけで、自分でフォークして上記プルリクをあてて、さらにちょっとだけ改修したものをアップしました。
インストール方法
{
"dependencies": {
"xml2json": "*",
"edit-google-spreadsheet": "zaru/node-edit-google-spreadsheet"
}
}
$ npm install
npmで普通にedit-google-spreadsheetをインストールすると本家のものがダウンロードされるけど、GitHubのパスを指定すれば、僕がアップしたものが適用されます。
認証方法
認証方式は3つ。
- IDとパスワード
- OAuth
- Token
正直、最初のIDとパスワード方式しか試してないです。
使い方
シートに次々新しい行としてデータを保存していきたいので、receive()を使って、現在の最終行を取得してから、書き込みます。
var Spreadsheet = require('edit-google-spreadsheet');
Spreadsheet.load({
debug: true,
spreadsheetId: 'スプレッドシートID',
worksheetId: 'ワークシートID', // 1つめだったら、od6
username: 'example@google.com',
password: 'password'
}, function sheetReady(err, spreadsheet) {
spreadsheet.receive(function(err, rows, info) {
if(err) throw err;
// 最後の行数を取得
var nextRow = info.nextRow;
var output = {};
output[nextRow] = {
1: "hoge",
2: "piyo",
};
spreadsheet.add(output);
spreadsheet.send(function(err) {
if(err) throw err;
console.log("comp");
});
});
});
これだけでOKです。簡単便利。ただし、これをWebリクエストで処理しようとすると、もちろんロックなんてされてないので、同じようなタイミングでアクセスされると、同じ行に書き込まれ、最初のほうが闇に葬り去られます。気をつけましょう。っても、どうやって気をつけるかは、分からんけど(バッチ処理にするなど?)。
ワークシートIDの謎
これもまたGoogleスプレッドシートがバージョンアップされ、ワークシートIDが参照しにくくなっていて、謎すぎるんですが、1つ目のワークシートであればod6
らしいです。2つ目がod7
。36進数っぽいんだけど、スプレッドシートURL最後の#gid=0
の数値はなんか関係なさ気…。謎。
調べると、worksheetID = (gid xor 31578) encoded in base 36
みたいです。まぁでも今これで計算しても、うまくいかないんですけどね…。誰か教えて欲しい。