🙆♀️
Googleカレンダーに登録されているイベントをGASでSlackで通知する
これは株式会社TECH PLAY女子部 Advent Calendar 2022の7日目の記事です。
ごきげんよう🌸
2022年の7月から、TECH PLAY女子部のオーガナイザーをしている@bboobbaaです!
女子部のGoogleカレンダーに登録されているイベントをSlackで通知するようにしました!
まずはSlackのTOKENや、チャンネルIDなどをコーディングします。
TOKENの権限はchat:write
があればよいです。詳細はchat.postMessageを参照ください。
env.js
const SLACKTOKEN = PropertiesService.getScriptProperties().getProperty('SLACKTOKEN');
const SLACKURI = 'https://slack.com/api';
const SLACKCHANNEL = 'C0E4VTZ9C';
const SLACKCOLOR = 'ffb6c1';
投稿する関数をコーディングします。
postEventsToday()
のトリガーを毎日朝8時に設定しています。
イベントが1日2回以上あれば、attachments
を複数投稿するようにしました。
index.js
function postEventsToday() {
const today = new Date();
const attachments = getEventsToday(today);
let text = '';
if (attachments.length) {
text += Utilities.formatDate(today, 'JST', 'yyyy年MM月dd日(' + getWeek(today) + ') ');
text += '本日開催のイベントのお知らせです:woman-tipping-hand:';
const param = {
channel: SLACKCHANNEL,
text: text,
attachments: attachments,
}
const res = UrlFetchApp.fetch(`${SLACKURI}/chat.postMessage`, slackOptions('post', param));
}
}
function getEventsToday(today) {
const events = CalendarApp.getDefaultCalendar().getEventsForDay(today);
let attachments = [];
for (const event of events) {
let text = '';
const title = event.getTitle();
const isAllDayEvent = event.isAllDayEvent();
const startDate = event.getStartTime();
const endDate = event.getEndTime();
const location = event.getLocation();
const description = event.getDescription();
text += '*' + title + '*\n';
if (isAllDayEvent) {
text += ':date:';
text += '終日開催';
} else {
text += ':date:';
text += Utilities.formatDate(startDate, 'JST', 'HH:mm');
text += '〜'
text += Utilities.formatDate(endDate, 'JST', 'HH:mm');
}
if (location) text += '\n:round_pushpin:' + location;
if (description) text += '\n' + description;
attachments.push({
color: SLACKCOLOR,
blocks: [
{
type: 'section',
text: {
type: 'mrkdwn',
text: text,
}
},
],
});
}
return attachments;
}
さいごに、他のGASでも使いそうな関数をcommon.js
にまとめました。
common.js
function getWeek(date) {
switch(date.getDay()){
case 0: return '日';
case 1: return '月';
case 2: return '火';
case 3: return '水';
case 4: return '木';
case 5: return '金';
case 6: return '土';
}
}
function slackOptions(method, payload) {
return {
method: method,
contentType: 'application/json',
payload: JSON.stringify(payload),
headers: {'Authorization': `Bearer ${SLACKTOKEN}`},
}
}
今度時間取ってDiscordにも投稿できるようにする予定です!
Discussion