LoginSignup
31
27

More than 5 years have passed since last update.

Node.jsから、Googleスプレッドシートに書き込む

Posted at

Node.jsでやることか、とか思いつつもやりたかったので仕方がない。npmに数多くのGoogleスプレッドシートに関するモジュールがあるけれど、GoogleさんがAPIのバージョンを上げていく一方、それに追従してメンテしてくれる人は、そんなに多くない…。

というわけで、いろいろ試したものの、まともに動くものがなかったので、自分でほんのちょっと改修してみました。

使用モジュール

  • edit-google-spreadsheet

なかなかイケてるモジュールです。読み書き両方できます。使い方もサンプルが色々あるので分かりやすいと思います。若干コールバック地獄になりがちですが、node.js v0.12まで我慢…かな。

ただし、読む部分が今のGoogleSpreadsheetAPIだと動きません。昔は、認証さえされていれば非公開なドキュメントであっても、JSON形式でデータにアクセスできたんですが、今は公開状態のものでないと駄目。なぜかXML形式は非公開でも閲覧できる…。

XMLモジュール入れれば解決できるやん!と思ったら、なんと偉人がすでにプルリクを投げていらっしゃる。

しかし…edit-google-spreadsheet本家の人は、もうメンテできないから、誰かやって状態でプルリクも放置気味…まぁ仕方ないですね。というわけで、自分でフォークして上記プルリクをあてて、さらにちょっとだけ改修したものをアップしました。

インストール方法

package.json
{
  "dependencies": {
    "xml2json": "*",
    "edit-google-spreadsheet": "zaru/node-edit-google-spreadsheet"
  }
}
$ npm install

npmで普通にedit-google-spreadsheetをインストールすると本家のものがダウンロードされるけど、GitHubのパスを指定すれば、僕がアップしたものが適用されます。

認証方法

認証方式は3つ。

  • IDとパスワード
  • OAuth
  • Token

正直、最初のIDとパスワード方式しか試してないです。

使い方

シートに次々新しい行としてデータを保存していきたいので、receive()を使って、現在の最終行を取得してから、書き込みます。

hoge.js
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みたいです。まぁでも今これで計算しても、うまくいかないんですけどね…。誰か教えて欲しい。

31
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
27