社内でコミュニケーションの促進のため、誕生日の当日にSlackに通知するbotを作ってみた

#事前準備
- Slackの[Incoming WebHooks](https://slack.com/apps/A0F7XDUAZ--web-)を有効化する。
    1.「Add Configuration」をクリック
    <img width="997" alt="スクリーンショット 2019-02-10 21.17.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/24190e39-aaf9-e1a8-fda1-9e609a43e8de.png">
    2.「Post to Channel」に投稿したいチャンネルを選択して「Add Incoming WebHooks integration」をクリック
    <img width="995" alt="スクリーンショット 2019-02-10 21.17.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/0ef30f88-cba7-1075-7d70-4b583486d2d0.png">
    3.「WebHook URL」の発行を確認する (後で使用します)
    ![スクリーンショット 2019-02-10 21.30.56.png.png](https://qiita-image-store.s3.amazonaws.com/0/39775/903774fe-5b73-fa4c-941f-ab1b0c004937.png)

- GoogleSpreadSheetに誕生日リストを書き出します。
    1. Googleにログインし、[GoogleSpreadSheet](https://docs.google.com/spreadsheets)にアクセスします。
    2. 誕生日リストを準備します。名前と誕生日（年齢を算出しないため月と日のみ）をシートに記載します。シート名は「birthday」としました。
    <img width="453" alt="スクリーンショット 2019-02-10 19.00.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/8c6abaa5-39b2-d51a-993d-24dcfb108a20.png">

#GoogleActionScriptにSlackに通知する処理を記載します。
- 処理の説明
    1. 誕生日リストをGoogleSpreadSheetから取得
    2. 実行する日付と一致している誕生日の人をフィルタ
    3. メッセージを作成
    4. Slackに投稿
- 後述するGoogle Action Scriptのコードを以下の手順で保存します。
    1.Tool → Script editorを選択し、スクリプトエディタを表示します。
　　　　　　　　　<img width="689" alt="スクリーンショット 2019-02-10 21.58.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/17de9a96-a1a2-9a37-6566-ceb6a315de83.png">
　　　　　　　　<img width="615" alt="スクリーンショット 2019-02-10 18.47.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/fe8c7ad2-b9c6-77c5-da02-f6324dfaf824.png">
    2.code.gsと書かれた画面に以下のスクリプトを上書き貼り付けます。
    <img width="967" alt="スクリーンショット 2019-02-10 22.01.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/cfd92ecf-b4df-0715-0356-a48ce6ddaa1a.png">
    3.function postSlack(name)関数に事前準備の3で取得したWebHook URLを編集します。 <img width="817" alt="スクリーンショット 2019-02-10 22.03.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/b521fa33-0006-fae7-7e0c-3702ea5fc405.png">

- Google Action Script

```
function birthdayPostSlack()
{
  var birthDayNameList = getBirthDayNameList();
  for (var i = 0; i < birthDayNameList.length; i++) {
    var name = birthDayNameList[i][0];
    var birthDay = birthDayNameList[i][1];
    var nowDate = Utilities.formatDate(new Date(), 'Asia/Tokyo','MM/dd');
    if(nowDate == Utilities.formatDate(new Date(birthDay), 'Asia/Tokyo','MM/dd')) {
      postSlack(name);
    }
  }
}

function getBirthDayNameList() 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("birthday"); // 誕生日リストを取得するシート名
  var last_row = sheet.getRange("A:A").getLastRow();
  var start_row = 2;　// 開始行
  var birthDayNameList = [];
  for (var i = start_row; i < last_row; i++) {
    var slack_name = sheet.getRange(i, 1).getValue();
    var birthDay = sheet.getRange(i, 2).getValue();
    if (slack_name != "") {
      birthDayNameList.push([slack_name, birthDay]);    
    }
  }
  return birthDayNameList;
}

function postSlack(name)
{
  var payload = {
    text: getMessage(name)
  };
 
  var url = "https://hooks.slack.com/services/T0GAF04H2/BG40PNXT8/XXXXXXXXX"; // 事前準備の3で取得したWebHook URL
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload": JSON.stringify(payload)
  };
  UrlFetchApp.fetch(url, options); 
}

function getMessage(name)
{
  var reactions = [];
  for (var i = 0; i < 4; i++) {
    reactions.push(':tada:');
    reactions.push(':congratulations:');
    reactions.push(':blush:');
  }
  reactions = reaction_shuffle(reactions);
  var len = Math.floor(Math.random() * Math.floor(6));
  var reactions = reactions.slice(1, len　+ 2);  
  var reaction = "";
  for (var i = 0; i < reactions.length; i++) {
    reaction = reaction + reactions[i];
  }
  return '今日は' + name + 'さんの誕生日です!' + ' :birthday:' + '\r\n' + 'おめでとうございますー！！' + reaction; 
}
```
- 通知されるかどうかテストします。

    1.Run → Run function → birthdayPostSlackをクリック
     <img width="479" alt="スクリーンショット 2019-02-10 22.08.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/5b9ea78f-e903-437e-dc4d-49c333835056.png">
   2.Slackに通知されているか確認
   <img width="654" alt="スクリーンショット 2019-02-10 22.10.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/7988494c-73cf-5935-fec6-e17ba9450589.png">

#Slack通知の自動化

- トリガーの設定

    1.「時計アイコン」をクリック
<img width="964" alt="スクリーンショット 2019-02-10 22.20.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/0ab59d8b-4bbb-ea5f-d6d2-3c59526312eb.png">
    2.「トリガーを追加」をクリック
    <img width="996" alt="スクリーンショット 2019-02-10 22.22.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/c499878c-5e14-2448-21c1-a6898bb02f2f.png">
    3.「時間主導型」をクリックして、「日付ベースのタイマー」、「午前10~11時」を選択して保存
    <img width="683" alt="スクリーンショット 2019-02-10 22.24.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/67bc3514-e446-a0e7-9ec7-49e8f51daccf.png">
4.保存後の画面
    <img width="1001" alt="スクリーンショット 2019-02-10 22.26.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/39775/9b7848e0-4449-0dd1-24ca-75ad61c574aa.png">