Slackに@todayと打つとGoogleCalenderの今日の予定を通知させる方法はコレだ！１２３


# はじめに
* 当番制で仕事をしていてGoogleCalenderに当番が登録してある
* コミュニケーションツールはSlackを使っているが、会話の途中で「今日の担当者よろ！」というシーンが
* そこで、「えっと、誰だっけ？」とならないように@todayと入力すると今日の担当者をつぶやくBOTが作ることにした
* 尚、定刻に通知するだけなら[Googleカレンダーの内容をSlackに投稿する](http://qiita.com/shibukk/items/c26a64c63e26d0d5a967)をやればできます
    * 本記事では、**キーワードをトリガとした** 通知方法をご紹介します

# １．Slack側の設定 ～Incoming WebHooksでメッセージを流す設定～
* [incoming-webhookの設定画面](https://my.slack.com/services/new/incoming-webhook)にアクセスして以下のように通知したいチャンネル名を選択して「Add Incoming WebHocks Integration」をクリックする
    * ![無題.png](https://qiita-image-store.s3.amazonaws.com/0/19778/77701c1e-b542-1158-f814-8223f1410e86.png)
* URLが発行される
    * ![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/19778/d1b12289-7ec0-5e50-cf52-0ceaac0cd02a.png)

# ２．GASスクリプトを作成してWebアプリケーションとして公開する

#### 2-1 カレンダーのIDを確認する(日本の祝日を例にしています)
* ![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/19778/983d2652-e956-033d-9d86-2806e1e5c270.png)
* ![qiita3.png](https://qiita-image-store.s3.amazonaws.com/0/19778/b9d18aad-b0c0-0b8f-5096-97f4e255edc6.png)

#### 2-2 [Googleスプレッドシート](https://www.google.com/intl/ja_jp/sheets/about/)を新規作成する
*  「ツール」⇒「スクリプトエディタ」を選択する
* ![qiita1.png](https://qiita-image-store.s3.amazonaws.com/0/19778/9f42e001-8499-910c-d82a-5c366f814485.png)
 
#### 2-3 GASスクリプトを作成する
* 以下のようにスクリプトを作ります
    * 参考にした記事にはdoGet()と書かれていたのを見ていたので、「あれ？キーワードに反応してくれないorz」とはまりました
    * よーくみると「ここPostやろ！」と修正してみるとサクット通知されるようになりました

```:今日の担当者.gas
function doPost() {
  var list = "";
  var s;

  // 例として日本の祝日を指定しています
  s = listupEvent(" ja.japanese#holiday@group.v.calendar.google.com"); 
  if (s != "")  list += "\n本日の担当者\n" + s;
 
  Logger.log(list);
  if (list != "") {
    var payload = {
      "text" : list,
      "username" : "holiday_bot"
    }
    postSlack(payload);
  }
}
 
// 本日の予定をリストアップ
function listupEvent(cal_id)
{
  var list = "";
  var cal = CalendarApp.getCalendarById(cal_id);
  var events = cal.getEventsForDay(new Date());
  for(var i=0; i < events.length; i++){
    s = "";
    if (events[i].isAllDayEvent()) {
      s += Utilities.formatDate(events[i].getStartTime(),"GMT+0900","MM/dd  ");
    } else {
      s += Utilities.formatDate(events[i].getStartTime(),"GMT+0900","MM/dd HH:mm");
      s += Utilities.formatDate(events[i].getEndTime(), "GMT+0900","-HH:mm  ");
    }
    s += events[i].getTitle();
    Logger.log(s);
 
    list += s + "\n";
  }
  return list;
}
 
// Slackへポスト
function postSlack(payload)
{
  // POSTオプション
  var options = {
    "method" : "POST",
    "payload" : JSON.stringify(payload)
  }
 
  // アクセス先
  var url = "[Incoming WebHooksで発行したURL]";

  var response = UrlFetchApp.fetch(url, options);
  var content = response.getContentText("UTF-8");
}
```

#### 2-4 ウェブアプリケーションとして公開する
* 「公開」⇒「ウェブアプリケーションとして導入...」を選択する
* このとき、アプリケーションにアクセスできるユーザーが **全員(匿名ユーザーを含む)** となっていることを確認する
    * ![qiia4.png](https://qiita-image-store.s3.amazonaws.com/0/19778/c4e74ee5-b7f3-3028-6f60-377e98149043.png)

# ３．Slack側の設定 ～Outgoing WebHooksでキーワードを監視する～
* Slackの[outgoing-webhookの設定画面](https://my.slack.com/services/new/outgoing-webhook)にアクセスし、「Add Outgoing WebHooks Integration」をクリックする
* Channelに監視するチャンネルを選択する
    * ここでは#generalを選択しているが、Anyを選ぶと**public**な全チャンネルを対象にもできる
* Trigger Wordに反応させたいキーワードを指定する
    * ここでは@today
* URLに **１．Slack側の設定 ～Incoming WebHooksでメッセージを流す設定～** で発行したURLを指定する
* ![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/19778/1d3c4b36-5d51-dc2b-d29c-43f78c251d46.png)


## 参考にした記事
* [Googleカレンダーの内容をSlackに投稿する](http://qiita.com/shibukk/items/c26a64c63e26d0d5a967)
* [Slack BotをGASでいい感じで書くためのライブラリを作った](http://qiita.com/soundTricker/items/43267609a870fc9c7453)
* [今日の予定をまとめて教えてくれるslackの秘書BOT](http://qiita.com/seya128/items/028274fc014af37f7931)


----

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)が**1000ストックを突破**しました！これからもよろしくお願いします
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください