1
/
5

Google Calendar for Team Events for Slack を GAS で自作してみる ~即時通知編~【株式会社ライトコード】

弊社エンジニアの記事になります。

はじめに

前編では Google Calendar for Team Events for Slack を GAS で実装した話 の一環として定時通知編(決まった時間に当日の予定を通知)を紹介しましたが、今回の後編は 即時通知(予定が作られたら即通知) の実装について書きたいと思います。

  • Google Calendar for Team Eventsって何?
  • 何で自作しようと思ったの?
  • GASって何?何で使おうと思ったの?
  • GAS アプリケーションのデプロイ
  • Slack 通知用Botの準備

などや、1の定時通知の実装については前編の記事で詳しく書いていますので、後編では前編と異なる部分・特筆すべき部分に絞って書いていこうと思います。

前編の記事はこちら!↓

2023.05.26Google Calendar for Team Events for Slack を GAS で自作してみる ~定時通知編~はじめにこんにちは!株式会社ライトコードの福岡本社でモバイルエンジニアやってる こー です!今回は Google Ca...

何を作ったの?

弊社では、社員の休暇予定を「みんなの休暇予定」というカレンダーで共有しており、

  1. 平日朝8時にその日の休暇予定(定時通知)
  2. 休暇予定の作成(即時通知)

の2つをSlackに通知しています。

前編の記事では、1の定時通知の作成について書いたので、今回は2の即時通知になります。

それでは早速、実際のコードを早速見ていきましょう!

メインコード

通知処理を行うメインコードはこちらです。

こちらはカレンダーに予定が作成された際にフックされるメソッドですが、そのフック方法はまた後述します。

function notifyCreatedHolidayEvents() {
// 1. 新規作成された予定を抽出
const calendarId = PropertiesService.getScriptProperties().getProperty("CALENDAR_ID")
const nextSyncToken = PropertiesService.getScriptProperties().getProperty("SYNC_TOKEN")
const optionalArgs = {
syncToken: nextSyncToken
}
const calendarEvent = Calendar.Events.list(calendarId, optionalArgs)
PropertiesService.getScriptProperties().setProperty("SYNC_TOKEN", calendarEvent.nextSyncToken)
const events = calendarEvent.items.filter((item) => item.status == EventStatus.confirmed && item.start.date)

// 2. 通知メッセージの組み立て
let message = ""
switch (events.length) {
case 0:
return // 新規作成された予定がなければ通知しない
case 1:
message = "*1* event was created"
break
default:
message = `*${events.length}* events were created`
}

const attachments = makeAttachmentsFromEvents_(events)

3. Slackに通知
if (!attachments.length) return
postSlack_(message, attachments)
}

この3つのナンバリングの内、前編と差分があるのは 1 のみになるので、その部分の解説をしていきます。

新規作成された予定を抽出

// 1. 新規作成された予定を抽出
const calendarId = PropertiesService.getScriptProperties().getProperty("CALENDAR_ID")
const nextSyncToken = PropertiesService.getScriptProperties().getProperty("SYNC_TOKEN")
const optionalArgs = {
syncToken: nextSyncToken
}
const calendarEvent = Calendar.Events.list(calendarId, optionalArgs)
PropertiesService.getScriptProperties().setProperty("SYNC_TOKEN", calendarEvent.nextSyncToken)
const events = calendarEvent.items.filter((item) => item.status == EventStatus.confirmed && item.start.date)1 // 1. 新規作成された予定を抽出
const calendarId = PropertiesService.getScriptProperties().getProperty("CALENDAR_ID")
const nextSyncToken = PropertiesService.getScriptProperties().getProperty("SYNC_TOKEN")
const optionalArgs = {
syncToken: nextSyncToken
}
const calendarEvent = Calendar.Events.list(calendarId, optionalArgs)
PropertiesService.getScriptProperties().setProperty("SYNC_TOKEN", calendarEvent.nextSyncToken)
const events = calendarEvent.items.filter((item) => item.status == EventStatus.confirmed && item.start.date)

スクリプトプロパティ を用いてカレンダーIDを取得しているところまでは前編と同じです。

スクリプトプロパティとは、GASで利用できる環境変数のようなもので、外部に公開されないため ID やトークン、パスワードなど秘匿情報を保持するのに適しているものでしたね。…

記事の続きは下のリンクをクリック!

https://rightcode.co.jp/blogs/41824

もっとワクワクしたいあなたへ

現在、ライトコードでは「WEBエンジニア」「スマホアプリエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「エンジニアリングマネージャー」「営業」などを積極採用中です!

有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。

  • もっと大きなことに挑戦したい!
  • エンジニアとしてもっと成長したい!
  • モダンな技術に触れたい!

現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?

ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。

株式会社ライトコードでは一緒に働く仲間を募集しています
今週のランキング
株式会社ライトコードからお誘い
この話題に共感したら、メンバーと話してみませんか?