チームメイトの予定が毎日Slackで通知される方法(#GAS)

チームメイトの予定が毎朝Slackで確認できたら便利かなと思い、書いてみました！🍓

####`今回すること`

![スクリーンショット 2021-02-07 7.45.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407730/23f405b4-c837-7d4f-2929-5eff99179edc.png)

**GoogleAppsScript**と**Webhook**(Slack拡張機能)を使い、
毎朝チームメイトの**GoogleCalendar**情報が通知されるようにしていきたいと思います🙆‍♀️✨

##準備編
- <a href="https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8">SlackとWebhookを連携</a>
- <a href="https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008">SlackのWebhook URL取得</a>
- **GoogleAppsScriptを開く**
 - (GoogleDrive→新規→その他→GoogleAppsScript)
- **CalendarId取得**
 - (GoogleCalendar→設定→マイカレンダーの設定→カレンダー ID)
- **チームメイトのGoogleCalendarを登録**
 - (GoogleCalendar→設定→カレンダーを追加→カレンダーに登録)
 - チームメイトからアクセス権を頂く

##実践編(コード)
######`エディタ① -チームメイト情報管理（メンバーが増えたらここを編集）-`
```javascript
function getMembers(){

  var members = ['Aさん','Bさん'];
  var calendarIds = {
    'Aさん':'カレンダー ID',
    'Bさん': 'カレンダー ID'
  };
```
>
- <font color="MediumBlue">**var members**</font>:チームメイトの名前
- <font color="MediumBlue">**var calendarIds**</font>:チームメイトのカレンダー ID情報を入れる (*基本的にGmailアドレス)

######`エディタ② -Slackで送る内容設定-`
```javascript
  var MembersInfo = [];
  
  members.forEach(function(member){

  var calendarId = calendarIds[member]; 
  var myCalendar = CalendarApp.getCalendarById(calendarId);
  
  var startDate = new Date();　
  var myEvents = myCalendar.getEventsForDay(startDate);
  var titletime =  '【'+ member+ '】'+'\n';

  myEvents.forEach(function(myEvent){

  var title = myEvent.getTitle();
  var startTime = myEvent.getStartTime();
  var endTime = myEvent.getEndTime();

  startTime = Utilities.formatDate(startTime, 'JST', 'hh:mm');
  endTime = Utilities.formatDate(endTime, 'JST', 'hh:mm');

  titletime += '・'+'[予定] : '+ title + ' [時間] : ' + startTime + ' - ' + endTime+'\n';

 return true 

});
  titletime += '-----------------------------'+'\n'
  MembersInfo.push(titletime);
  return true ; 
});
  return MembersInfo; 
};
```
>
- <font color="MediumBlue">**var MembersInfo = []**</font>:空の箱、**MembersInfo**を作る
- <font color="MediumBlue">**members.forEach**</font>:**member**それぞれにする関数
- <font color="MediumBlue">**calendarId & myCalendar**</font>:カレンダーID情報を取得
- <font color="MediumBlue">**var startDate = new Date()**</font>:今日の日付を取得
- <font color="MediumBlue">**var titletime =  '【'+ member+ '】'**</font>:**member**にはエディタ①で登録したmemberの情報が入る
- <font color="MediumBlue">**myEvents.forEach**</font>:**event**それぞれにする関数
- <font color="MediumBlue">**var title = myEvent.getTitle()**</font>:予定の**タイトル**取得
- <font color="MediumBlue">**startTime & endTime**</font>:**Start**と**End**時間の取得
- <font color="MediumBlue">**Utilities.formatDate(startTime, 'JST', 'hh:mm')**</font>:**日本時間**に変更と表示形式を[**時間：分数**]に設定
- <font color="MediumBlue">**titletime**</font>:Slackで表示されるメッセージ
- <font color="MediumBlue">**MembersInfo.push(titletime)**</font>:一番最初に作った空の箱、**MembersInfo**に**titletime**の情報を入れる

######`エディタ③ -Slack通知設定-`
```javascript
function notifySlack() {

  var calMembers = getMembers(); 
  var text = '本日のメンバーの予定です\n'; 

  calMembers.forEach(function(calMember){
  text +=  calMember + '\n' ; 

  })
  var payload = {
    'username':'お知らせ',
    'text' : text,
    'channel': 'カレンダー通知'
  };
  var options = {
  'method' : 'post',
  'content-type': 'application/json',
  'payload':JSON.stringify(payload)
  }; 
  var url = 'https://hooks.slack.com/services/XXXXXXXXX';
  UrlFetchApp.fetch(url,options);
}
```
> 
- <font color="MediumBlue">**username**</font>:Slackの通知Botの名前
- <font color="MediumBlue">**channel**</font>:通知を送るチャンネルの名前
- <font color="MediumBlue">**var url**</font>:準備編で取ったWebhookのURL
- <font color="MediumBlue">**UrlFetchApp.fetch(url,options)**</font>:(送る情報 , 送る内容)

######`完成形`
```javascript
function getMembers(){

  var members = ['Aさん','Bさん'];
  var calendarIds = {
    'Aさん':'カレンダー ID',
    'Bさん': 'カレンダー ID'
  };

  var MembersInfo = [];
  
  members.forEach(function(member){

  var calendarId = calendarIds[member];
  var myCalendar = CalendarApp.getCalendarById(calendarId);
  
  var startDate = new Date();　
  var myEvents = myCalendar.getEventsForDay(startDate);　
  var titletime =  '【'+ member+ '】'+'\n';

  myEvents.forEach(function(myEvent){

  var title = myEvent.getTitle();
  var startTime = myEvent.getStartTime();
  var endTime = myEvent.getEndTime();

  startTime = Utilities.formatDate(startTime, 'JST', 'hh:mm');
  endTime = Utilities.formatDate(endTime, 'JST', 'hh:mm');

  titletime += '・'+'[予定] : '+ title + ' [時間] : ' + startTime + ' - ' +'endTime+'\n';
  return true 
 });
  titletime += '-----------------------------'+'\n'
  MembersInfo.push(titletime);
  return true ; 
 });
  return MembersInfo; 
 };
function notifySlack() {
  var calMembers = getMembers(); 
  var text = '本日のメンバーの予定です\n'　; 
  calMembers.forEach(function(calMember){
  text +=  calMember + '\n' ; 
 })
  var payload = {
    'username':'お知らせ',
    'text' : text,
    'channel': 'testgas'
  };
  var options = {
   'method' : 'post',
   'content-type': 'application/json',
   'payload':JSON.stringify(payload)
  }; 
  var url = 'https://hooks.slack.com/services/XXXXXXXXX';
  UrlFetchApp.fetch(url,options);
}
```

##実践編(トリガー)

⚠️自動で毎日決まった時間に通知するためにはトリガーの設定は必須！
<img width="500"alt="sheet1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407730/4c0adf1a-5b72-d083-0468-f22f1608a797.png">

必ず、実行する関数を「**notifySlack**」に設定してください。
画像のように設定すれば、午前8時から9時の間に通知がきます。

##以上
いかがでしたでしょうか？！
是非、Slackに「カレンダー通知チャンネル」を作ってみてください👍

[参考]
https://developers.google.com/apps-script/reference/calendar