Googleカレンダの予定開始3分前になったら、予定開始まで1分毎に、Slackにメンション付き通知するGASスクリプト

記事タイトルとURLをコピーする

こんにちは! 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 の利用

  1. Googleにログインし、G Suite Developer Hub にアクセスします
  2. 「新しいプロジェクト」をクリックします
  3. 上に記載したコードを貼り付け、「変数定義」部分を自分の環境用に編集し、フロッピーマーク(または [cmd/ctrl] + s キー)を押して保存します
  4. 適当に名前を付けてOKを押します
  5. 「自分のプロジェクト」に作ったプロジェクトがあることを確認し、クリックします
  6. 右の方に出てくる「プロジェクトの詳細」の右上に付いている3つの点マークをクリックします
  7. 「トリガー」をクリックします
  8. 右下にある「トリガーを追加」をクリックします
  9. 以下のように「remindGoogleCalender」関数を「1分おき」に実行するようにして「保存」します
  10. 3分前になると、1分毎にSlackに通知されるようになりました ( 18:07 開始の会議前、18:04, 18:05, 18:06 の合計3回、通知しています )

まとめ

この状態で様子を見ようと思います -> 2022/2 現役です

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、サウナ、音楽鑑賞(J-Pops)、お笑い鑑賞(ラランド)