MakeでNotionで作成した勉強会日程をGoogleカレンダーに同期

## 勉強会の内容と日程を管理・共有するのが面倒

**みなさんの会社は、勉強会などはどれくらいの頻度で実施していますか？**

僕のチームは、チームメンバーが一人辞めたこともあり、引継ぎや技術の共有をしておかないといけないな、ということと、経験の浅いメンバーが多いことから、勉強会をこまめに実施していくこととなりました。

頻度的には、二週間に一度だったのか、一週間に最低は一回実施することになっています。
多いときは、毎日のようにやっているときもありました(引継ぎもありましたが)。

勉強会の日程や内容の管理は、Notionの無料枠を用いて行っています。

しかし、あくまでチーム内で管理しているだけなので、チームメンバー以外は編集することはもちろん、**閲覧することもできません。**
だから、僕のチームの勉強会の日程は、他のチームには公開されないこととなります。
それは流石にまずいので、今は部署の予定を入れているGoogleカレンダーに手入力しています。

**これが結構面倒な作業で、勉強会の日程や内容が変わったときにもいちいち修正しないといけないのがすごく面倒でした。そしてその役割は僕の役目になっていたので、どうにかしたいなと思っていました。**
(Notionのページを「共有」するのも考えましたが、いちいち見てもらう必要もありますし、そもそも外部に公開はしたくない)

ということで、今回はそんな面倒な作業を自動化するべく、**[Make](https://www.make.com/en)というiPaaSと呼ばれるツールを使って自動化してみました！**

## やりたいこと

以下の2点の機能を制作したいと思います。

- NotionのDatabaseに勉強会の内容が追加されたら、Googleカレンダーに予定を作成する
- NotionのDatabaseが更新されたら、Googleカレンダーの内容も更新する


## 作成手順

### 使用したツール

以下のツールを使用しました。

- [Make](https://www.make.com/en)
- Google Sheets(以下スプレッドシート)
- Google Calender(以下Googlカレンダー)
- Notion

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/46092917-0275-c400-e954-744699a6c3bb.png" width="80%" >

> 以下、シナリオ参考
> スプレッドシート参考URL：https://note.com/nocodejam/n/ne98d55d5c11d
> Googleカレンダー参考URL：https://nocodedb.world/archives/2496
> Notion参考URL：https://qunite.net/?p=1183

### 完成したMakeシナリオ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/8f3267f5-9c15-0e96-2b55-1674033187bc.png)

Makeシナリオとしては、Notionモジュールを基点とし、**Databaseに更新があればGoogleカレンダーに予定を作成、または更新するシナリオとなっています。**

処理の分岐方法としては、スプレッドシートにGoogleカレンダーに追加された勉強会を登録しておくことで、更新されたデータが、スプレッドシートに既に登録されていれば更新処理を、スプレッドシートに登録されていなければ、新規作成処理を実施するようにしました。


<details><summary><font color="Red">***** 詳しい処理や作成は以下に記載しているので、知りたい方は御覧ください *****</font ></summary><div>

全体構成図

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/7957c326-cef3-0a03-979c-2d3f208e35d9.png" width="80%" >


#### ①NotionのDatabaseの更新を検知

Notionは **「Watch Database Items」** を選択し、自分のNotionと接続して以下のように更新通知を検知したいDatabaseIDを設定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/c756da00-5f83-96ee-9a4a-b2138864abc5.png" width="40%" >

#### ②スプレッドシートから更新された行のIDを検索する

次にスプレッドシートの **「Search Rows」** を使用して、更新された行のIDがすでにGoogleカレンダーに登録されているか検索します。
このときの検索結果を元に、予定更新処理とするのか予定作成処理とするのか**Routerモジュール**を使用して分岐させます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/a276be5d-559f-8ec3-5b0e-4b304e13165e.png" width="30%" >


::: note
今回は「ソフト勉強会概要」という名前のスプレッドシートの中に「勉強会」のシートを事前に作成しています。
:::

#### ③Routerを使って分岐

②にてスプレッドシートから取得した**「Row number」**の有無で分岐させています。検索結果があれば、どの行に該当のIDがあるか、行番号が入っています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/fde942e7-3506-851f-ac40-8db4ffa4d609.png" width="30%" >

#### ④予定の作成

Googleカレンダーの予定の作成は **「Create an Event」** モジュールにて実施します。
自分のアカウントと接続後、予定を作成するカレンダーのIDを入力します。

::: note
カレンダーIDはプルダウンから、接続したアカウントのカレンダーを選択することができます。
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/a0aee943-3443-217d-c5bb-e4704d291801.png" width="30%" >

次に予定の内容をNotionから受け取ったデータを元に作成します。
このとき、画像下の **「Show advanced settings」をONにしてください。** OFFだと入力できる項目が限られます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/5b9d2b0d-ebe4-5206-8b86-7e566abccce3.png" width="30%" >

最後に、スプレッドシートに作成した予定内容を控えておきます。
このとき、必須項目としては「ID」「カレンダーID」「イベントID」となります。
**「カレンダーID」「イベントID」は、更新するときに必要な項目です。**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/13714b95-7c32-e431-b2e6-04661ee1af8d.png" width="30%" >

#### ⑤予定の更新

Googleカレンダーの予定の作成は **「Update an Event」** モジュールにて実施します。
作成時と違うところとしては、**「Calender ID」に加えて「Event ID」** を指定する必要があります。
こちらは、②にて取得したスプレッドシートのデータを入力します。

::: note
「Event ID」はそれぞれの予定に対して割り振られるIDで、同時刻、同内容でもこのIDが違うと別の予定と認識されます
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/366c9426-08ad-4dab-424b-afef4593b32f.png" width="30%" ></br>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/32494259-5142-9be3-1b7a-16f8d3cadf5b.png" width="30%" >

最後にスプレッドシートの内容も更新しておきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/6d2df5e1-a70f-e95c-2011-9fa063f50ecf.png" width="30%" >

</div></details>

### 実行タイミング

Notionは、更新を検知したらシナリオを実行する。
という方式はとれないようなので、スケジュールにて1日に1度、Databaseが更新されていたらシナリオを実行するようにしました。

## シナリオ動作

### 新規勉強会追加時

NotionのDatabaseに勉強会を追加します。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/a53bd375-c3d1-9136-fb21-acc3fff7114f.png" width="80%" >

自動的にGoogleカレンダーに勉強会の日程が共有されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/bda2e8c9-2c99-e408-4469-d4406090988c.png" width="40%" >

### 勉強会の日程を変更する

先ほど作成した予定の、日時を変更します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/43a9117f-5a5b-344d-3d74-638bc8ab8b7a.png" width="80%" >


勉強会の日時が変更されています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/84646b6a-75a2-8b87-b315-5d9547d7de96.png" width="40%" >

## 同僚にみてもらった

他のチームの同僚に見てもらいました。
またMakeがあまりにも素晴らしかったので、作り方なども紹介しました！

::: note
感想
- 複数で管理する必要がないのは良い
- 予定が変更されたのに、前の予定が残っていて混乱するときがあるから、更新処理ができるのが良い
- Notionが更新されたタイミングで、すぐに予定を入れて欲しい気もする
- Googleカレンダー側で入力されたものも同期できないか？
:::

最後2つに関しては、確かに課題ですね。
更新のタイミングは、無料枠で最小15分で実施できるので、そうするとある程度リアルタイム性は持たせられるんじゃないかと思っています。ただし、実行回数が制限に掛からないか心配ではありますが、、、
Googleカレンダーから、同期する処理に関しては、試したのですが、単純にスプレッドシートと同期するような処理なら簡単にできそうではありました。
しかしNotionのようなDatabaseと同期させるとなると、入力されたデータをカラムに対して同期する必要があるので、できそうだけど、どうすれば良いんだろう？という具合です。
このあたり、今後も調べていけたらと思います。

## 最後に

Make、とても良いサービスなので、ぜひ皆さんもお使いください！
**ただし、仕事中に少しでも触ってしまうと楽しくて業務を忘れてしまうかもしれないので要注意です！**

最後までお読みいただきありがとうございました！