【全員必ず】メンバーの誕生日をSlackに通知する【祝ってやる】

#これは
Slackワークスペース内のメンバーが誕生日を迎えると、通知が飛ぶようにしました。
![スクリーンショット 2020-05-06 13.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/8b956443-811f-bb64-3805-c72723ac951c.png)


#きっかけ
中の人はビジネスサイドですが、思いがけず開発部の方から[Udemyの講座](https://www.udemy.com/course/gas_for_operational_efficiency/)をいただいたので、そちらの内容を応用して何か作ってみようと思いました。



#使ったもの
- Slack Incoming Webhook
- Googleカレンダー
- Google Apps Script(GAS)

#やったこと
##Slack Incoming Webhook
Slackプロフィール＞「その他管理項目」＞「ワークスペースをカスタマイズ」
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/69d95ab5-a474-f182-9e59-6300c2326da3.png" width =500>

「ワークスペースをカスタマイズ」＞「App管理」
![スクリーンショット 2020-05-06 14.22.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/d75d13db-38df-369e-7137-50d70bce2c66.png)

「App管理」＞「カスタムインテグレーション」にIncomong Webhookを追加
![スクリーンショット 2020-05-06 14.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/361435d4-6d48-6d0a-2213-34e74c72543c.png)

「カスタムインテグレーション」＞「インテグレーションの設定」のWebhook URLを後ほどGASに埋め込みます。
「インテグレーションの設定」では、通知される時の名前やアイコンも編集することができます。
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/83b12811-8cab-3b90-384e-7a224c08109a.png" width=500>


##Googleカレンダー
誕生日用のカレンダーを作成しました。こちらの「設定と共有」を開くと、
![スクリーンショット 2020-05-06 14.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/69b23488-f7a8-7827-21eb-ae1e09161c34.png)

カレンダーIDが確認できます。こちらも後ほどGASに埋め込みます。
![カレンダーID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/979e6c06-694b-05a5-7f57-4f1ad42036d6.png)



##GAS
###カレンダー情報の取得
ここでカレンダーIDを指定することにより、特定のカレンダー情報を取得します。

```javascript
function notifySlack() {
  //お誕生日カレンダー情報の取得
  const CALENDAR_ID = 'hogehogehogehogehogehogek@group.calendar.google.com';
  var Calendar = CalendarApp.getCalendarById(CALENDAR_ID);
```
###取得する情報の詳細

```javascript
  
  //今日の日付
  var startDate = new Date();
  //「誕生日」を検索文字列に指定
  var optionsforGas = {
    search: '誕生日'    
  }
  var BirthdayEvents = Calendar.getEventsForDay(startDate,optionsforGas);
  var url = 'https://hooks.slack.com/services/hoge/hogehogehogehogehogehoge'
  var title = '';
  for(var i in BirthdayEvents) {
    title = BirthdayEvents[i].getTitle();
  }
```
###通知の設定
誕生日のメンバーがいる日だけに通知が飛ぶように条件分岐させる(最初はこれをやっていなかったので、「今日は」だけの虚無通知が飛ぶ事態が起きていました)。

```javascript

if(BirthdayEvents.length != 0){  
  var text = '今日は' 
 
  //Incoming webhookからslackに送信する値
  var payload = {
    'username': '＊＊＊',
    'text': text += title,
    'channel':'#develop'
  };
  
  var optionsforSlack = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };
  
   UrlFetchApp.fetch(url, optionsforSlack);
 }
}  

```

###トリガーを設定する
GAS＞編集＞「現在のプロジェクトのトリガー」を選択
![スクリーンショット 2020-05-06 14.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/727f1bd9-ee1f-ac7c-15ed-a470886a546b.png)

「トリガーを追加」をクリック
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/606dae5e-1f47-36b9-ff0b-e9753aa5c384.png" width=600>

イベントソースは、ひとまず「時間主導型」にしましたが、プルダウンで「カレンダーから」も選べるのでそっちでもいいはず(違いはよく分かっていない)。
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/b490fac3-a3b7-e3b4-ba58-a9c02a3ef632.png" width=400>

#学んだこと

[ここ](https://qiita.com/menstos2525/items/634ebae257fee9893ff9#%E9%80%9A%E7%9F%A5%E3%81%AE%E8%A8%AD%E5%AE%9A)、最初は以下のように記述していました。
これだと、誕生日の人がいない場合でも変数が動いてしまうから変数ごとifで囲った方が無駄な処理がなくて良い(らしい)。

```javascript

  var text = '今日は' 
 
  //Incoming webhookからslackに送信する値
  var payload = {
    'username': '＊＊＊',
    'text': text += title,
    'channel':'#develop'
  };
  
  var optionsforSlack = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };
  

   if(BirthdayEvents.length != 0){
   UrlFetchApp.fetch(url, options);
   }
```


#参考資料
- [Google Apps Script公式リファレンス](https://developers.google.com/apps-script/reference/)
- いただいた講座：[ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜](https://www.udemy.com/course/gas_for_operational_efficiency/)

いろんな人に教わりながらとりあえず手を動かしたみたいなところがあるので、また頭を整理して後日追記する予定です。