Notionでif関数を使用して「文字列が●●の時、~~」という式を書きたい時にエクセル関数との違いに苦戦したので、文字列を判定したい時の書き方についてまとめました。
結論、「マルチセレクト」プロパティの値を判定しようとしたためハマってしまったようです。
「==」で文字列の判定ができない?
例えば下のようなデータベースがあり、タグAが含まれる場合を判定したいとします。
3行目は後述の検証のため2つ選んでいますが、ここでは1行目にだけチェックが入ってほしいです。

エクセルの感覚だと、=""で囲ってやれば文字列を判定してくれるので同じように書いてみましたが、結果はすべてfalseになってしまいました。
構文if(条件,真の場合,偽の場合)
if(prop("タグ") == "タグA", true , false )数式は結果がtrue/falseになる場合は自動でチェックボックスになるよ
contains関数、test関数で解決


正解はcontainsやtestなど、結果がtrue/falseで返される関数を使います。どちらも同じ結果になります。
構文contains(値,検索文字列)test(値,正規表現)
contains(prop("タグ"),"タグA")
test(prop("タグ"),"タグA")関数の一覧や使い方はNotionヘルプセンターにあります。(ちょっと分かりづらいですが)
ここでcontainsは「値に検索文字列が存在する場合はtrueを返します。」と記載があり、文字列を検索できることが分かりました。
また、testは「値が正規表現と一致する場合はtrueを返し、それ以外の場合はfalseを返します。」ということで、文字列だけではなく正規表現での検索ができます。
正規表現とは、おおざっぱに言えば「数字●桁」「××を含む文字列」「●で始まって×で終わる」など幅広い検索が可能になるよ
結果として文字列を返したい場合


さきほどの例は結果がtrue/falseになるためチェックボックスで出てきました。
では、文字列を返したい場合はどうすればいいか。
ちょっと面倒ですが、containsやtest関数でtrue/falseを返したあと、if関数で囲います。
構文if(条件,真の場合,偽の場合)contains(値,検索文字列)
if(contains(prop("タグ"),"タグA"),"●","×")
if(test(prop("タグ"),"タグA"),"●","×")「==」で判定できるもの
Notionのif関数で==を使っても文字列の判定ができませんでした。
では、==はいつ使うのか??ということで色々試した結果、どうやら例外条件を引いてしまっていたようです。
返り値が1つではない場合は==が使えないという認識ですが、あってるかな・・・。
| 判定できる | 判定できない |
|---|---|
| true/false 「タイトル」プロパティ 「数値」プロパティ 「ステータス」プロパティ 「セレクト」プロパティ 「テキスト」プロパティ | 「マルチセレクト」プロパティ 「リレーション」プロパティの一部 |
「リレーション」プロパティについて
試しているうちに分からなくなってきましたが、これについても返り値が1つではない場合(リストの場合)は==での判定ができないようでした。
どれも2行目「タイトル2」をtrue判定にしたくて式を書いています。うまくいったのは3番目の式のみ。


/*1:サンプルの「タグ」が"タイトル2"だったらtrue*/
if(prop("サンプル") == "タイトル2", true , false )
/*2:サンプルの「if+contain関数」が"×"だったらtrue*/
let(判定,prop("サンプル").map(current.prop("if+contain関数")),if(判定=="×",true ,false ))
/*3:サンプルの「if+contain関数」が"×"の列をフィルターし、空欄じゃない場合true*/
let(判定,prop("サンプル").filter(current.prop("if+contain関数")=="×" ).map(current.prop("タグ")),not empty(判定))
/*4:サンプルの「if+contain関数」が"×"の列をフィルターし、結果が"タグB"の場合true*/
let(判定,prop("サンプル").filter(current.prop("if+contain関数")=="×" ).map(current.prop("タグ")),if(判定 == "タグB",true ,false ))2番目の式はprop("サンプル").map(current.prop("if+contain関数")を変数定義していて、この変数の結果は1行目から順に● × ●となります。
3番目と4番目の式はprop("サンプル").filter(current.prop("if+contain関数")=="×" ).map(current.prop("タグ"))を変数定義していて、この変数の結果は1行目から順にタグA タグB タグA,タグBとなります。
最終判定にemptyを使用するとうまくいったよ
4番目はワンチャンいけるかなと思ったけどダメだった・・・
おわりに
Notion使いの方には常識かもしれませんが、最近使いだしたのでまだまだ勉強中です。
いろいろ試しているうちになんとなく分かったような、分からないような・・・。
とりあえず「==で判定できない場合もあるんだな」という発見にはなりました。
これでできることの幅もだいぶ広がると思います!

