Slack へ Google カレンダーの明日の予定を通知2
以前 Slack へ Google カレンダーの明日の予定を通知する方法について書いた。
Google カレンダーの予定を前日に Slack へ通知 – with a Christian Wife
https://wacw.cf/2020/04/22/notifying-google-calendar-shedule-to-slack/
しかしである。この方法だと挙動がおかしい。一度 Google カレンダーに登録したあと削除した予定が通知されたり、一部の予定が通知されなかったりする。これは使えない。
とりあえずアンインストールをする。
(1)ブラウザの Slack のページにもしくは Mac の Slack アプリで、「左上のワークスペース名>Settings & administration>Manage apps」をクリック。
(2)「Google Calendar for Team Events」をクリック。
(3)チャンネル名横のゴミ箱アイコンで削除する。
***
当日の予定に関してはすでに GAS を使った Slack への通知を使っている。以下のページに従って実装した。
Slack Bot:毎朝Googleカレンダーの予定を通知してくる秘書ねこBotの作り方 | デザインメモ 2.0
https://designmemo.jp/creative/bot-googlecalendar-slack.html
次の日の予定に関しては以下のページの「Googleカレンダーの明日の予定をSlackに通知」に従えばいい。
Slackに天気や予定を毎朝通知する Google Apps Script – Qiita
https://qiita.com/maatumoDev/items/f9497d5b37757db1b276
ただし、次の日に予定がない場合にスクリプトが実行されると、Google からスクリプトの実行に失敗したというメールが来る。エラー内容は missing_text_or_fallback_or_attachments などと書かれており、要するに出力データがないという意味だ。
これを回避するにはどうすればいいか。以下のページに倣い、events.length が0以上とそれ以外で条件分岐をすればいい。
Google Apps Scriptを使ってみよう! – サテライト原口社長のスクリプト指南(6) 今日の予定をカレンダーからメールで自動送信 | マイナビニュース
https://news.mynavi.jp/article/apps_script-6/
すなわち、以下のようなスクリプトに変更した(一部私の使いやすいように変更している)。
1function getCalendarPostSlack() {
2
3 var dt = new Date();
4 dt.setDate(dt.getDate() + 1);//明日に設定
5
6 //カレンダーURL、もしくはメールアドレスを取得して入力。
7 var myCal=CalendarApp.getCalendarById('**************@group.calendar.google.com');
8 var events=myCal.getEventsForDay(dt);
9
10 var strBody = "";
11
12 //予定が1つ以上の場合のみ実行(ここから)
13 if(events.length > 0){
14
15 // イベントごとにループ
16 for(var i_e=0;i_e<events.length;i_e++){
17 var strTitle=events[i_e].getTitle();
18 strBody=strBody + "・ "+strTitle+ '\n'; //Slackで表示させる予定(改行区切り)
19 }
20
21
22 var data={
23 "text":strBody,
24 "username": "明日の予定お知らせbot",
25 "icon_emoji" : ":date:",
26 "channel" : "#********" //Slackのチャンネルを指定
27 }
28
29 var options =
30 {
31 "method" : "POST",
32 'contentType': 'application/json',
33 'payload' : JSON.stringify(data)
34 };
35
36 // SlackのIncoming WebhookのURLを取得して入力
37 UrlFetchApp.fetch("https://hooks.slack.com/services/*****/*****/*****", options);
38
39 }
40 //予定が1つ以上の場合のみ実行(ここまで)
41}
42
43function _HHmm(str){
44 return Utilities.formatDate(str, 'JST', 'HH:mm');
45}