※本ページにはプロモーション(広告)が含まれています
Notionのデータベースで数式(Formula)プロパティが正しく計算されない、#ERRORが表示される、結果が空白になるという問題に困っていませんか?特に2024年のNotion Formula 2.0アップデート以降、従来の数式構文が動作しなくなったり、新しい構文への書き換えが必要になったケースが多発しています。
結論から言うと、Notionの数式エラーは、Formula 2.0への構文移行、データ型の不一致、リレーション参照の書き方ミス、日付計算の書式エラーなどが主な原因です。この記事では、よくあるエラーパターンと具体的な修正方法を、初心者にもわかりやすく解説します。

この記事でわかること
- Notion Formula 2.0と旧構文の違い
- 数式が計算されない・#ERRORになる主な原因6つ
- if文のネストとswitch文の正しい書き方
- 日付計算でよくある間違いと修正方法
- リレーション・ロールアップの参照方法
- 数式デバッグのテクニック
- 実用的な数式テンプレート集
Notion Formula 2.0とは?旧構文との違い
2024年にNotionは数式エンジンを大幅にアップデートし、「Formula 2.0」をリリースしました。従来の数式構文(Formula 1.0)とは書き方が異なるため、古い数式がそのまま動作しなくなるケースがあります。
| 項目 | Formula 1.0(旧) | Formula 2.0(新) |
|---|---|---|
| プロパティ参照 | prop(“プロパティ名”) | プロパティ名(直接記述) |
| if文 | if(条件, 真, 偽) | if(条件, 真, 偽) ※同じ |
| 空値チェック | empty(prop(“名前”)) | 名前.length() == 0 |
| 日付差分 | dateBetween(prop(“日付”), now(), “days”) | dateBetween(日付, now(), “days”) |
| 文字列結合 | “A” + “B” | “A” + “B” ※同じ |
| リレーション参照 | 不可(ロールアップ必要) | リレーション名.map(…)で直接参照可 |
| let変数 | lets(変数名, 値, 式) | lets(変数名, 値, 式) ※同じ |
数式が計算されない・#ERRORになる主な原因
原因1: prop()関数の不要な使用(Formula 2.0移行問題)
Formula 2.0では、プロパティ名を直接記述する方式に変更されました。旧式のprop("プロパティ名")は引き続き動作しますが、一部のコンテキストで予期しない動作をすることがあります。
旧構文(Formula 1.0):
if(prop("ステータス") == "完了", "✅", "⬜")
新構文(Formula 2.0):
if(ステータス == "完了", "✅", "⬜")
原因2: データ型の不一致
数式内で異なるデータ型を比較・演算しようとするとエラーが発生します。よくある例として、数値プロパティと文字列を直接比較するケースがあります。
エラーになる例:
if(金額 == "1000", "対象", "対象外")
正しい書き方:
if(金額 == 1000, "対象", "対象外")
数値プロパティは数値(クォーテーションなし)で比較する必要があります。
原因3: 空値(null/empty)の処理漏れ
プロパティが未入力の行がある場合、数式が空値を処理できずにエラーを返すことがあります。特に日付プロパティや数値プロパティが空の場合に発生しやすいです。
エラーになる例:
dateBetween(期限日, now(), "days")
(期限日が空の行で#ERRORが表示される)
正しい書き方(空値チェック付き):
if(empty(期限日), "", formatNumber(dateBetween(期限日, now(), "days")) + "日")
原因4: リレーションプロパティの参照ミス
Formula 2.0ではリレーションプロパティから直接値を取得できますが、リレーションは配列(リスト)として返されるため、適切なメソッドで処理する必要があります。
エラーになる例:
プロジェクト.ステータス
正しい書き方:
プロジェクト.map(current.ステータス).join(", ")
原因5: 日付計算の書式エラー
日付に関する計算はNotionの数式で最もエラーが発生しやすい部分です。dateBetween関数の引数の順序やフォーマット文字列を間違えるとエラーになります。
原因6: セレクトプロパティの比較方法の誤り
セレクト(Select)プロパティの値は文字列として扱われますが、マルチセレクト(Multi-select)プロパティは配列として扱われるため、比較方法が異なります。

対処法1: Formula 2.0の構文に書き換える
旧構文の数式をFormula 2.0に移行しましょう。以下の変換ルールに従ってください。
ステップ1: prop()を直接参照に変換
| 旧構文 | 新構文 |
|---|---|
prop("タスク名") |
タスク名 |
prop("優先度") |
優先度 |
prop("作成日時") |
作成日時 |
ステップ2: empty()関数の確認
Formula 2.0ではempty()関数は引き続きサポートされています。ただし、プロパティの型によって空値の判定が異なるため注意が必要です。
/* テキストプロパティの空チェック */
if(empty(タスク名), "未入力", タスク名)
/* 数値プロパティの空チェック */
if(empty(金額), 0, 金額)
/* 日付プロパティの空チェック */
if(empty(期限日), "期限なし", format(期限日))
ステップ3: 数式エディタで構文エラーを確認
- データベースのプロパティ設定を開く
- 数式プロパティの「編集」をクリック
- 数式エディタが開いたら、赤い下線や赤いバッジが表示されていないか確認
- エラーがある場合、エラーメッセージにカーソルを合わせると詳細が表示される
対処法2: データ型の不一致を修正する
数式内で比較や演算を行う際は、データ型を正しく合わせる必要があります。
数値と文字列の変換
/* 数値 → 文字列 */
format(金額) + "円"
/* 文字列 → 数値 */
toNumber("1000")
/* 数値を桁区切りで表示 */
"¥" + formatNumber(金額, ",")
/* 数値を小数点以下2桁で表示 */
formatNumber(金額 / 100, ".00")
チェックボックスの扱い
チェックボックスプロパティはtrue/false(Boolean)として扱われます。
/* 正しい書き方 */
if(完了 == true, "✅ 完了", "⬜ 未完了")
/* 省略形(推奨) */
if(完了, "✅ 完了", "⬜ 未完了")
/* 誤り: 文字列として比較している */
if(完了 == "true", "✅ 完了", "⬜ 未完了") /* ← エラーにはならないが期待通り動かない */
対処法3: if文とswitch文を正しく書く
基本的なif文
if(ステータス == "完了", "✅",
if(ステータス == "進行中", "🔄",
if(ステータス == "未着手", "⬜", "❓")))
switch文(Formula 2.0推奨)
複数の条件分岐にはif文のネストよりもswitch文がおすすめです。可読性が高く、エラーも起きにくくなります。
switch(
ステータス,
"完了", "✅",
"進行中", "🔄",
"未着手", "⬜",
"❓"
)
ポイント: switch文の最後の引数はデフォルト値(どの条件にも一致しない場合の値)です。デフォルト値を省略するとエラーになるため、必ず設定してください。

対処法4: 日付計算のエラーを修正する
日付関連の数式は最もエラーが多い部分です。以下の正しい書き方を参考にしてください。
日付の差分を計算する
/* 期限日まであと何日? */
if(empty(期限日), "期限なし",
lets(
残り日数, dateBetween(期限日, now(), "days"),
if(残り日数 < 0, "⚠️ " + format(abs(残り日数)) + "日超過",
if(残り日数 == 0, "📌 今日が期限",
format(残り日数) + "日後"))
)
)
dateBetween関数の引数
| 引数 | 説明 | 使用可能な単位 |
|---|---|---|
| 第1引数 | 終了日(大きい方の日付) | 日付プロパティ、now() |
| 第2引数 | 開始日(小さい方の日付) | 日付プロパティ、now() |
| 第3引数 | 単位(文字列) | “years”, “months”, “weeks”, “days”, “hours”, “minutes” |
日付のフォーマット
/* 日付を「2026年4月2日」形式で表示 */
formatDate(期限日, "YYYY年M月D日")
/* 日付を「04/02(水)」形式で表示 */
formatDate(期限日, "MM/DD(ddd)")
/* 時刻付き */
formatDate(作成日時, "YYYY-MM-DD HH:mm")
対処法5: リレーションとロールアップの数式を修正する
リレーションプロパティの参照(Formula 2.0)
/* リレーション先のプロパティ値をリスト表示 */
プロジェクト.map(current.ステータス).join(", ")
/* リレーション先の件数 */
プロジェクト.length()
/* リレーション先の数値プロパティの合計 */
プロジェクト.map(current.金額).sum()
/* リレーション先に「完了」があるかチェック */
プロジェクト.map(current.ステータス).includes("完了")
ロールアップの値を数式で使う
/* ロールアップの合計値を通貨形式で表示 */
if(empty(合計金額ロールアップ), "¥0",
"¥" + formatNumber(合計金額ロールアップ, ","))
/* ロールアップの達成率を計算 */
if(タスク総数ロールアップ == 0, "0%",
format(round(完了タスク数ロールアップ / タスク総数ロールアップ * 100)) + "%")
対処法6: 数式のデバッグテクニック
複雑な数式でエラーが発生した場合、以下のデバッグテクニックで原因を特定しましょう。
テクニック1: 段階的に構築する
複雑な数式を一度に書くのではなく、まず最も基本的な部分だけ書いて動作確認し、少しずつ機能を追加していきます。
- まずプロパティ参照だけの数式を作る(例:
ステータス) - 値が正しく表示されることを確認
- 条件分岐を一つ追加する(例:
if(ステータス == "完了", "OK", "NG")) - 動作確認後、さらに条件を追加
テクニック2: lets()で中間変数を使う
lets(
残り日数, dateBetween(期限日, now(), "days"),
進捗率, if(タスク総数 == 0, 0, 完了数 / タスク総数 * 100),
"残り" + format(残り日数) + "日 / 進捗" + format(round(進捗率)) + "%"
)
テクニック3: 型を確認する一時的な数式
/* プロパティの型を確認 */
type(ステータス)
/* → "text", "number", "date", "boolean", "list" などが返る */
実用的な数式テンプレート集
進捗バー表示
lets(
進捗, if(empty(進捗率), 0, round(進捗率 / 10)),
slice("🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩", 0, 進捗) +
slice("⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜", 0, 10 - 進捗) +
" " + format(round(進捗率)) + "%"
)
優先度の自動判定
lets(
残り, if(empty(期限日), 999, dateBetween(期限日, now(), "days")),
重要度値, switch(重要度, "高", 3, "中", 2, "低", 1, 0),
スコア, 重要度値 * 10 - 残り,
if(スコア >= 25, "🔴 最優先",
if(スコア >= 15, "🟠 優先",
if(スコア >= 5, "🟡 通常", "🟢 余裕あり")))
)
経過日数の表示
if(empty(作成日時), "",
lets(
日数, dateBetween(now(), 作成日時, "days"),
if(日数 == 0, "今日",
if(日数 < 7, format(日数) + "日前",
if(日数 < 30, format(floor(日数 / 7)) + "週間前",
if(日数 < 365, format(floor(日数 / 30)) + "ヶ月前",
format(floor(日数 / 365)) + "年前"))))
)
)
対処法一覧まとめ
| エラーの種類 | 主な原因 | 対処法 |
|---|---|---|
| #ERROR表示 | 構文エラー、データ型不一致 | Formula 2.0構文に書き換え、型を確認 |
| 結果が空白 | 空値の処理漏れ | empty()で空値チェックを追加 |
| 計算結果が間違い | 演算子の優先順位、引数の順序 | 括弧で明示的にグループ化 |
| リレーション参照エラー | 配列の直接参照 | .map()と.join()で処理 |
| 日付計算エラー | 引数の順序、単位の指定ミス | dateBetween()の引数を確認 |
| 条件分岐が機能しない | 比較演算子の誤り | switch文への書き換え |
この記事に関連するおすすめ商品
はじめるNotion 使いこなし入門ガイド
約1,760円
Notionデータベース・数式の基本から応用まで解説した入門書。
Dell S2422HZ 24インチ モニター
約27,800円
Webカメラ内蔵、USB-C接続。Notion作業に最適な外付けモニター。
※ 価格は変動します。最新価格はリンク先でご確認ください
よくある質問(FAQ)
Q. 数式プロパティに#ERRORと表示されます。原因はどうやって調べますか?
A. 数式プロパティの編集画面を開くと、エラーが発生している箇所に赤い下線が表示されます。その部分にカーソルを合わせるとエラーメッセージが表示されるので、メッセージの内容に従って修正してください。よくある原因は、データ型の不一致(数値と文字列の比較など)や、括弧の対応ミスです。
Q. 旧式のprop()関数はもう使えませんか?
A. prop()関数はFormula 2.0でも引き続き動作します。ただし、新しいデータベースではprop()なしでプロパティ名を直接記述する方式が推奨されています。既存の数式でprop()を使用していて正常に動作している場合は、無理に書き換える必要はありません。
Q. リレーション先のプロパティを数式で参照するにはどうすればよいですか?
A. Formula 2.0では、リレーションプロパティに対して.map()メソッドを使うことで、リレーション先のプロパティに直接アクセスできます。例えば「プロジェクト.map(current.ステータス).join(“, “)」のように記述します。リレーションは配列(リスト)として返されるため、.join()や.sum()などのメソッドで処理する必要があります。
Q. 数式で日本語のプロパティ名を使っても大丈夫ですか?
A. はい。Notionの数式では日本語のプロパティ名をそのまま使用できます。ただし、プロパティ名にスペースや特殊文字が含まれる場合は自動的にエスケープされます。プロパティ名を変更すると数式内の参照も自動で更新されますが、まれに更新されないケースがあるため、プロパティ名の変更後は数式を確認することをおすすめします。
Q. if文のネストが深くなりすぎて読みにくいです。改善方法はありますか?
A. if文のネストが3段階以上になる場合は、switch文への書き換えをおすすめします。switch(プロパティ, “値1”, “結果1”, “値2”, “結果2”, “デフォルト値”) の形式で、複数の条件分岐を見やすく記述できます。また、lets()関数で中間変数を定義すると、長い式を分割して可読性を高めることができます。
Q. 数式の結果をフィルターや並べ替えに使えますか?
A. はい。数式プロパティの結果は、データベースビューのフィルターや並べ替え条件に使用できます。例えば、期限までの残り日数を計算する数式を作成し、その結果で昇順に並べ替えることで、期限が近いタスクを上に表示するといった使い方ができます。
Q. 数式で現在の日時を取得するにはどうしますか?
A. now()関数を使用します。now()は現在の日時を返しますが、リアルタイムに更新されるわけではなく、ページを開いたタイミングで再計算されます。常に最新の値にしたい場合は、ページをリロードしてください。
まとめ
Notionデータベースの数式(Formula)が計算されない・エラーになる問題は、多くの場合Formula 2.0への構文移行、データ型の不一致、空値の処理漏れが原因です。
まずは数式エディタでエラーの赤い下線を確認し、エラーメッセージに従って修正してください。旧式のprop()関数を使用している場合は、直接参照への書き換えを検討しましょう。
複雑な数式を書く場合は、段階的に構築してテストする、lets()で中間変数を使う、if文のネストよりswitch文を使うという3つのコツを意識すると、エラーを減らして可読性の高い数式を作成できます。この記事で紹介した数式テンプレートも、ぜひコピーしてご自身のデータベースで活用してください。
minto.tech スマホ(Android/iPhone)・PC(Mac/Windows)の便利情報をお届け! 月間アクセス160万PV!スマートフォン、タブレット、パソコン、地デジに関する素朴な疑問や、困ったこと、ノウハウ、コツなどが満載のお助け記事サイトはこちら!