Googleスプレッドシートをcronのように使いSlackに投稿する

はてなチーフエンジニアの id:motemen です。

以前の記事で紹介したようにはてな技術グループおよびデザイングループでは毎週社内で勉強会を開催していますが、これを運営していくにあたってひとつ課題であったのが毎週のリマインドでした。

developer.hatenastaff.com

毎回発表者が違いますから、あらかじめ皆に「今日は○○さんの××という発表です!」と周知して期待を高めたいですし、また次回の発表者には予告をして発表の準備を進めておいておかなければなりません。発表者・タイトル・日付などを記したスプレッドシートがマスターデータとしてあったので、元々は私が人手で、Googleスプレッドシートに記載した発表順を見ながらSlackに共有していました。しかしやはり個人による運用だと予告忘れがあったり、周知のタイミングが朝なり夕方なりまちまちであったりと、参加者にも不便を強いていたし、自分の負担も無視できないものでした。

そこでマスターのスプレッドシートをもとに次の勉強会の予告をSlackに投稿するスクリプトを作り、この運用を自動化することにしました。このエントリではその紹介をいたします。

まずは利用イメージをご覧ください。ある日のエンジニアが集まるSlackチャンネルです。

f:id:motemen:20160115152421p:plain:w400

発表者やタイトル、寿司の出る回か否か……などの情報が分かりやすく提示されています。これを勉強会の当日および翌日に投稿することで、参加者や次の発表者へのリマインダ代わりにしています。

使用しているのはGoogle Apps Scriptで、ソースコードは以下のリポジトリにあります。

github.com

このスクリプトが行うことを簡潔にまとめると、「シートの各行について、現在時刻がその行に指定された日付と時刻にマッチする場合、行の内容をSlackに投稿する」となります。これを1時間毎に実行することでちょっとしたcronのように扱えます。粒度が1時間と大きいですが、今回のような用途であれば十分です。

セットアップ

  1. Slackに投稿したいデータを持ったGoogleスプレッドシートを開き、メニューの [ツール] → [スクリプト エディタ…] からスクリプトの編集画面を開きます。
  2. app.js の内容を貼り付けます。
  3. SlackにIncoming Webhookを設定し、URLをスクリプト中の WEBHOOK_URL に代入します。
  4. メニューの [実行] → [doPost] を選択し、一度手動で実行します。この際外部リソース(Slack)にアクセスする権限を要求されますので、許可します。
  5. メニューの [リソース] → [現在のプロジェクトのトリガ] を選択し、毎時 doPost を実行するように設定します。

以上を設定したらあとは通知が来るのを待つだけです。通知にソースのスプレッドシートへのリンクが記載されているので、設定した人以外にもデータの出処がわかるようになっています。通知内容の試行錯誤など定時実行を待たずに挙動を試したいときは 4. の手動実行で確認できます。

使い方

以下は実際に勉強会のお知らせに利用しているシートです。

f:id:motemen:20160115142640p:plain

このスクリーンショットを見れば分かるように、シートには以下のカラムを持ったデータを埋めていきます。

  • Date(Slackに投稿する日)
  • Hour(Slackに投稿する時)
  • 以下、自由記述

DateとHourのみが必須かつ固定のカラムで、スクリプトはDateおよびHourをスクリプトの実行時刻と比較し、たとえばHourが15であれば15時台の実行で投稿します。

Dateには日付のほかに "mon,fri" といった曜日の指定や土日を除いた "weekday"、毎日を意味する "*" などの指定が可能なので繰り返しの通知も設定できます。Hourも同様にカンマ区切りで "11,15,17" と複数の時を指定できます。

今回の勉強会の通知では、日付と別のマスターデータを元にした通知用のシートを作っています。

おわりに

以上、スプレッドシートによる簡単な通知ルーチンの実現を簡単に紹介しました。

同じような仕組みで朝のミーティングのアジェンダや各種当番をSlackチャンネルに共有しているチームもあります。導入はやや面倒かもしれませんが、一度設定してしまえば非エンジニアも簡単に通知内容を編集できるのでけっこう便利です。ぜひ試してみてくださいね。