Zapierで今までNotionにまとめた知見を定期的にリマインドする Remindal

この記事は [気になるWeb API使ってみた Advent Calendar 2024](https://qiita.com/advent-calendar/2024/webapi)の21日目の記事です。

Zapier経由でNotion APIを叩いてみました。「気になるWeb API使ってみた」の趣旨からは少しずれるかもしれませんが、どうぞお付き合いください。

## はじめに 
私はその日に学んだことを日報としてNotionにまとめています。
しかし、大体は書いて満足してしまいなかなか見返すことがないため、
知識が定着せず一過性のものになってしまっていることを痛感していました。

そこで、毎日決まった時間にランダムで今までに書いた日報のどれかをピックアップしslack通知する ***Remaindal*** を作ってみました。
(名前はChatGPT先生と一緒に考えました。昔のコンテンツを思い出させる意味を込めてReminder + Revivalです笑)

[Zapier](https://zapier.com/app/home)で想像以上にサクっとできたので記事に残します。


## Zapierとは

ざっくりIFTTTみたいなものだと理解しています笑
ローコードの自動化ワークフロー作成サービスです。
さまざまなWebサービスからの情報や時刻などをトリガーに、また別のWebサービスのAPIやWebhookを叩いたりできます。

## つくったもの Remindal 

普段、以下の画像のようにNotionのカレンダービューに学んだことを日報としてまとめて登録しています。
![Notino_日報.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/9672d5b8-969b-cd77-5fd5-8cb74ba0ea91.png)

2022年から続けているので結構知見が溜まってきたのですが、見返すことなくただただ溜まっていく状態になっています。

これらの日報の中からランダムでピックアップした日報を、毎日決まった時間にslackで通知するようにしました。
日報の本文が流れるのは嫌だったので、URLのみ流すようにしています。

![zapier_通知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/c9c68570-c8b5-4bf5-93b1-83db3a548194.png)

## つくり方

### ワークフロー全体
Googleログインで会員登録をし、「Zaps」を新規作成しました。ワークフローの全体図は以下の通りです。
![‎‎ワークフロー全体.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/0c2bd122-561d-7b49-8d30-4d6c6202dbcf.jpeg)


### ①トリガー 毎日決まった時間にトリガーさせる

Zapierに元々ある機能です。
フローの最初に「Schedule by Zapier」を選択し、頻度をEvery Dayとします。
その後、時刻と週末の実施有無を聞かれたので、朝7:30に週末含めて通知するようにしました。

(Zapier自体のロケール設定を東京にし忘れたので、実際には+9hの16:30に通知されています笑 が、特に気にならないので修正していません)

![‎1_trigger.‎001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/8ae887f3-9e61-fd3f-a1ff-578f193f8bb9.jpeg)

### ②アクション Notionの日報のDBのアイテムを取得
フローの2番目に「Notion」を選択し、Action Eventに「API Request(Beta)」を選択します。これを選択すると、Notion APIをそのまま叩くことができます。
DB(ここでは日報)のアイテムを1つ取得するだけであれば「Find Database Item」でも検索条件を設定して上位1件を取得することが可能ですが、今回は全て取得後にランダムでピックアップしたかったのでNotion APIを叩くことにしました。

次に、Accountをクリックすると、接続したいNotionでログイン後、取得するDBのページを選択できます。
![‎2_notion_1.‎001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/2e8e6c89-d939-bb94-1482-c3775d1067de.jpeg)

Configureタブに移り、叩くAPIの内容を設定します。Notion APIの[Query a database API](https://developers.notion.com/reference/post-database-query)を使用することにしました。

Notion APIを使用するには、インテグレーションを作成する必要があります。インテグレーションの作成方法は以下の記事が大変参考になりますので、こちらをお読みください。ここではかいつまんで説明します(※韓国語表示になっていますすみません...)。
[Notion APIを使ってデータベースのデータを取得する ｜ Zenn](https://zenn.dev/hid3/articles/f0bdc73438de87)

インテグレーション作成時に、生成されるAPIシークレットを控えておきます。
![‎APIシークレット.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/b2361802-7f35-ea96-0418-8c5961695f66.jpeg)

また、Notion APIを使用したいDB(ここでは日報)にインテグレーションの権限を与えておきます。
![‎権限つけ.‎001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/86c0d1f5-36ad-7b1a-527a-eebbdc1f8084.jpeg)

さらに、Notion APIを使用したいDBのIDを控えておきます。DBのIDは、そのページをブラウザで開いたときのURL上に現れます。以下の `xxxxxxxxx` の部分です。

```
https://www.notion.so/xxxxxxxxx?v=aaaaaa
```

ここまでくると、Zapierに戻りConfigureを入力することができます。

[Query a database API](https://developers.notion.com/reference/post-database-query)の定義通り、HTTP Methodは「POST」、URLは `https://api.notion.com/v1/databases/<先ほど控えたDBのID>/query` にします。
Query String Parametersはありません。

Additional Request Headersには、AuthorizationヘッダとContent-Typeヘッダを設定します。APIの定義ではNotion-Versionヘッダが必須となっていますが、Zapier側で設定されているようなので不要です。余談ですが、最初これに気づかず設定してしまい、ヘッダ重複のエラーを吐かれてしまいました...
Authorizationには `Bearer "<控えておいたAPIシークレット>"` を、Content-Typeには `application/json` を指定します。

![‎2_notion_2.‎001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/25f9cf03-dae0-b816-cc41-da43f19f1ee7.jpeg)


### ③アクション 取得したアイテムのURLをランダムにピックアップ
フローの3番目に「Code by Zapier」を選択し、2で取得した日報のアイテムをランダムでピックアップするコードを書きます。Action Eventには「Rn JavaScript」を選択しました。

その後Configureタブに移ります。Input Dataの左側にはコードで利用する任意の変数名を入力し、右側はプラスマークを押して2番 > 「Response Data Results Url」を入力します。これで、1つ前のステップで取得した日報のアイテムのうち、URLのみをカンマ区切りで全て変数に保存することができます。

その後、Codeでカンマ区切りのURLを配列に直し、ランダムに配列の値をピックアップしています。最後に、returnでオブジェクトとしてURLを次のステップに引き渡しています。

![‎3_javascript.‎001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/1f94fb66-0952-43c6-9a63-facda12e38ba.jpeg)

```javascript
// Code に書いたコード
const pageURLs = inputData.pageURLs.split(',');

if (!pageURLs || pageURLs.length === 0) {
    return { pickedUpPage: "ページを取得できませんでした" };
}
const randomIndex = Math.floor(Math.random() * pageURLs.length);
return { pickedUpPage: pageURLs[randomIndex] };
```

### ④アクション slackの特定のチャンネルに投稿

フローの最後に「slack」を選択し、Action Eventに「Send Channel Message」を選択します。次に進む前にメッセージを送りたいチャンネルを作成しておきます。

次に、Accountをクリックすると、接続したいslackのワークスペースにログイン後、連携させることができます。

![‎4_slack_1.‎001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/cbe97162-edef-77f6-f4b5-e6b41a227465.jpeg)

Configureタブに移り、slack通知の設定をしていきます。
Channelには通知を送りたいチャンネル名を選択します。
Message Textの欄はプラスマークを押して3番 > 1つ前のステップから引き渡されたオブジェクトの `pickedUpPage` というプロパティを選択します。これで、メッセージの本文にランダムで選択された今までの日報のURLを入れることができます。
その他、botの名前やZapのリンクを含めるか、URLを展開するかなど聞かれますが、任意の回答をします。

![‎4_slack_2.‎001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/e86e6c79-94b8-a780-78d1-544f044fbced.jpeg)

これで毎日決まった時間にslackで過去の日報がピックアップ通知されるようになりました！

![zapier_通知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130420/c9c68570-c8b5-4bf5-93b1-83db3a548194.png)


## おわりに
毎日特定の時刻に過去の日報を見るよう促す通知が来るようになったので、意識的に振り返るようになりました。

しかし、忙しくて時間がないときは通知が来ても見るのを諦めてしまったりと、自分の意志で見にいく形式だとまだまだ効果不足を感じるので、自分から情報を取りにいかなくても隙間時間に自動的に頭に情報が流れ込むようにしたいです。