こんにちは! AWSをこよなく愛す技術4課の山本(通称ヤマゾン)です 昨日は実質9.2時間くらい寝ました
この記事を書くことになった背景
弊社はGoogleカレンダーを使って、社内の予定を管理しています Googleカレンダーは予定の時間が近づくと、通知(リマインド)してくれます ↓こんなの
また、予定開始時間の5分前になったら、Slackに通知(リマインド)してくれるプラグインもあります ↓こんなの
しかし、上の通知を私はいつも逃してしまいます...なぜだ...
毎日朝一番にその日の予定は確認するものの、他の作業や、何かを読むのに集中していると、 つい予定に入っている会議を忘れてしまいます 結果として、私がいつも忘れてしまうのが、所属している課の朝会です
10:30からGoogle meet (WEB会議) で開催していて、meetの参加メンバーにいつも私だけがいないので、課の皆さんから私宛にSlack通知が来ます ( 今日は過去最高の3メンションを記録してしまいました! )
この悔しさを解決するために、どのような通知(リマインド)なら絶対に気付くことが出来るか?を考えました そして、「Googleカレンダの予定開始3分前になったら、予定開始まで1分毎に、Slackにメンション付き通知をもらえると、気付くことが出来そう」と結論づけました
5分前に通知が来ても、WEB会議の準備は1〜2分で出来るため「あと5分もあるし、いっか」となっていました 3分前、2分前、1分前と通知をもらうことにより、間に合う確率は、上がりそうです
私のSlack通知設定は以下になっています 1. Slackにメンション付きの通知をもらうと、PCで音が鳴る (概ねBlueToothのイヤホンをしているため、イヤホンに音が来る) 2. PCを閉じているときは、携帯にバイブレーション通知する
Googleカレンダの予定開始3分前になったら、予定開始まで1分毎に、Slackにメンション付き通知するGASスクリプト
以下のようになりました
// Googleカレンダから予定を取得し、開始3分前になったらSlackにメンション付きで通知する 開始まで1分毎に通知する
// このスクリプトを1分毎に実行するようトリガー登録してくださいね
// 準備するもの・・・Slackに、Incoming WEB hook を1つ用意してください
// 変数定義 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Googleカレンダ関連
var calenderid = 'yamamoto.fugafuga@hogehoge.co.jp' // カレンダーID (基本的にメールアドレス)
// Slack関連 ( Incoming WEB hook を1つ用意してください )
var channel = "#hoge" // 通知先チャンネル
var mention = "@yamamoto" // メンション宛先
var username = 'カレンダお知らせbot'; // 通知時に表示されるユーザー名
var icon = ':nyancat:'; // 通知時に表示されるアイコン
var incomingHookUrl = 'https://hooks.slack.com/services/hogehoge/hugahuga/fugahoge'; // Incoming WEB Hook URL
// 関数定義 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Googleカレンダから予定を取得し、開始3分前になったらSlackにメンション付きで通知する 開始まで1分毎に通知する 関数
function remindGoogleCalender(){
// カレンダーから予定を取得する
var cal = CalendarApp.getCalendarById(calenderid);
var events = cal.getEventsForDay(new Date());
// 各予定1つ1つに実行する処理
for(var i=1; i < events.length; i++){
//予定への参加が「いいえ」の場合は除く
if (events[i].getMyStatus().toString() !== "NO") {
// 予定の件名、開始時間を取得
startTime = events[i].getStartTime();
eventName = events[i].getTitle();
//予定の開始時間から3分引いた時刻を取得
var fiveMinutesBefore = (startTime.getTime() - 3*60*1000);
//現在時刻を取得
var now = new Date();
//「現在時刻が、予定の開始時間から3分引いた時間を超過していたら、Slackに通知する」 かつ、「開始時間を過ぎた場合はもう通知しない」
if (fiveMinutesBefore < now && now < startTime){
// 時間をJSTに変換 (GASの標準はUTC)
var startTimeJST = Utilities.formatDate(startTime, "JST", "HH:mm")
// Slack送信用メッセージ作成
var message = startTimeJST + " " + eventName + " " + mention;
// Slackに通知
redirecttoslack(message);
}
}
}
}
// Slack通知関数
function redirecttoslack(message) {
var jsonData =
{
"username" : username,
"icon_emoji": icon,
"channel": channel,
"text": message,
"link_names": 1
};
var payload = JSON.stringify(jsonData);
var options =
{
"method" : "post",
"contentType" : "application/json",
"payload" : payload
};
UrlFetchApp.fetch(incomingHookUrl, options);
}
// End
登録の仕方
事前準備として、Slack の Incoming Webhook URLを1つ用意してください 参考:Slack でのIncoming Webhook の利用
- Googleにログインし、G Suite Developer Hub にアクセスします
- 「新しいプロジェクト」をクリックします
- 上に記載したコードを貼り付け、「変数定義」部分を自分の環境用に編集し、フロッピーマーク(または [cmd/ctrl] + s キー)を押して保存します
- 適当に名前を付けてOKを押します
- 「自分のプロジェクト」に作ったプロジェクトがあることを確認し、クリックします
- 右の方に出てくる「プロジェクトの詳細」の右上に付いている3つの点マークをクリックします
- 「トリガー」をクリックします
- 右下にある「トリガーを追加」をクリックします
- 以下のように「remindGoogleCalender」関数を「1分おき」に実行するようにして「保存」します
- 3分前になると、1分毎にSlackに通知されるようになりました ( 18:07 開始の会議前、18:04, 18:05, 18:06 の合計3回、通知しています )
まとめ
この状態で様子を見ようと思います -> 2022/2 現役です