必要なスキル
Slackのワークフロー、Incoming Webhooks設定、Google App Scriptの基本を理解をしていること
概要
Slackへの自動投稿としては簡単な利用方法です。スプレッドシートへ登録したリマインダー情報を指定日時にSlackチャンネルの指定ユーザーへメンション投稿します。Slack側のApp設定、Incoming Webhooksを設定する説明は省きます。
スクリプトの処理説明
スプレッドシートへ入力されたリマインド日時がスクリプト実行時に超えている場合に実行しています。スクリプトの実行トリガー次第で投稿するタイミングは変わってくるので即時性や毎朝まとめて送信など任意でトリガー設定させると良い。
Spread Sheet
スプレッドシートの内容です。このサンプルではリマインド1回実行するだけです。
FlagがNullの場合にPostします。
Reminderの登録手順
下記の項目へ入力してください。登録時はFlagは空白のままにしてください。
補足:ユーザーグループへメンションしたい場合は、次のルールに沿って登録
Formatting text for app surfaces
Mentioning groups
https://api.slack.com/reference/surfaces/formatting#mentioning-groups
Flag | NotificationDateTime | Message | UserID | ChannelID |
yyyy/MM/dd HH:mm:ss 2024/06/01 15:30:00 | 任意の投稿内容、URLリンクなど Don't forget the meeting! | ユーザの場合は@を付ける。ユーザーグループの場合は!subteam^を文字先頭につける @username or @userid or !subteam^groupid | C12345678 |
Sample Script
サンプルのスクリプトです。
エラー確認の為に少しログ出力も書いたままにしてあります。
function sendReminders() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Reminder");
var data = sheet.getDataRange().getValues();
var now = new Date();
for (var i = 1; i < data.length; i++) { // Skip header row
var flag = data[i][0]; // A列のフラグ
var notificationDateTimeStr = data[i][1]; // B列の通知実行日時
var message = data[i][2]; // C列の通知メッセージ
var userId = data[i][3]; // D列のSlackメンション対象UserID
var channelId = data[i][4]; // E列のSlackチャンネルID
// 通知実行日時が空の場合スキップ
if (!notificationDateTimeStr) {
continue;
}
var notificationDateTime = new Date(notificationDateTimeStr);
if (flag !== "sent" && now >= notificationDateTime) {
var slackURL = "https://hooks.slack.com/services/url"; // ここにWebhook URLを入力
var payload = {
"channel": channelId,
"text": message + " <" + userId + ">"
};
var options = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(payload)
};
// デバッグ用のログ出力 ここは消しちゃってOK
Logger.log("URL: " + slackURL);
Logger.log("Payload: " + JSON.stringify(payload));
Logger.log("Options: " + JSON.stringify(options));
var response = UrlFetchApp.fetch(slackURL, options);
Logger.log("Response: " + response.getContentText());
// フラグを "sent" に更新して再実行を防ぐ
sheet.getRange(i + 1, 1).setValue("sent");
}
}
}