結論
類似した記事にしたがって、Make のシナリオを書きました。
モチベーション
子供が大きくなると子供の予定も複雑になります。今日はプール道具を持っていくとか、今日は体操服を着て幼稚園に行くとか。あるいは早めに迎えに行くとか。今までは Google Calendar で共有イベントを作って管理していました。
今は母と同居していて、母にもいくつかの予定は共有したいです。母にも Google Calendar を見てもらいたいので、共有カレンダーを作成しました。ただ、毎回見てもらえるかとか不安があるので、ついでに Slack に予定を自動で流せないかと調べてみました。
Slack アプリは使えない
結論から言うと、Slack で Google Calendar の共有カレンダーの予定を特定のポストに流すのは、現在 Slack アプリ単体ではできません。Google Calendar for Team Events という Slack アプリが現在サポートが止まっていて、新規にインストールできません。
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] と検索しました。
- https://zenn.dev/readyfor_blog/articles/e1e55a8f9d1d8e Make を使う
- https://azospiran.hatenablog.jp/entry/2023/04/06/120816 IFTTT を使う
- https://www.reddit.com/r/Slack/comments/ya9nm0/google_calendar_for_team_events_alternatives_with/ 開発者コンソールを使うとまだ当該アプリを入れられるよ。おいおい。
- 上に書いた通り、すでに動作が怪しいのでこの解決策は採用できません。
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}}
これを毎日20:30 に流します。以下のようなメッセージが「予定」チャンネルに流れます。下のものはテストなので別の日付の予定が一緒に流れていますが、本来は一日分の予定が流れます。
よかったところ:
- 最終的にちゃんと動きました。
- 「全体をテストする」ボタンがあるので、テストができます。
よくなかったところ:
- 上にある通り、見つけたテンプレートの説明と挙動が全然違いました。さんざん試した挙句、結局いちから書き直しました。
- 「このモジュールだけテストする」ボタンは後段のイベントにはうまく動きません。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 が難しくて設定に少し手間取りました。