「Notion」のDBのフィルターを、別DBからチェックボックスで可変的に設定する

# 目次
[概要](#概要)
[まずは結果](#まずは結果)
[使用データベース](#使用データベース)
[数式の内容](#数式の内容)
[おわりに](#おわりに)
[参考](#参考)


# 概要
Notionを使い始めて、「**save to notion**」という神拡張機能を見つけて使ってみたのですが、記事を保存しても過去の記事を見返す際に探すのが大変だなぁと思いました。<br>
それぞれの記事にプロパティで、「Notion」や「プログラミング」など付けても、毎回フィルタで探したいプロパティを設定するのはナンセンスだと感じたので、今回は別のデータベースにプロパティと同様の名前のページを作成し、そのチェックボックスを押すことで、フィルタと同じ機能を実装しようとしました。

:::note warn
こういった記事を書くのは初めてなので、見にくかったら申し訳ないです。
:::

# まずは結果
![notionGIF.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896198/b69ff2bc-2cc7-05d5-bb7d-ba37eea085c5.gif)
※画質悪くてすいません

このように、左側にあるデータベース（以下、**検索用DB**）のチェックボックスの内容でフィルターをかけるようになっています。

:::note
今回は、プロパティAとBの両方を満たすフィルターではなく、
AもしくはBどちらかを満たすフィルターになっています。
:::

# 使用データベース

DB|内容|
:---------------:|:---------------:|
save to notion DB| 拡張機能の保存先（マルチセレクトプロパティ必須）|
↑↓|<font color="blue">`リレーション`|
master DB| 仲介用|
↑↓|<font color="blue">`リレーション`|
検索用DB| チェックボックスのやつ（チェックボックス必須）|

今回は上記のような構成でDBを作成しました。
直接DBを繋げるのではなく、**master DB**を仲介することで、DBをさらに増やすことになっても新しいDBを**master DB**とリレーションすることで、今まであったものに操作を加える必要がないから便利です。

:::note warn
すべてのDBがmaster DBを仲介するので、テンプレートの設定が必須
![スクリーンショット 2024-09-27 222112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896198/17a64ce6-9739-b4c4-18a8-ea311efafcea.png)

master DBは各DBと相互リレーションする
![スクリーンショット 2024-09-27 230420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896198/9bdc409e-b45f-d54e-5a6f-2625a473f7d7.png)

参考までに自分の**save to notion DB**と**検索用DB**
![スクリーンショット 2024-09-27 230702.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896198/d95c732a-3a1e-dc57-0715-df9a4b022413.png)
![スクリーンショット 2024-09-27 230838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896198/f300f5bc-e184-5b05-e34b-7135ebd784f4.png)
※チェックボックスの<font color='green'>`プロパティの名前`</font>は設定し終わってから消さないと設定できないです
:::

# 数式の内容
実際にフィルターをかけている数式プロパティの内容は以下の通りです。

```python
lets(
	tag, prop("master DB").at(0).prop("検索用DB").filter(current.prop("/*チェックボックス*/")).map(current.prop("名前")),
	select, prop("マルチセレクト"),

	or(
		includes(tag, "== すべて =="),
		and(includes(tag, "==   既読   =="), prop("状態") == "既読"),
		and(includes(tag, "== 進行中 =="), prop("状態") == "進行中"),
		and(includes(tag, "==   未読   =="), prop("状態") == "未読"),
		includes(select, tag.at(0)),
		includes(select, tag.at(1)),
		includes(select, tag.at(2))
	)
)
```

この数式プロパティは**save to notion DB**に追加します。

　最初の行は、
**save to notion DB**　　　　　　の、
**master DBリレーション**　　　 から、
**master**　　　　　　　　　　　にアクセスし、
**検索用DBリレーション**　　　 　にアクセスし、
**チェックボックス**　　　　　　がオンの項目をフィルターし、
**名前プロパティ**　　　　　　　をテキスト形式に変換したリストを、
**tag**　　　　　　　　　　　　 という変数に格納しています。

つまり、「Notion」と「YouTube」にチェックが入っている場合、**tag**には「Notion,YouTube」という内容のリストが格納されます。

　2行目は、**select**という変数にページごとに設定されたプロパティが格納されます。

　or関数の最後の3行は、**select**のリストに**tag**で指定した内容があるか見ています。**includes関数**の第2引数はリストに対応してないので、**at関数**でごり押ししています。

:::note warn
**tag**を４つ以上指定する場合は、at(3)にしたものを追加します。
:::

<br>
　or関数の最初の4行はselectプロパティの指定ではなく、「状態」というどこまで読んだかを指定するプロパティを設定しています。（※なくてもいい）


:::note warn
**save to notion DB**で指定したマルチセレクトのプロパティと**検索用DB**に追加する名前は一言一句あってないと、うまく動かないのでコピペ推奨です。
:::

<br>
設定が終わったら、追加した数式プロパティでフィルターをかけることで、可変的なフィルターの完成です。

![スクリーンショット 2024-09-27 232121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896198/0bc9f003-9e76-b623-bca2-e09433acc9e9.png)

# おわりに
今日思い立って、Qiita登録して、Githubにpushするだけで記事を投稿する設定をして・・・
と、色々手間取って3時間くらいしてから記事を書き始めて、さらに書き方なんかも調べながらだったので、すごく分かりにくかったと思いますが、また気が向いたら修正しようと思います。

# 参考
・master DBというアイディアを使わせてもらいました
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/IFbaeuAInW8?si=PcyAk3qqwaqHxNy4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

・書き方関係

https://qiita.com/Qiita/items/c686397e4a0f4f11683d#blockquotes---%E5%BC%95%E7%94%A8

https://qiita.com/sakekasunuts/items/c498654481e2c83497d3#%E8%A1%A8

https://qiita.com/Cookie_Iwate/items/7941a5d71a6c4c3af31a#%E3%83%AA%E3%83%B3%E3%82%AF%E6%8C%BF%E5%85%A5

https://qiita.com/Kanako9581/items/c41ddc14fa39d1c66c27

・GIFの作り方

https://qiita.com/naoyuki2/items/bb195f9f6357313407a3