早く出社した人を早く帰らせてあげるSlackチャネル&botを作った

経緯

ある昼下がり、食堂の窓から五月の快晴を見て、たまには16時くらいに帰りたいな〜 と私が言った。 
それを聞いたチームメンバーが、じゃあ、帰りましょう と言った。独り言のつもりだったので、びっくりした。

そのあと、5人くらいで話し合った結果が以下。

Q. 早く帰るためにはどうしたらいいか? 
A. 早く出社しよう。(効率上げるのは前提として、ウチの会社は7時間36分は働かないとダメ)

Q. 早く出社しても誰かが気づくか? 
A. 出社時間のログを取って、Slackでわかるようにしよう

作ったもの

  1. IFTTTで出社イベントを取得
  2. Google Apps Scriptで定時を計算
  3. Slackでその人の定時を投稿

1.IFTTで会社の位置情報を取得

1-1. IFTTTを各メンバーのスマホにインストール&アカウント作成
1-2. 下記に従い、IFTTT上でサービスを作成。IFTTTの制約上、それぞれのメンバーが自分で作る必要がある。メンバー全員にコピペしてもらった。

+this 

location >> you entered an area > >会社の住所を選択
+that

webhooks >> make a web request を選択し下記を入力

- URL
https://script.google.com/macros/s/{{googleAppsScriptのURL}}

- Method
Post

- Content Type
application/json

- Body
{ 
    "channel" : "#早起き", 
    "name" : "mochida", 
    "slack_stamp_name" : ":mochida:", 
    "message" : "おはようございま〜す。\ntimeに帰れるようにがんばります :space_invader: ",
    "work_hours" : 7, 
    "work_minutes" : 36,
    "slack_webhook" : "https://hooks.slack.com/{{slackのincoming webhookのURL}}"
    "disable_after" : 12 
}

2. Google Apps Scriptで退社時刻の計算

ロジックはめちゃくちゃ簡単。現在時間に労働時間を足し算してあげるだけ。
ただ、GASのドキュメントはなかなか見つからないので、全行記載してコメントもしておく。

function postSlack(data){
  var url = data.slack_webhook;
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : 
      '{ "text": "' + data.message + '", "channel": "' + data.channel + '", "username": "' + data.name + '", "icon_emoji": "' + data.slack_stamp_name + '" }'
  };
  UrlFetchApp.fetch(url, options);
}

function doPost(e) {
  var LONG_WORK = 6;
  var jsonString = e.postData.getDataAsString();
  var data = JSON.parse(jsonString);
  var ts = Date.now() + data.work_hours*60*60*1000 + data.work_minutes*60*1000;

  //6時間以上の労働にはお昼が休憩1時間必要
  if(data.work_hours >= LONG_WORK) {
    ts += 1*60*60*1000;
  }

  var timetogo = Utilities.formatDate(new Date(ts), 'Asia/Tokyo', 'H:m');
  data.message = data.message.replace('time', timetogo);

  //data.disable_afterよりも遅い時間ならpostしない。(ランチ・MTG等で外出・帰社した時に反応しないようにするため、無効な時間を設定可)
  if(data.disable_after != null && new Date().getHours() >= data.disable_after) {
    return;
  }

  postSlack(data);
}

3. Slackでその人の退社時刻を投稿

slack_stamp_nameに対応するスタンプを作っておくと、スタンプがアイコンになる。

image.png

以上で終わりです。8割くらいGASに時間取られた。。。

今後

定時にSlackのリマインダーが起動するとか面白そう。
あとは、出社時刻をspread sheetにまとめて月次でグラフつくるとか。

とりあえずは、早めに帰宅する喜びをプロジェクトメンバーに感じてもらえたらいいかな、と思ってる。

追記

評判良かったので、Google Apps ScriptのアクセスURLを限定公開します。

URLが欲しい方は、facebookから友達申請&DMください。
攻撃を避けるため、友達が30人以上いる方に限り共有します。
https://www.facebook.com/kyogo.mochida

(5/24) お昼休憩時間を1時間とし、1時間プラスするように実装しました。IFTTTの修正をするのが望ましいのですが、各メンバーのアプリ設定の修正の手間を省くため。

(5/25) disable_afterをパラメータに追加しました。