🙆‍♀️

Googleカレンダーに登録されているイベントをGASでSlackで通知する

2022/12/08に公開

これは株式会社TECH PLAY女子部 Advent Calendar 2022の7日目の記事です。
https://adventar.org/calendars/7471

ごきげんよう🌸
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