見出し画像

【slackワークフロー】slackでGoogleカレンダーの予定を削除するslackワークフローを作りました!【GAS】

こんにちわ!こんばんわ!ファンズ株式会社のSHIOです!

今日は、slackワークフロー x Googleカレンダー x Google App Script で作る「オーナー以外でもカレンダー削除できる君」(仮)を作ったお話です!
※ 繰り返し予定を前提とした記載となっている点に注意です!

オーナーじゃないとカレンダーの予定を消せないの不便ですよね、私の所属するプロダクト開発部では結構ナチュラルに使われていたりするので、誰かの参考にされば幸いです!

まずは経緯

ファンズの開発チームでは、毎週チームMTGを行っているのですが、「アジェンダが無ければスキップ」ということができるようになっています。
そしてそのアジェンダは事前に入力しておくのがファンズのルールになっています。

以前は、アジェンダが結構あったのですが、最適化を進めていった結果アジェンダがないタイミングが増えていったことで、以下のようなことがよく起こるようになりました。

MTG開始時刻になる

皆集まる

アジェンダがない

一応参加者に確認してもアジェンダはなさそう

すぐ解散

私「もっ・・・もったいないぞ・・この時間」
こうなるとみんなが手を止めて集まって数分使って解散、というのは非効率なので、以下要件で効率化できないかを考えました。

  1. MTG開始の1時間前程度にMTGオーナーにアジェンダ確認のメンション

  2. アジェンダあり : slack上で1クリックすることで「今日はMTGやるよ!」と参加者にメンション

  3.  アジェンダなし:slack上で1クリックすることで「MTG予定の削除」と「今日はMTGなしだよ!」と参加者にメンション

  4. これらを一番手軽に実現する

さて材料を用意しよう

  • Google スプレッドシート

  • Google App Script (GAS)

  • Slackワークフロー

【材料①】Google スプレッドシート

スプレッドシートの項目は画像の通りです。

スプレッドシートの項目
日時
GoogleカレンダーID
イベントID(前半)
イベントID(後半・時間)

※ 項目名を一致させる必要はありませんので方向性が同じもので別名等指定可能です。
※スプレッドシート内に格納する値についてはslackワークフローの設定で記述します。

【材料②】Google App Script (GAS)

私はコードの書けるエンジニアではなく、調べながら雰囲気でGASを書いている人間なので読みにくかったりするかもしれませんが、どなたかの参考になればと思いおいておきます。

// 本設定は「定期予定」のみに対応した当日の該当スケジュールを自動削除するGASです。
// (定期予定は「eventID_日時タイムゾーン」という表記ですが、単体予定は「eventID」のみのため、前者のフォーマットとなるようにしています。

function GcalDelbot() {


  // シート指定する
  const sheet =SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート名を記載する')

  // WFが飛んできた日を定義して、eventID用に形式を変更する
  const date = new Date()
  date.setDate(date.getDate());
  const currentDate = Utilities.formatDate(date,'JST','yyyyMMdd')
 console.log(currentDate)


 
 // 範囲指定
  const last = sheet.getLastRow()
  const lastColumn = sheet.getLastColumn()

 // シートの最終行を取得する

  const eventDate = sheet.getRange(last,1,last - 1,4).getValues() 
  console.log(eventDate)
  
  

  // カレンダーIDの取得
 const calendarId = eventDate.reduce(
  (
    previous, [date, calId, eveId1,eveId2]
  ) => `${previous}${calId}`, ''
  )

  //イベントIDを生成する
      // イベントID(前半の取得)
    const eventId1 = eventDate.reduce(
      (
        previous, [date, calId, eveId1,eveId2]
      ) => `${previous}${eveId1}`, ''
      )

    // イベントID(後半の取得)
    const eventId2 = eventDate.reduce(
      (
        previous, [date, calId, eveId1,eveId2]
      ) => `${previous}${eveId2}`, ''
      )

    const eventId = eventId1 + `_` + currentDate + eventId2
    console.log(eventId)
      
  
  // GoogleCalendarから予定を削除する

    // カレンダーを取得する
    const calendar = CalendarApp.getCalendarById(calendarId)
        // console.log(calendar)

    // イベントを取得する
    const event= calendar.getEventById(eventId)
        // console.log(event)

    // イベントを削除する
    event.deleteEvent()
  


}

トリガー設定

【材料③】Slackワークフロー設定

全体のフローの順番としては、以下の通り

  1. slackワークフローをスケジュールで起動する
    悲しいことに、slackワークフローは分岐を持っていないので、「アジェンダあり」と「アジェンダなし」の2つ分を作成する必要がある

  2. MTGオーナーが開催可否を判断し、slackワークフローのボタンを押下

  3. (GASを使うため)スプレッドシートに書き込み

  4. GASが起動され、書き込まれた情報をもとに対象のスケジュールを削除する

注意事項としては、MTGの削除権限はスケジュールの主催者しかなく、GASでの実行時も「主催者」の権限によって消す必要があるため、トリガーオーナーとスケジュールの主催者を一致させてください。


 「アジェンダあり」のワークフロー

最初に簡単な「アジェンダあり」通知から作りましょう。

ワークフローの設定は以下の通り

  1. ワークフローのトリガー: スケジュールから (例 15:01)
    会議前の時間を指定しましょう。

  2. 指定したチャンネルにメッセージを飛ばす

    1. MTGオーナー等会議の開催可否を決める人などにメンション

    2. 「アジェンダはあります」のボタンを設置

  3. スレッドにメッセージを返信する

    1.  会議の参加者全員のメンションを記載

    2. 会議が開催される旨を記載

 「アジェンダなし」のワークフロー

ワークフローの設定は以下の通り

  1. ワークフローのトリガー: スケジュールから (例 15:00)
    会議前の時間を指定しましょう。

  2. 指定したチャンネルにメッセージを飛ばす

    1. MTGオーナー等会議の開催可否を決める人などにメンション

    2. 「アジェンダはありませんでした」のボタンを設置

  3. 先ほど作ったスプレッドシートを指定し設定する

    1. スプレッドシートに(新規)追加する を選択
      ※ ここは後で詳しく説明します。

  4. スレッドにメッセージを返信する

    1.  会議の参加者全員のメンションを記載

    2. 会議がスキップとなった旨を記載

slackワークフローのスプレッドシートの設定について

設定イメージは以下の通りですが解説が必要なので解説していきます。

スプレッドシート/シート
基本的には先ほど作成したスプレッドシートとシート名を指定してください。

日時
これは、ワークフローを開始した時間などユニークな時間を入れておきましょう。

GoogleカレンダーID
これは、予定のオーナーのメールアドレスを指定してください。

イベントID
これは、Googleカレンダーの当該予定より「イベントID」を取得したものをここにあてはめます。

イベントID取得方法

【1】デバッグモードでGoogleカレンダーを開きます
https://calendar.google.com/calendar/u/0/r/week?gsessionid=OK&eventdeb=1

【2】今回利用したいカレンダーの予定を「編集」画面へ行き、「その他の操作」をクリック

デバッグモード時にだけ出てくる項目

【3】 トラブルシューティング情報を選択すると以下モーダルが出てきます

トラブルシューティングのモーダル

イベントIDは、一つ目の赤枠「1u7ept7hnpom9v6s50c61qjrkb」です
※ もちろん皆さんが設定されるときは、ご自身のイベントIDを使ってくださいね。

イベントID後半

以下画像の最後の赤枠の値を利用します。
「T」から始まり「Z」で終わる値をそのまま使いましょう。
今回の例の場合は、「T10:00:00Z」ですね。

これはカレンダーの開始時刻を表すものです。
日付については、GAS側で自動取得し自動で当日の日付に変更します。

トラブルシューティングのモーダル

これでワークフローの設定は完了です!

ワークフローの「公開」を押して、スケジュールを待ちましょう!

実際には?

こんな感じの通知を飛ばしています!
(弊社CTOがMTGオーナーなのでメンションが飛んでたり、追加事項があればコメントしたりしています)

「アジェンダなしです」が押された場合のメッセージ

上記2枚目の画像のタイミングでGASが動きカレンダーから予定を削除します。

ただし、メッセージの通り予定の時間や日付を変更した場合はうまく動かないので、手動での対応が必要です。
※ もう少し手の込んだものを作ればその辺も解決できるものはできると思います!

さて、「slackでGoogleカレンダーの予定を削除するslackワークフローを作りました!」はいかがでしたでしょうか?
GASをもう少し工夫すればもっといいものが作れますが、今回はコスパやタイパを考慮してこんなもんかな、というものでしたので、ぜひGASできる方はブラッシュアップいただければです!

slackワークフローを2つ使わねばいけないので、分岐が早く機能としてできるといいなぁ・・・・・・と願っています(祈る)

さいごに

私の働いているファンズという会社の紹介をさせてください!

ファンズでは、1円から投資ができる資産運用サービスをメインに運営・開発をしていますが、そこのノウハウを使って不動産事業など様々な事業も今増えています!

是非私のポジションあるかしら?と思われた方は以下リンクから一読くださいね!

もちろんQAエンジニアのも募集していますので、上記リンクからカジュ面のお申込みでもよし、私のXアカウント↓↓↓に気軽に絡みに来てくださっていても問題ありません・・!

最近は飼い始めたネコチャンに夢中でずっと猫ばかりpostしてますが..👼笑

さてさて、ここまでお読みいただきありがとうございました!
また次回の読み物もお楽しみに!

ファンズの中の人@SHIO


この記事が気に入ったらサポートをしてみませんか?