モチベーション
子どものラグビースクールのスケジュールがサークルスクエアで管理されているのですが、サークルスクエアは度々セッションが切れてしまいその度にログインを求められ、イベントリストを確認するときに煩わしさを感じていました。
そのため、ノーコード自動化ツールのMake(旧Integromat)を使ってサークルスクエアのイベント情報をGoogleカレンダーに転記する仕組みを作ったので紹介します。
構成
2つのシナリオから構成されます。
- 前半シナリオ
- 後半シナリオ
- Googleスプレッドシートへの新規データ追加をトリガーに そのイベント情報をGoogleカレンダーに登録する
前半シナリオの各モジュールの詳細
イベントリストの取得
Makeのみでサークルスクエアにログインしてイベントリストを取得するのが難儀だったのですべてをMakeで完結させることは諦め、ここは自前のWebサービスを作ることにしました。
将来、サークルスクエアがAPI公開してくれればMakeのみで完結できるのでそれを期待したいところ
コードは以下 github.com
Heroku等にデプロイすればWebサービスとして動きます。
なお、アカウントとパスワードをこのWebサービスに送信することになるのでコード流用するときはそれを留意してお使いください。(アカウント情報をこっそり保存したりするmalwareではありませんがコードご確認の上ご利用ください)
HTTP Make a request モジュールを使って自前のイベントリスト取得用WebサービスにAPIアクセスします
入力は上記のアカウント情報と取得したいイベントの日付(対象月)になります。
HTTPパラメータは以下のような感じです。
応答は以下のようなJSON文字列が返ってきます
[ {"name":"イベント1","start_time":"2023/9/3 09:00","end_time":"2023/9/3 11:30","url":"https://www.c-sqr.net/events/xxx"}, {"name":"イベント2","start_time":"2023/9/4 09:00","end_time":"2023/9/4 11:30","url":"https://www.c-sqr.net/events/yyy"} ]
前月に翌月分のイベント情報を取得したい場合と当月分のイベント情報を取得したい場合があるので リクエストパラメータのdateの値を自動的に決めることができず、HTTPモジュールのパラメータを適宜、手動設定する必要がありそこは残課題です。
JSONパース
Webサーバーからの出力されたJSON文字列をパースします
Iterator
イベント1個ずつ、Googleスプレッドシートに記録済みかを判定するので Iteratorを置きます。なお、Iterator は Flow Control の中にあります。
名前(name)でループさせます
Googleスプレッドシート
記録用のスプレッドシートはあらかじめ作っておき、それを指定します。
スプレッドシートのヘッダ行は
- A列: Event
- B列: Starttime
- C列: Endtime
- D列: URL
とします。
新規イベントかのチェック
Google Sheetsの Search Rows モジュールを使って新規イベントかどうかを判定します。
スプレッドシートの各列の情報とイベントリストのJSONの対応するキーの情報がすべてマッチするかどうかで判定します。
すべてマッチする場合は既存イベントとなり、1つでも一致しない列があれば新規データとしてみなします。
なので、サークルスクエア側でイベント更新があった場合は新規データとみなされます。つまり、イベント更新があった場合、元のカレンダーイベントも残っちゃうのでそこは今後の課題です。
新規データがあったかの判定
フィルターを作ります。
Googleスプレッドシートへの記録
Google Sheets の Add a row モジュールを使います。
後半シナリオの各モジュールの詳細
Googleスプレッドシートの新規データのトリガー
Google Sheets のWatch New Rows を使います。 新規の行が追加されていたらその行を抽出します。
SpreadSheet IDでスプレッドシートを指定し、Sheet Name でシート名を指定します。Limit は適当な値をセットします。
Iterator
Iterator を追加し、行ごとに処理させます。
時刻情報があるイベントとそうでないイベントの判別
Router を追加し、時刻情報があるイベントと時刻情報がないイベントに分岐させます。 それぞれにフィルターを設定します
- 時刻情報があるイベントのフィルター
- 時刻情報がないイベントのフィルター
Googleカレンダーへの記載
Google Calendar の Create an Event モジュールを分岐の先にそれぞれ追加します。
時刻情報がある場合は、All Day EventをNo、 時刻情報がない場合は All Day EventをYes にします。
あとは
- Event Name: 1. Event (A)
- Start Date: 1. Starttime (B)
- End Date: 1. Endtime (C)
- Description: 1. URL (D)
とし、スプレッドシートの記載内容をイベント情報に反映させます。
使ってみて
今のところ、適当なタイミングでMakeのダッシュボードから前半シナリオと後半シナリオを手動で実行して使っています。 スケジュールを確認したいとき、Googleカレンダーだけを確認すればよいのでそこはやはり便利です。
イベントリストの取得タイミングを月末などあるタイミングで固定すれば、取得したいイベントの日付(対象月)をMake上で自動で設定して定期実行できそうです。