StreamingAPIで取得したツイートをGoogleSpreadSheetにリアルタイムに書き込んでみました。


##あいさつ
こんにちは、のびすけです。
[Google Apps Scriptアドベントカレンダー](http://qiita.com/advent-calendar/2014/gas)の1日目を担当させて頂きます!

![](http://i.gyazo.com/d201a445a84cde3dd98704ca39e47a98.png)

弊社( http://ligic.co.jp )ではGoogle Appsを利用しています。
その中でも特に **Google Spread Sheet** はよく使います。

社内ツール的な使い方を目指して、実際にNode.jsからAPIを使って開発をしてみましたが、
**カンタンなコードでAPIが使えて感動しています。**

そんな感じで今回はスプレットシートをいじってみた記録を残します。

##Node.jsからGoogleスプレッドシートにアクセスしたい
どんぴしゃな記事を書いてくださっている方がいました。
 -> [Node.jsから、Googleスプレッドシートに書き込む](http://qiita.com/zaru/items/1e764426362c9af26655)

この記事をもとに **edit-google-spreadsheet** を改良したものを使ってみます。 ([@zaru](http://qiita.com/zaru)さんありがとうございます。)

##Googleスプレッドシートに書き込んでみる

* package.jsonを作ります

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

* モジュールインストールします。

```
$ npm i
```

* ソースを記述します。

```gas.js

var Spreadsheet = require('edit-google-spreadsheet');

Spreadsheet.load({
  debug: true,
  spreadsheetId: 'スプレットシートのID',
  worksheetId: 'シートのID', // 1つめだったら、od6
  username: 'googleアカウント名',
  password: 'googleアカウントのパスワード'
  }, 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");
    });
  });
});

```

* 実行してみましょう

```
$ node gas
```

![](http://i.gyazo.com/ca41c7c3941ea030feb5f32bf99d4d39.png)


実行するたびにスプレットシートにhogeとpiyoが書き込まれます。

### `spreadsheetId` スプレットシートIDはURLから分かります

https://docs.google.com/a/ryousuke.org/spreadsheets/d/1Z67hxH7_mFosqUGxBUKnc_zjQmarbZSrAoglC4e8TRA/edit#gid=0

このスプレットシートの場合`1Z67hxH7_mFosqUGxBUKnc_zjQmarbZSrAoglC4e8TRA`がIDになります。

### `worksheetId` これはシートの番号になります。

```
1番目: od6
2番目: od7
・
・
・
```

という形になるみたいです。謎ですね。

例

```
  spreadsheetId: '1Z67hxH7_mFosqUGxBUKnc_zjQmarbZSrAoglC4e8TRA',
  worksheetId: 'od6',
```


## 応用: Tweetをリアルタイムに流し込んでみる

最近TwitterAPIとよくあそんでいる( [Twitter Streaming API + Node.js (ntwitter)で指定キーワードのツイートを取得する](http://qiita.com/n0bisuke/items/09126e6e2cd111841a2e) )ので組み合わせてみます。

まじで組み合わせただけです笑 (気が向いたら後で書き換えます)

```gas.js
var Spreadsheet = require('edit-google-spreadsheet');

/*twitter設定*/
var twitter = require('twitter');

var twit = new twitter({
  consumer_key: 'xxx',
  consumer_secret: 'xxx',
  access_token_key: 'xxx',
  access_token_secret: 'xxx'
});

var keyword = process.argv[2]; //第一引数
var option = {'track': keyword};
console.log(keyword+'を含むツイートを取得します。');

twit.stream('statuses/filter', option, function(stream) {
  stream.on('data', function (data){
    if(data.lang === 'ja'){

        Spreadsheet.load({
          debug: true,
          spreadsheetId: '1Z67hxH7_mFosqUGxBUKnc_zjQmarbZSrAoglC4e8TRA',
          worksheetId: 'od6', // 1つめだったら、od6
          username: 'xxx',
          password: 'xxx'
          },
          function sheetReady(err, spreadsheet) {
          spreadsheet.receive(function(err, rows, info) {
            if(err) throw err;

            // 最後の行数を取得
            var nextRow = info.nextRow;
            var output = {};
            output[nextRow] = {
              1: data.text,
              2: data.user.screen_name,
            };
            spreadsheet.add(output);
            spreadsheet.send(function(err) {
              if(err) throw err;
              console.log("comp");
            });
          });
        });

    }
  });
});
```

実行してみます。

```
$ npm i twitter
$ node gas facebook
```

![](http://i.gyazo.com/0236273c559148b7d5b963462a71e96f.gif)


こんな感じで **ストリーミング取得したツイートがリアルタイムにスプレットシートに書き込まれていく** のが分かると思います。

##しめ

リアルタイム描画はどちらかというとスプレットシート側の機能ですが、取得したデータがそのまま画面に反映されるのは楽しいですね。
スプレットシート側のAPI制限や作るアプリケーションの規模にもよると思いますが。スプレットシートをこのままデータベースのような使い方をしても面白いかもですね。

スプレットシート連携機能を備えたアプリが簡単に作れそうです。

色々と応用を考えてみたいと思います!