- 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カレンダーのスケジュールがない場合は通知は飛びません。
おわり!