読者です 読者をやめる 読者になる 読者になる

詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Slack のログを自動で Google Spreadsheet に保存する

GoogleAppsScript

2015-11-13 16:40 追記

以下のスクリプトの利用が Slack の TOS に触れるのではないか……という指摘をいただきました。

No Other Storing. You may not copy or store any Data or capture or store any information expressed by the Data (such as hashed or transferred data), except to the extent permitted by this API TOS.

全体を読んでみると OAuth を利用してサービスを提供する場合を想定しているようなので、今回の利用を Slack が積極的に禁じているわけではないと思いますが(管理画面でアーカイブの zip を提供していることもあるし)、スクリプトを利用される際はご自身で TOS をいま一度ご確認ください。


Slack はたいへん安易に利用できるので重宝するけれど、無料プランではログが10000件までしか保存されず、過去の発言が消えてしまうのは何だか勿体ないというか、不便だし辛い。あと金もない。

ありがたいことに Slack は API がかなり整備されていて、これを丁寧に使うことで各チャンネルのログを取得することはできそうである。しかし定期的に API を叩く機構を用意することや、ログを保存する場所のことを考えるとすこし億劫にもなる。

そこで、今回は貧者の cron であるところの Google Apps Script(GAS) と貧者のデータベースであるところの Google Spreadsheet を使って Slack のログを保存する方法を紹介する。

準備

Slack API を使用するので、まずは https://api.slack.com/web#authentication でチームのトークンを生成しておく。

Google Apps Script のコードは https://github.com/motemen/gas-slack-log-spreadsheet/blob/master/app.js にある。これを https://script.google.com/ から作成する新規プロジェクトのコードとしてコピペする。

ちなみにソースコードは TypeScript で書いているので、修正したい場合はそちらをいじるとよろしい。

github.com

「無題のプロジェクト」と表示されているところをクリックして、プロジェクト名を保存する。自分は「Slacklog (<チーム名>)」などとした。

メニューから [ファイル] → [プロジェクトのプロパティ] → [スクリプトのプロパティ] から行を追加する。

  • プロパティ: slack_api_token
  • 値: 先ほど生成したSlack API のトークン

f:id:motemen:20151113130302p:plain

準備は以上で完了。

初回の実行

メニューの [実行] → [StoreLogsDelta] から初回の実行をおこなう。このとき Google Drive、Spreadsheet などへのアクセス権限を求められるので許可する(以降は不要)。

f:id:motemen:20151113130321p:plain

この初回の実行ですべての過去ログがスプレッドシートに保存されるはず。GAS の実行はあまりに時間がかかると強制的に中断されるが、無料枠の 10000 件であればすぐに終わるはず。

結果の確認

Google Drive の Slack Logs/<チーム名> フォルダ以下に、yyyy-MM 形式のファイル名で月ごとのログがスプレッドシートとして保存される。

f:id:motemen:20151113130339p:plain

スプレッドシート中にはチャンネルごとにシートが作られていて、メッセージが古い順に格納されている。D カラムは Slack API における JSON を保持しているので、さらにリッチな表示をしたければこの値を利用して何かしらできるようになっている。

定期実行の設定

スクリプトを次に実行するときは、差分だけを取得して追記という形になる。1時間毎くらいの頻度でおこなっておけば問題なさそう。

メニューの [リソース] → [現在のプロジェクトのトリガー] から、StoreLogsDelta を毎時実行するように設定する。

f:id:motemen:20151113130353p:plain

ひと晩くらいしか動かしてないけど、大丈夫そう。ちなみに月またぎは経験していないので何か落とし穴があるかもしれません。

……という感じです。Google Drive のフォルダ単位でチームメンバーに共有することを考えているので、プライベートグループのログの保存は行っていない。やるなら別フォルダを用意することになるだろう。

無課金勢のみなさまにおかれましては、どうぞご利用ください。