Skip to content

Instantly share code, notes, and snippets.

@iwasakishuto
Created October 17, 2021 18:11
Show Gist options
  • Save iwasakishuto/9cadad1e4f1ce4f7a1f789c0eaa15139 to your computer and use it in GitHub Desktop.
Save iwasakishuto/9cadad1e4f1ce4f7a1f789c0eaa15139 to your computer and use it in GitHub Desktop.
Google Calendarに登録した予定から特定のものをSlackに通知する。
/**
* @file Google カレンダーに登録されているスケジュールをSlackに通知する。
* @author Shuto Iwasaki <cabernet.rock@gmail.com>
* @copyright Shuto Iwasaki 2021
* @license MIT
*/
const prop = PropertiesService.getScriptProperties();
/** @summary 定期的に実行するトリガーのターゲットの関数 */
function main() {
var events = listupEvents({
cal_id: prop.getProperty("TARGET_GMAIL_ADDRESS"),
pattern: "パターン",
days: 7,
});
postSlack({
text: `*【向こう一週間の撮影スケジュール】*\n${events
.map((e) => `* ${e.date} ${e.title}`)
.join("\n")}
`,
channel: "#CHANNEL_NAME",
username: "<USERNAME>",
});
}
/**
* @summary カレンダーのIDを受け取り、そこから向こう ``days`` 日分の予定の中で ``pattern`` と書かれている予定をピックアップする。
* @param {String} cal_id カレンダーのId
* @param {String} pattern ピックアップする予定に含まれている文字列
* @param {Number} days 向こう何日分の予定を取得するか。
* @return {Object} 予定のデータ。
*/
function listupEvents({ cal_id, pattern = "パターン", days = 7 }) {
var eventLists = [];
var cal = CalendarApp.getCalendarById(cal_id);
var date = new Date();
/** @summary For-loopで days日分の予定を取得 */
for (var d = 0; d < days; d++) {
var events = cal.getEventsForDay(date);
for (var i = 0; i < events.length; i++) {
var event = events[i];
var title = event.getTitle();
if (title.includes(pattern)) {
/**@summary 終日かどうかで判定 */
if (event.isAllDayEvent()) {
eventLists.push({
title: title,
date: Utilities.formatDate(
event.getStartTime(),
"GMT+0900",
"MM/dd"
),
});
} else {
eventLists.push({
title: title,
date: `${Utilities.formatDate(
event.getStartTime(),
"GMT+0900",
"MM/dd HH:mm"
)} - ${Utilities.formatDate(
event.getEndTime(),
"GMT+0900",
"HH:mm"
)}`,
});
}
}
}
date.setDate(date.getDate() + 1);
}
return eventLists;
}
/**
* @summary Slackでメッセージを送る
* @param {String} text メッセージの内容
* @param {String} channel Slackのチャンネル名
* @param {String} username Slackのボット名
*/
function postSlack({ text, channel = "#gas-test", username = "Slack Bot" }) {
var options = {
method: "POST",
payload: JSON.stringify({
channel: channel,
username: username,
text: text, // メッセージの本文
}),
};
var webhook_url = prop.getProperty("WEBHOOK_URL");
var response = UrlFetchApp.fetch(webhook_url, options);
var content = response.getContentText("UTF-8");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment