結論

類似した記事にしたがって、Make のシナリオを書きました。

モチベーション

子供が大きくなると子供の予定も複雑になります。今日はプール道具を持っていくとか、今日は体操服を着て幼稚園に行くとか。あるいは早めに迎えに行くとか。今までは Google Calendar で共有イベントを作って管理していました。

今は母と同居していて、母にもいくつかの予定は共有したいです。母にも Google Calendar を見てもらいたいので、共有カレンダーを作成しました。ただ、毎回見てもらえるかとか不安があるので、ついでに Slack に予定を自動で流せないかと調べてみました。

Slack アプリは使えない

結論から言うと、Slack で Google Calendar の共有カレンダーの予定を特定のポストに流すのは、現在 Slack アプリ単体ではできません。Google Calendar for Team Events という Slack アプリが現在サポートが止まっていて、新規にインストールできません。

https://slack.com/intl/ja-jp/help/articles/360047938054-Slack-%E5%90%91%E3%81%91-Google-Calendar-for-Team-Events

Google Calendar for Team Events は廃止される予定です。 現時点では、廃止は更なる通知があるまで一時的に停止されています。最終的な廃止日がわかり次第、詳細をお知らせします。Google Calendar for Team Events との既存のインテグレーションはこれまでどおりに機能しますが、ワークスペースにこのアプリをインストールしたり、設定を新規作成したりすることはできません。

実際、使っている人でも、挙動がすでにおかしいと言っていたりします。 https://zenn.dev/readyfor_blog/articles/e1e55a8f9d1d8e

2023年1月の2週目あたりから、急にSlackへ通知されなくなってしまいました。

上の slack.com のページには代わりに Google Calendar Slack アプリを使えと書いてあるのですが、こいつは私の要求通りには動いてくれません。

  • 共有カレンダーが使うカレンダーリストに出てこない。
  • 特定のチャンネルに post したりしてくれない。

Google Calendar から Slack に情報を流す方法を探す

別の方法を探しました。[google calendar for team events alternative] と検索しました。

IFTTT か Make、あるいははじめの記事で参照されている Zapier あたりを試すのが良さそうです。自前で GAS を書いてもいいのですが、Google authentication と Slack authentication を管理するのが面倒そうだなと思いやめました。

Make を使ってみる

先例に習って Make を使ってみることにしました。

まず探したところ Make のこのテンプレートの説明がそのままだったんですが、想像していた挙動と違いました。こいつは Google Calendar を Watch Event するので、新たに作られたイベントが明日のものの場合、それを Slack に通知する、という挙動になります。明日のイベントを昨日以前に作っていた場合、なんの通知もありません。期待した挙動ではありませんでした。しばらく工夫していましたが、望んだ挙動にはなりませんでした。

結局自前でフローを描きました。だいたい以下のようなことを書きました。

- Google Calendar Search Events:
   -  Start Date: {{now}}
   - Order By: Start Time (ascending)
   - Singel Events: Yes (たぶん...)
- Filter: {{1.start}} less than {{setHour(addHours(now; 24); 23)}}
- Slack: Create a Message
   - Text: {{formatDate(1.start; "M月D日"; "Asia/Tokyo")}} の予定です: {{1.Summary}} ({{formatDate(1.start; "HH:mm"; "Asia/Tokyo")}} - {{formatDate(1.end; "HH:mm"; "Asia/Tokyo")}}): {{1.Description}}

Make に書いた Slack の設定

これを毎日20:30 に流します。以下のようなメッセージが「予定」チャンネルに流れます。下のものはテストなので別の日付の予定が一緒に流れていますが、本来は一日分の予定が流れます。

Slackでのメッセージ

よかったところ:

  • 最終的にちゃんと動きました。
  • 「全体をテストする」ボタンがあるので、テストができます。

よくなかったところ:

  • 上にある通り、見つけたテンプレートの説明と挙動が全然違いました。さんざん試した挙句、結局いちから書き直しました。
  • 「このモジュールだけテストする」ボタンは後段のイベントにはうまく動きません。Google Calendar Search events だけテストする、は動いています。しかし、その後の Slack: Create a Message を続けてテストしても、直前のカレンダーの実行結果は入っていないので、空のメッセージが出力されます。
  • Text format の UI がなにか変です。次に書きます。

Make の Text format UI が良くない

Text format の UI がひどく悪くてイライラしました。カレンダーの時間をそのまま出力すると “2023-07-16T02:00:00.000Z” のように人間向きでない表記が出てきます。そのため上記の通り formatDate をタイムゾーン付きで呼ぶ必要があります。しかし

  • 関数や変数は選択パレットから選ぶ必要があります。そうしないと単なる文字列として解釈されます。しかし、選択パレットから目的の関数/変数をマウスでクリックするたびに、それをおくべきテキストのカーソルが一番初めの位置に戻ります。そのまま配置しようとすると関数が行頭に置かれてしまします。さらに関数や変数はカットペーストやドラッグドロップで移動ができないので、間違って配置されたものは消して配置し直すしかありません。
    • チュートリアルを見たのですが、まず挙動が私のものと全然違って首を傾げます。
  • formatDate 関数はタイムゾーン付きのものを呼びたいのに、関数パレットから選択されるのはタイムゾーンなしの2引数のものしかありません。そして引数区切りの";" の入力方法がわかりません。結局 formatDate をもう一つ配置してそこから “;” だけ取ってきました。

Text Format を完全にキーボードで手書きできれば良さそうですが、その方法が簡単には見つかりませんでした。

終わりに

Google Calendar の共有カレンダーにある予定を Slack の「予定」チャンネルに一日一度流すために、 Make.com を導入しました。期待通りの設定ができましたが、 Make.com の UI が難しくて設定に少し手間取りました。