Notionの数式(関数):期限・進み具合・金額をよく使う式で計算する

公開 書いた人 大林 諒

Notion(ノーション)のデータベースで、期限まであと何日か、期限を過ぎているか、税込みでいくらかを毎回手で入れていると、いつか必ず更新漏れが出ます。数式のプロパティを1本足しておけば、こうした値はページを開くたびに自動で計算されます。この記事では、数式の基本の書き方から、仕事でよく使う式(期限までの日数・期限切れ・進み具合・金額・条件で文字を出す・日付の書式)、サンプル料理教室の体験日まであと何日と入会率の式、数式ではできない集計の代わり、エラーが出たときの読み方までを、2026年10月時点のNotion ヘルプセンターの関数の説明で確かめて書きます。式はどれもコピーしてプロパティ名を自分のものに替えれば動く形にしています。前提として、データベースを作ってプロパティを足せることとします。例は全記事で共通の、スタッフ6名ほどの予約制の小さな料理教室「サンプル料理教室」のワークスペースです。

この記事の内容
  1. 先に決めること
  2. 数式プロパティの基本
  3. よく使う式の一覧
  4. サンプル料理教室の例
  5. 応用
  6. 数式でできないことと、その代わり
  7. エラーの読み方
  8. よく詰まるところ
  9. 次にやること

先に決めること

数式は後からいくらでも直せますが、次の3つを決めずに書くと、式が長くなったり、ビューで使えない値になったりします。

1つ目は、計算に使うプロパティの名前を先に固めることです。数式は prop("期限") のようにプロパティ名で値を読みます。名前を後で変えたときに数式へ反映されるかはヘルプに書かれていないので、変えたあとは数式が動いているか開いて確かめます。また、同じデータベースに「期限」と「締切」が混ざっていると式が読めなくなります。サンプル料理教室では、タスクは「期限」、体験申込は「体験日」、レッスン予定は「日時」に揃えています。

2つ目は、結果を何の型で出すかです。数式2.0では、結果としてテキスト・数値・チェックボックスに加えて、日付・ページ・ユーザー・リストも出せるようになりました。並べ替えや絞り込みに使うなら数値か日付で、画面で読ませるだけならテキストで出す、と決めておきます。「あと3日」とテキストで出すと見やすい代わりに、残り日数の少ない順に並べ替えられません。

3つ目は、その計算が「1行の中」で済むかどうかです。数式が読めるのは、その行(ページ)のプロパティと、リレーションでつないだ先のページのプロパティです。「体験申込全体の入会率」のように、データベースの全部の行をまたぐ集計は数式では出せません。そういう集計はロールアップやチャート、表の下の計算に任せます。この切り分けは後の「数式でできないことと、その代わり」で詳しく書きます。

数式プロパティの基本

作り方

  1. データベースの右上のスライダーのアイコンを押す
  2. 「プロパティを編集」を押す
  3. 「新しいプロパティ」を押す
  4. 種類で「数式」を選ぶ
  5. プロパティの名前を入れる(例: 「体験日まで」)
  6. 「関数の編集」を押して、エディタに式を入れる
数式のエディタ。上に式の入力欄、左にプロパティと関数の一覧、右に関数の説明と例、行の結果のプレビューが出ているところ
数式のエディタ。上に式の入力欄、左にプロパティと関数の一覧、右に関数の説明と例、行の結果のプレビューが出ているところ

エディタは、上が式を書く欄、左が使えるプロパティ・ビルトイン・関数の一覧、右が左でカーソルを合わせたものの説明と例です。データベースの行からエディタを開くと、その行で計算した結果がその場でプレビューされます。体験申込なら、体験日が入っている行から開くと、式を書きながら結果を確かめられます。

prop() の書き方

プロパティの値は prop("プロパティ名") で読みます。名前はダブルクォートで囲みます。

prop("定員") - prop("申込数")

演算子は、足し算・引き算・掛け算・割り算の + - * /、比較の == > >= < <=、論理の and or not(&& || ! でも書ける)です。X ? Y : Z の三項演算子は if(X, Y, Z) と同じ意味です。

ヘルプの「数式の概要」のページには、prop() を省いてプロパティ名だけで書いた例も載っています。エディタの中での見え方は画面で確かめてください。この記事では、ヘルプの「数式の構文と関数」と同じ prop("…") の形で書きます。

数式2.0で変わったこと

今のNotionの数式は、ヘルプで「数式2.0」と呼ばれている書き方です。古いブログの式が動かないときは、たいていここの違いです。

変わったこと中身
複数行で書けるエディタで改行・タブ・コメントが使える。コメントは /* */ で囲む
結果の型が増えたテキスト・数値・チェックボックスに加えて、日付・ページ・ユーザー・リスト
リレーション先を直接読めるロールアップを作らなくても、つないだ先のページのプロパティを読める
変数が使えるlet と lets で途中の値に名前を付けられる
ユーザーの名前やメールを読めるprop("作成者").name() や prop("作成者").email()
既存の式の自動変換ロールアップ・ユーザー・ファイル・マルチセレクトを使っていた古い式は、テキストを返す形に自動で変換された

最後の行は、昔から使っているワークスペースで起きる話です。ユーザーの一覧をテキストで返す形に変換されているので、ユーザーやリストのまま使いたいときは、変換で足された .map(…) や .join(…) の部分を消します。

よく使う式の一覧

仕事でよく使う式です。プロパティ名を自分のデータベースのものに替えれば、そのまま動きます。

やりたいこと使う関数結果の型
期限まであと何日かdateBetween today数値
期限切れかどうかif and empty todayテキスト
進み具合の%filter length round数値
1行の金額*数値
税込み金額round または floor数値
条件で文字を出すifsテキスト
日付を読みやすい形にするformatDateテキスト
期限を自動で決めるdateAdd日付

期限まであと何日か

dateBetween(後の日付, 前の日付, "単位") は、1つ目から2つ目を引いた差を、指定した単位で返します。単位は "days" "weeks" "months" などです。today() は時刻なしの今日の日付を返します。

dateBetween(prop("期限"), today(), "days")

期限が今日なら 0、明日なら 1、昨日なら -1 になります。数値で返るので、ビューで少ない順に並べ替えたり、「3以下」で絞り込んだりできます。now() を使うと時刻まで含めて計算されるので、日付だけで数えたいときは today() を使います。

期限切れかどうか

if(
  and(not empty(prop("期限")), prop("期限") < today(), prop("状態") != "完了"),
  "期限切れ",
  ""
)

期限が入っていて、今日より前で、状態が「完了」でない行にだけ「期限切れ」と出ます。empty() は値が空なら true を返します。期限が空の行を除いておかないと、期限を入れ忘れたタスクの扱いがぶれます。文字を赤くしたいときは、"期限切れ" を style("期限切れ", "red") に替えます。

進み具合の%

タスクにリレーションで「関連するタスク」をつないでいるとき、そのうち完了したものの割合を出します。

if(
  empty(prop("関連するタスク")),
  0,
  round(
    prop("関連するタスク").filter(current.prop("状態") == "完了").length()
    / prop("関連するタスク").length() * 100
  )
)

filter は条件に合うものだけを残し、length は数を返します。current は、いま調べている1件を指します。関連するタスクが1件も無いと0で割ることになるので、最初の if で0を返しています。チェックボックスのプロパティで進み具合を数えたいときは、current.prop("完了") のようにチェックボックスをそのまま条件に書けます。

1行の金額と税込み

prop("単価") * prop("人数")

税込みは、端数を四捨五入するなら round、切り捨てるなら floor です。端数の扱いは会社の決まりに合わせます。

floor(prop("税抜金額") * 1.1)

round は2つ目の引数で小数点以下の桁数を指定できます。round(1.234, 2) は 1.23 です。

条件で文字を出す

ifs は、条件と値を順に並べ、最初に当てはまった条件の値を返します。最後の値は、どれにも当てはまらなかったときの値です。if を入れ子にするより読みやすくなります。

ifs(
  prop("申込数") >= prop("定員"), "満席",
  prop("定員") - prop("申込数") <= 2, "残りわずか",
  "空きあり"
)

日付を読みやすい形にする

formatDate(prop("日時"), "YYYY/MM/DD")

YYYY が年、MM が2桁の月、DD が2桁の日、h が時、mm が分です。結果はテキストになるので、並べ替えには元の日付のプロパティを使います。

期限を自動で決める

dateAdd(prop("申込日"), 3, "days")

申込日の3日後を返します。体験申込の「折り返しの連絡期限」に使えます。引くときは dateSubtract です。

日付の範囲から時間の長さを出す

レッスン予定の「日時」に、開始と終了の時刻を範囲で入れているときは、dateStart と dateEnd で両端を取り出せます。

dateBetween(dateEnd(prop("日時")), dateStart(prop("日時")), "minutes")

19:00〜21:00のレッスンなら 120 が返ります。講師のシフトで、1か月に何分レッスンを持ったかをロールアップの「合計」で足すときの元の数にもなります。終了時刻を入れていない行でどんな値になるかはヘルプに書かれていないので、使い始める前に、終了時刻の無い行を1つ作って結果を確かめておきます。

文字を含むかで印を付ける

contains(テキスト, 探す文字) は、テキストに探す文字が含まれていれば true を返します。体験申込の「備考」にアレルギーの話が書かれている申込に、講師が見落とさないよう印を付けます。

if(contains(prop("備考"), "アレルギー"), style("要確認", "red"), "")

受付が「卵アレルギーあり」「アレルギーなし」のどちらを書いても印が付くので、印が付いた申込は備考を読んで確かめる、という使い方にします。決まった言葉で分けたいなら、数式より先に、備考ではなくセレクトのプロパティで「アレルギー: あり・なし」を選ばせるほうが確実です。

体験申込の表ビューで、「備考」にアレルギーと書かれた行だけ「要確認」が赤字で出ている数式の列
体験申込の表ビューで、「備考」にアレルギーと書かれた行だけ「要確認」が赤字で出ている数式の列
タスクの表ビューで、「期限まで」「期限切れ」「進み具合」の3つの数式の列が計算されて並んでいるところ
タスクの表ビューで、「期限まで」「期限切れ」「進み具合」の3つの数式の列が計算されて並んでいるところ

サンプル料理教室の例

体験日まであと何日

受付が毎朝見る体験申込のビューに、体験日まであと何日かを出します。体験日が空の申込もあるので、先にそれを分けます。

/* 体験日まであと何日かを、受付が読みやすい文字で出す */
if(
  empty(prop("体験日")),
  "体験日未定",
  lets(
    残り, dateBetween(prop("体験日"), today(), "days"),
    ifs(
      残り < 0, "体験済み",
      残り == 0, "今日",
      残り == 1, "明日",
      format(残り) + "日後"
    )
  )
)

lets は、名前と値を交互に並べて変数を作り、最後に式を書く関数です。残り という名前で日数を一度だけ計算し、後の ifs で使い回しています。format は数値をテキストに変えます。テキストとつなぐ前に format で数値をテキストにしておくと、結果がテキストにそろい、型の違いで迷わずに済みます。

この列はテキストなので、並べ替えには使えません。「近い順に並べたい」ときは、同じデータベースに dateBetween(prop("体験日"), today(), "days") だけの数値の列をもう1本作り、その列で並べ替えて、列自体はビューで非表示にします。

体験申込の「今日と明日の体験」ビューで、「体験日まで」の列に「今日」「明日」「3日後」が出ているところ
体験申込の「今日と明日の体験」ビューで、「体験日まで」の列に「今日」「明日」「3日後」が出ているところ

入会率

入会率は、何を分母にするかで出し方が変わります。

レッスンごとの入会率は、数式で出せます。レッスン予定に、体験申込とのリレーション「体験の申込」がある前提です。

lets(
  体験, prop("体験の申込"),
  入会, prop("体験の申込").filter(current.prop("入会したか")),
  if(
    empty(体験),
    0,
    round(入会.length() / 体験.length() * 100)
  )
)

「入会したか」はチェックボックスです。リレーションでつないだ体験申込のうち、チェックが入っているものの割合を%の数で返します。

体験申込全体や月ごとの入会率は、全部の行をまたぐ集計なので、数式では出せません。体験申込にドーナツグラフのチャートを置き、「入会したか」ごとの件数(Y軸の「データ」で「個数」)を出すか、申込月で絞り込んだビューを月ごとに作ってそこで見ます。

応用

複数行とコメントで読める式にする

数式2.0では、エディタの中で改行とタブが使え、/* */ でコメントを書けます。3か月後に別の人が式を直すことを考えると、長い式ほど1つの条件を1行に分け、何をしている式かを先頭のコメントに書いておくと、直す時間が短くなります。サンプル料理教室では「誰が・いつ・何のために足した列か」をコメントの1行目に書く決まりにしています。

変数で同じ計算を1回にする

同じ dateBetween(…) を式の中で3回書くと、直すときに3か所を直すことになります。let(名前, 値, 式) や lets(名前1, 値1, 名前2, 値2, 式) で一度だけ計算し、名前で使い回します。ヘルプの例も、小計に税をかけた値を変数にしてから足しています。

let(税, prop("小計") * 0.1, prop("小計") + 税)

数式とロールアップのどちらで書くか

数式2.0ではリレーション先を直接読めるので、ロールアップでできることの多くは数式でも書けます。サンプル料理教室では次のように分けています。

こういうとき使うもの理由
つないだ先を全部数える・合計するロールアップ設定画面で選ぶだけで、式を読めない人でも直せる
条件に合うものだけ数える数式の filterロールアップには条件を付けられない
数えた結果をさらに計算する数式割合・残りの席などを1本で出せる
ビューで並べ替えるどちらでも数値で出す並べ替えはテキストより数値が確実

作った人の名前を出す

数式2.0では、人物のプロパティから名前やメールを直接読めます。日報で「誰が書いたか」を文字で出したいときに使えます。

prop("作成者").name()

Notion AI に式を書かせる

ヘルプによると、Notion AI で数式を作る・直す・エラーに対応する機能は、2026年10月時点でビジネスプランとエンタープライズプランで使えます。「体験日が空なら未定、過ぎていたら体験済みと出して」のように日本語で頼めます。繰り返しの処理(for のようなループ)や、前に頼んだ内容の記憶には対応していません。出てきた式は、必ず何行かのプレビューで結果を確かめてから使います。

数式でできないことと、その代わり

できないこと理由代わりの手
同じデータベースのほかの行の値を読む(前の行との差など)数式が読めるのはその行と、リレーションでつないだ先だけ読みたい行をリレーションでつなぐ
データベース全体の合計や平均を数式で出す全部の行をまたぐ集計になる表ビューの列の下の計算、またはチャートを使う
別のデータベースの行を、つながずに数えるリレーションが無いと読めないリレーションを作り、ロールアップか数式の filter で数える
月ごとの件数の推移を出す行をまたぐ集計になるチャートの棒グラフや折れ線グラフ
過去の時点の値を残す数式は開くたびに計算し直す。today() を使った式は毎日変わる残したい値は数値や日付のプロパティに手で入れる、オートメーションで書き込む
数式の深さが15層を超える参照ほかの数式やロールアップを参照するたびに1層増え、データベースをまたいでも数える要らない数式やロールアップを減らし、1つのプロパティにまとめる

全体の集計の代わりに使うのは、ロールアップ・表の下の計算・チャートの3つです。ロールアップは「つないだ先」を集計するので、講師ごと・レッスンごとのように1つのページに対して数を出すのに向きます。表の下の計算は、いま見ているビューの行全体の合計や件数を出します。チャートは、ヘルプによると縦棒・横棒・折れ線・ドーナツ・数値のグラフが作れ、X軸に申込経路や申込月を選んで件数を並べられます。2026年10月時点では、フリープランで作れるチャートは1つで、有料プランは無制限です。

金額を正確に締める台帳や、行数が何万にもなる明細の集計は、Notionの数式やチャートでやり切ろうとしないほうが安全です。月謝の入金はサンプル料理教室でも予約システムと会計ソフトに任せ、Notionには判断に使う数字だけを置いています。スプレッドシートやkintoneのほうが向いている仕事です。

体験申込のデータベースに置いた縦棒グラフのチャート。X軸が申込経路、Y軸が件数になっているところ
体験申込のデータベースに置いた縦棒グラフのチャート。X軸が申込経路、Y軸が件数になっているところ

エラーの読み方

数式2.0のエディタは、型が合わないところやエラーの場所を、入力欄の中で強調して出します。エディタに出る「何が足りないか」「どんな値が要るか」の表示を確かめ、強調されたところから直します。

症状原因直し方
数値とテキストをつないだところで結果がおかしい残り + "日後" のように型の違う値を足しているformat(残り) + "日後" のように数値をテキストに変えてからつなぐ
ボタンやオートメーションの数式が止まるヘルプによると、必要な型(日付・テキスト・数値・ユーザー)を返していない。空を "" で表すと型が定まらない正しい型を返すようにし、空には empty() を使う。通常の数式のプロパティでも、if の分岐ごとの型はそろえておくと安全
テキストの数字で計算できない数字がテキストのプロパティに入っているtoNumber(prop("金額")) で数値に変える
括弧の数が合わない長い式で閉じ括弧が抜けた1つの条件を1行に分けて書き、括弧の対応を見る
プロパティが見つからないprop("…") の名前が違う、全角と半角が混ざっている左の一覧からプロパティを選んで入れ直す
期限の無い行で変な値が出る空の日付を計算に使っている先に empty() で空を分ける
マルチセレクトや人物を == で比べても当たらない値がリストになっている.includes("値") で調べる
リレーション先の値が出ない参照先のデータベースに、その人のアクセス権が無い参照先のデータベースを共有する
「数式の深さの上限に達しました。」と出るほかの数式やロールアップを参照する連なりが15層を超えた(括弧の入れ子ではなく、参照のたびに1層増える。データベースをまたいでも数える)似た計算をしている数式やロールアップを1つにまとめ、プロパティの数を減らす
古いブログの式を貼ると動かない数式2.0の前の書き方ヘルプの関数一覧の名前と引数で書き直す

よく詰まるところ

  • 期限まであと何日かが、夜になると1日ずれる。now() で時刻まで計算している。日数だけで数えるなら today() に替える
  • 「あと3日」の列で並べ替えができない。結果がテキストになっている。数値だけの列を別に作って並べ替える
  • 期限切れの列に、完了したタスクまで出る。状態の値の名前(「完了」)が式と違う。状態のプロパティの選択肢の名前と式の文字を合わせる
  • 関連するタスクが0件の行で、進み具合の表示がおかしい。0で割っている(表示のされ方は画面で確かめる)。empty() で0件を先に分ける
  • 税込みが1円ずれる。四捨五入と切り捨ての違い。会社の端数処理に合わせて round か floor を選ぶ
  • 昔から使っているワークスペースで、人物の数式がテキストになっている。数式2.0への自動変換でテキストを返す形になった。変換で足された部分を消す
  • 数式で入会率を出したのに、全体の数字にならない。数式は1行の中の計算。全体は表の下の計算かチャートで出す
  • 数式を使ったビューの読み込みが遅い。ヘルプによると、数式やロールアップにフィルターや並べ替えをかけたデータベースは読み込みに時間がかかることがある。絞り込みは日付やセレクトなど単純なプロパティでかける
数式のエディタで、エラーの箇所が強調され、何が足りないかの表示が出ているところ
数式のエディタで、エラーの箇所が強調され、何が足りないかの表示が出ているところ

次にやること

数式でつないだ先の値を読むには、先にリレーションが要ります。つなぎ方とロールアップの計算の種類は、Notionのリレーションとロールアップ:2つのデータベースをつなぐ、で書いています。数式で出した「期限切れ」や「体験日まで」を使って、担当者ごとや今日の分だけを見せるビューを作るなら、Notionのビューとフィルター:人ごと・期限ごとに見せ分ける、に進みます。

期限・状態・進み具合の式をタスクのデータベースにまとめて入れる形は、Notionでタスク管理:担当・期限・状態のデータベースを作る、で書きます。体験申込を顧客として追いかけ、入会率や金額を数式で出す形は、Notionで顧客管理・案件管理:小さな会社の簡単なCRMを作る、が続きです。

あわせて読む