家族のイベントを共有 Google Calendar で管理し、予定を Slack のチャンネルに流すために Make を使った
結論 類似した記事にしたがって、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] と検索しました。 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 が難しくて設定に少し手間取りました。