Googleカレンダーの予定を◯日前にSlackで通知する

  • Slackに通知を飛ばしたいスケジュールを登録するGoogleカレンダーを作成する
  • そのGoogleカレンダーの内容を、◯日前にSlackに通知する

上記の内容のメモ。

GoogleカレンダーのIDをコピーする

通知用カレンダーの上にカーソルを持っていくと出てくる三点の部分をクリック。

表示されるメニューの [設定と共有] をクリック

「カレンダーの統合」部分の「カレンダーID」をコピーして控えておく。ここで控えたカレンダーIDは後で使います。

Slackアプリの作成

slack api の Your Apps から、「Create New App」をクリック。

「From scratch」をクリック。

「App Name」にわかりやすい任意の名前を入れて、「Pick a workspace to develop your app in:」で使いたいワークスペースを選び、最後に「Create App」ボタンを押す。

アプリが作成されるので、設定していきます。

[Settings] > [Basic Information] の中にある、「Add features and functionality」をクリック。

「Incoming Webhooks」をクリック。

「Activate Incoming Webhooks」の右にあるボタンをクリックして「On」にする。

すると下部に表示が増えるので「Add New Webhook to Workspace」をクリック。

Slackに接続するための権限リクエストの画面が出るので、投稿先チャンネルを選び、「許可する」ボタンを押す。

「Webhook URL」の部分に今作った Webhook URL があるので、「Copy」ボタンを押して控えておく。この Webhook URL は後で使います。

アイコンなどを設定したい場合

[Settings] > [Basic Information] のページ下部にある「Display Information」の「App icon & Preview」を設定するとアイコンを設定することができる。説明が必要であれば「Short description」や「Long description」を設定。

Googleスプレッドシートを作成設定

Googleスプレッドシートを作成して、名前をわかりやすいものにしておく。「Slack_remind通知用」など。

[拡張機能] >[AppScript] をクリック。

コード.gs に以下のように設定する。変更箇所は以下の3つ。

  • 先程控えておいたWebhookURLを記入
  • 先程控えておいたカレンダーのIDを記入
  • 何日前にリマインドするかを設定
// ポストするSlackチャンネル
// ※SlackAppで設定したWebhookURL
var postUrl = '先程控えておいたWebhookURL';

// 何日前にリマインドするか?
// var day = 1; // 1日前
var days = [1, 7]; // 1日前と7日前

// チェックするカレンダーのID
var calendarId = '先程控えておいたカレンダーのID';


function myFunction() {

  var pushMessage = "リマインド予定をお知らせするよ\n";
  var remindNum = 0;
 
  for (var i = 0; i < days.length; i++) {
    var day = (days[i]);
    var events = getEvents(day);
    if (events != "") {
      var message = makeMessage(events, day);
      pushMessage += message;
      remindNum ++;
    }
  }

  // Logger.log("1\n" + pushMessage);
  Logger.log("remind数:" + remindNum);

  if (remindNum > 0) {
    sendHttpPost(pushMessage);
  }

}

// イベント取得
function getEvents(day) {

  var searchStr = '';
  var events = [];
  var targetDate = new Date();
  targetDate.setDate(targetDate.getDate()+day);
  var options = {
    search: searchStr
  }

  var calendar = CalendarApp.getCalendarById(calendarId);
  var events = calendar.getEventsForDay(targetDate, options);


  var no_reservation_msg = '';

  return events;
}

// function postToSlack(events) {
function makeMessage(events, day) {

  var message = '';
  message += '▼予定の' + day + '日前\n';

  for (var i in events) {
    var title = events[i].getTitle();
    var start = events[i].getStartTime();
    var location = events[i].getLocation();
    var description = events[i].getDescription();


    var start_month = start.getMonth()+1;
    var WeekChars = [ "日", "月", "火", "水", "木", "金", "土" ];
    var start_day = WeekChars[start.getDay()]; // 曜日
    var start_time = start.getHours() + ':' + pad(start.getMinutes());
    var start_date = start.getDate(); //日

    message += start_month.toString() + '月' + start_date.toString() + '日(' + start_day + '):';
    message += title + '\n';
  
  }
  return message;
}

function sendHttpPost(message)
{
    var jsonData =
    {

         "text" : message,
         "link_names": 1
    };
    var payload = JSON.stringify(jsonData);
    var options =
    {
        "method" : "post",
        "contentType" : "application/json",
        "payload" : payload
    };

    UrlFetchApp.fetch(postUrl, options);
}

function pad(n){return n<10 ? '0'+n : n}

テスト実行する。メニューの「実行」をクリック。

問題なく動けば、先程指定したSlackのチャンネルに以下のように投稿される。

実行トリガーの設定

Apps Script の左側にあるメニューの [トリガー] をクリック。

ページ右下にある「トリガーを追加」ボタンをクリック。

  • 「実行する関数を選択」:「myFunction」を選択
  • 「イベントのソースを選択」:「時間主導型」を選択
  • 「時間ベースのトリガーのタイプを選択」:「日付ベースのタイマー」を選択
  • 「時刻を選択」:任意の時間を設定する。設定した時間にSlackに通知がいく

上記を設定したら、忘れず右下の「保存」ボタンを押す。

これで毎日指定の時間に通知がSlackに飛ぶようになりました。
※該当するGoogleカレンダーのスケジュールがない場合は通知は飛びません。

おわり!