Notion

Notion数式2.0完全ガイド!基礎から応用まで徹底解説!

数式

Notionを使っていると、データベースをもっと便利にしたい、もっと自分好みにカスタマイズしたいと思う瞬間がありますよね。特にNotionの「数式(Formula)」機能は、プログラミングのコードのように見えて最初は難しそうに感じるかもしれませんが、使いこなせば日々のタスク管理や情報整理が劇的に楽になります。正直なところ、以前のバージョン(1.0)では少し扱いづらい部分もありましたが、今回の大型アップデートで「数式2.0」となり、エンジニアでない方でも直感的に記述できるようになりました。この記事では、新しくなったエディタの基本的な使い方から、ifs関数によるスマートな条件分岐、プロジェクト管理に欠かせない日付計算、さらにはテキスト結合や装飾といった応用テクニックまで、網羅的に解説していきます。

  • Notion数式2.0の基本構文と、読みやすさを劇的に変える「ドット記法」の使い方がわかる
  • 複雑になりがちな条件分岐をスッキリ記述できるifs関数や、日付計算による自動化ロジックの組み方が理解できる
  • リレーション先のデータを、ロールアップ機能を使わずに直接集計・加工する高度なテクニックが身につく
  • プログレスバーやカラー装飾を使って、視認性の高いデータベース・ダッシュボードを作る方法がわかる

Notion数式の基礎と2.0の進化点

これまでのNotionの数式は、Excelの関数に慣れている人でも少し取っつきにくい印象がありました。長い数式を書くと修正が困難で、「どこで間違えたのか分からない」という沼にハマることもしばしば。しかし、バージョン2.0になって「書きやすさ」と「読みやすさ」が格段に向上しました。ここでは、新しくなったエディタの特徴や、最初に覚えておきたい基本的なデータ型、そして以前とは少し変わった記述のルールについて、私自身の体験も交えながら見ていきましょう。

Notion数式2.0の基本的な使い方

まず最初に、新しくなった数式エディタの画面とその操作感に慣れていきましょう。以前のバージョン(Formula 1.0)をご存知の方は記憶にあるかもしれませんが、かつては狭い一行の入力ボックスに、ひたすら長い数式を横に詰め込んでいくスタイルでした。そのため、少しでも複雑なロジックを組もうとすると、カッコの対応関係が見えなくなり、修正作業がパズルのような苦行になっていたのです。

しかし、Formula 2.0からはエディタ領域が大幅に拡張され、本格的なコードエディタのように「改行」や「インデント(字下げ)」が可能になりました。これは単なる見た目の変更ではなく、思考を整理しながらロジックを組めるようになったことを意味します。例えば、複雑な計算をする際も、意味のまとまりごとに行を分けて書くことができます。Shift + Enterキーを押すことで改行ができるので、可読性は段違いです。

【数式エディタの進化ポイント】

  • マルチライン編集: 長い数式を複数行に分けて記述できるため、ロジックの構造が一目でわかります。後から見返した時の理解スピードが違います。
  • コメント機能: /* ここで消費税を計算 */ のように、スラッシュとアスタリスクで囲むことで、数式内にメモを残せるようになりました。チームで共有する際や、未来の自分へのメッセージとして非常に有効です。
  • リアルタイムエラーチェック: 入力中に構文エラーがある場合、即座に赤い下線でハイライトされ、具体的なエラー内容が表示されるようになりました。
  • プレビュー機能: 数式を確定してポップアップを閉じる前に、その場で計算結果のプレビューが表示されます。「保存してみたらエラーだった」という手戻りを防げます。

また、数式内でプロパティを参照する際の挙動も進化しています。エディタ上でプロパティ名を入力し始めるとサジェストが表示され、選択すると灰色の背景がついた「トークン(Token)」として扱われます。以前は単なるテキストとして扱われていたため、プロパティ名を変更すると数式が壊れることがありましたが、トークン化されたことで、後からデータベースのプロパティ名を変更しても、数式内の参照が自動的に追従して書き換わるようになりました。これは地味ですが、長期的にデータベースを運用する上ではトラブルを未然に防ぐ非常に重要な改善点です。

よく使う演算子と関数の一覧

数式を組む上で避けて通れないのが演算子と関数です。Formula 2.0における最大の変更点の一つが、JavaScriptなどのプログラミング言語で採用されている「メソッドチェーン(ドット記法)」と呼ばれる書き方ができるようになったことです。これまでは関数の中に関数を入れて…と、カッコが何重にもなる「入れ子構造(ネスティング)」が基本でしたが、今は左から右へ、思考の流れに沿って記述できます。

例えば、ある「数値」プロパティに1を足して、さらに四捨五入する場合を考えてみましょう。従来と現在では、これくらい書き心地と見た目が違います。

従来の書き方(関数記法) 2.0の書き方(ドット記法)
round(add(prop("数値"), 1)) prop("数値").add(1).round()

このように、「対象のデータ」に対して「.(ドット)」で「やりたい処理」をつなげていくイメージです。まるで日本語で「数値を、1足して、丸める」と読むようにコードを書けるので、直感的です。もちろん、従来の四則演算記号(+, -, *, /)もそのまま使えるので、prop("数値") + 1 と書いてもOKです。簡単な計算は記号で、複雑な関数処理はドット記法で、と使い分けるのがスマートです。

また、使用できる関数の種類も大幅に増えました。特に注目すべきは、配列(リスト)を操作するための関数群ですが、まずは基本となる以下の関数を押さえておきましょう。

  • 数学系: round()(丸め), ceil()(切り上げ), floor()(切り捨て), abs()(絶対値)
  • テキスト系: length()(文字数カウント), substring()(文字の切り出し), contains()(特定の文字を含むか判定)
  • 論理系: and, or, not(これらもドット記法でつなげます)

これらの関数を組み合わせるだけで、これまでは諦めていたような複雑なデータ処理が可能になります。公式ドキュメントには全関数が載っていますが、まずはこの「ドットでつなぐ」感覚をマスターすることが、脱初心者への第一歩です。

if関数を使った条件分岐の記述

「もしステータスが完了ならAを表示、そうでなければBを表示」といった条件分岐は、タスク管理や進捗管理において非常に重宝します。これまではif()関数を使っていましたが、条件が3つ、4つと増えていくと、「ifの中にifを入れて、その中にまたifを入れて…」という深い入れ子構造になり、最後の閉じカッコの数を合わせるだけで一苦労でした。

しかし、Formula 2.0からは待望のifs()(イフス)という新しい関数が登場しました。これは「複数の条件を順番に評価できる」関数で、プログラミングでいう「else if」や「switch文」に近い役割を果たします。これにより、複数の条件をフラットに、スッキリと書けるようになりました。

例えば、タスクの進捗率(0〜1の数値)に応じて、表示するテキストを変えるロジックを組む場合を考えてみましょう。「1なら完了、0なら未対応、それ以外は進行中」というケースです。

ifs(   /* 条件1: 進捗が100%のとき /   prop("進捗") == 1, "✅ 完了",   / 条件2: 進捗が0%のとき /   prop("進捗") == 0, "⬜ 未対応",   / どの条件にも当てはまらない場合(デフォルト) */   "🚀 進行中" )

このように、「条件, 結果, 条件, 結果, ..., 最後のデフォルト結果」という順序で、カンマ区切りで並べていくだけで記述できます。「ifs」を使うことで、カッコの入れ子地獄から解放されるのは、精神衛生上も非常に大きなメリットです。

さらに、論理演算子もドット記法で書けるため、prop("日付") < now() and prop("ステータス") != "完了" といった複合条件も、以前より遥かに読みやすくなっています。条件分岐はデータベース自動化の要(かなめ)ですので、このifs関数はぜひ優先的にマスターしてください。

日付の計算や期間を算出する方法

プロジェクト管理やタスク管理では、「期限まであと何日あるか?」「プロジェクト開始日から今日で何週間経過したか?」といった日付の計算が頻繁に発生します。Notion数式ではdateBetween(期間の差分)やdateAdd(日付の加算・減算)といった関数を使ってこれらを算出します。

ここでもドット記法が輝きます。例えば、「期限(日付プロパティ)」から「今日(now())」までの残り日数を計算する場合、以下のように書けます。

prop("期限").dateBetween(now(), "days")

これを日本語に翻訳するように読むと、「期限と、今の間の、日数を出す」となり、非常にロジックが明確です。第3引数の単位を変えれば、"weeks"(週)や"months"(月)、"hours"(時間)での計算も可能です。

【日付関数の落とし穴:タイムゾーン】 Notionの日付データ(Date型)は、内部的にはUTC(協定世界時)などの時刻情報を持っています。now()関数を使うと現在時刻が取得されますが、formatDate()を使って表示形式を整える際や、日付をまたぐ計算をする際に、自分が意図したタイムゾーン(日本ならJST)になっているか確認することが大切です。稀に、夜中に作業していると日付がズレて表示されることがありますが、これはタイムゾーン設定の影響であることが多いです。

また、応用的な使い方として、dateStart()dateEnd()といった関数も追加されています。Notionの日付プロパティは「開始日→終了日」という範囲を持つことができますが、これらの関数を使えば「範囲の開始日だけを取り出して計算する」といった細かい制御も可能です。「今週中にやるタスク」をフィルタリングするためのフラグ作りなど、日付操作を覚えるとダッシュボードの作り込みが一気に楽しくなります。

テキスト結合と文字列操作の基本

データベースのタイトルや要約プロパティを自動生成するために、テキスト結合もよく使います。基本はプラス記号(+)を使って文字をつなぐだけですが、ここで初心者が必ず一度はつまづくポイントがあります。それは、数値や日付を結合する場合の「型(Type)」の問題です。テキスト型と数値型をそのまま足そうとするとエラーになるのです。

例えば、見積書DBで「合計:10,000円」というタイトルの数式を作りたいとします。単に "合計:" + prop("金額") + "円" と書くとエラーになります。なぜなら、"合計:"はテキストですが、prop("金額")は数値だからです。

これを解決するには、数値をテキストに変換するformat()関数を使います。

"合計:" + prop("金額").format() + "円"

これでエラーは消えます。さらにFormula 2.0の素晴らしい点は、style()関数を使って、テキストに色を付けたり太字にしたりといった装飾も数式内で完結できるようになったことです。

style("重要", "b", "red") と書けば、太字の赤色で「重要」と表示されます。計算結果に応じて、「黒字」にするか「赤字」にするかを動的に切り替える、といったExcelの条件付き書式のようなことも、このstyle()関数とifs()関数を組み合わせることで実現できます。計算結果を単なる数字として置くのではなく、視認性の高い「情報」としてデザインできるのが、2.0の大きな魅力です。

Notion数式の応用と実践テクニック

基礎を押さえたところで、ここからは一歩進んだ応用編です。Formula 2.0の真骨頂である「リスト操作(配列処理)」や「変数の定義」を活用することで、これまでロールアップ機能や複雑なリレーション、あるいは外部ツールに頼っていた処理を、たった一つの数式プロパティで実現できるようになります。実務ですぐに使える、生産性を爆上げするテクニックを見ていきましょう。

プログレスバーで進捗を可視化

タスクの進捗状況を「50%」のような数字だけで見るよりも、バー形式で視覚的に表示した方が直感的に状況を把握できますよね。以前のバージョンでは、"■"や"□"といった特殊文字をslice()関数で切り出すという、少々トリッキーな方法で作っていましたが、2.0からはrepeat()関数とstyle()関数を使うことで、より美しく、コードもシンプルなプログレスバーが作れます。

私がよく使うのは、進捗率に応じて色が「赤(危険)→黄(注意)→緑(順調)」とグラデーションのように変わるバーです。ここで便利なのが、lets関数を使って計算結果を「変数」に入れておくテクニックです。

lets(   /* 進捗率を計算(0〜1) /   percent, prop("完了数") / prop("総タスク数"),   / 進捗率に応じた色を決定 /   color, ifs(     percent == 1, "green",     percent >= 0.7, "blue",     percent >= 0.4, "yellow",     "red"   ),   / バーの描画 */   style(repeat("━", percent * 10), color) +   style(repeat("━", 10 - (percent * 10)), "gray") +   " " + (percent * 100).round() + "%" )

【プログレスバー作成のコツ】

  • lets(変数名, 値, ..., 式)を使うことで、同じ計算(ここではpercent)を何度も書かずに済み、コードがスッキリします。
  • repeat("文字", 回数)を使って、進捗率に応じた個数のブロックを表示します。
  • style()の色指定を変数(color)で制御することで、状況に合わせた動的なカラーリングが可能になります。

こうすることで、マネジメントの観点でも「赤いバーのタスクだけチェックすればいい」と一目で判断できるようになり、優先順位付けのスピードが格段に上がります。

map関数によるリスト操作と集計

Notion数式2.0における最大の革命とも言えるのが、このmap関数の導入です。これは、リレーションで紐づいている「複数のデータ(リスト)」を一つずつ取り出して、それぞれに処理を加えることができる機能です。エンジニアの方なら「配列のマップ処理」といえばピンと来るでしょう。

例えば、「プロジェクトDB」と「タスクDB」がリレーションされているとします。プロジェクトのページ上で、紐づいている全てのタスクの名前を一覧で出したい時、これまでは単にカンマ区切りのテキストとして表示されるだけでした。しかしmapを使えば、それぞれのタスクのプロパティに深くアクセスできます。

prop("タスク").map(current.prop("タスク名"))

ここで登場する重要なキーワードがcurrentです。これは「今処理しているそのデータ(リストの中の一つ)」を指します。上記コードは、「タスクのリレーション(リスト)から、それぞれの要素(current)の『タスク名』プロパティを取り出して、新しいリストを作る」という意味になります。

さらに応用すれば、current.prop("担当者").email()のように、リレーション先のさらに先にある情報(担当者のメールアドレスなど)も引っ張ってくることができます。「リレーション先の深い階層にある情報も、このmapを使えば自由に抽出・加工できる」というのが、Formula 2.0の最強の武器です。

ロールアップを使わず合計する方法

「リレーション先のタスクの『見積金額』を合計したい」という場合、これまでは「ロールアップ」プロパティをわざわざ作成し、そこで「合計」を選択する必要がありました。しかし、計算のためだけにプロパティが増えていくのは、データベース管理の観点からはあまり美しくありません。数式2.0では、数式プロパティの中だけでこの集計が完結します。

例えば、経費精算のデータベースで、数ある経費アイテムのうち「ステータスが『承認済み』のものだけ」を合計したい場合を想像してください。ロールアップ機能だけでは「条件付きの合計」は難しいですが、Formulaなら簡単です。

prop("経費アイテム")   .filter(current.prop("ステータス") == "承認済み")   .map(current.prop("金額"))   .sum()

このコードの流れを解説します。

  1. prop("経費アイテム"):まず、リレーションされている全データを取得します。
  2. .filter(...):その中から、ステータスが承認済みのデータだけを「ふるい」にかけます。
  3. .map(...):残ったデータから、金額の情報だけを抜き出します(金額のリストができます)。
  4. .sum():最後に、そのリスト内の数値を合計します。

このように、データベースのプロパティ数を減らし、管理画面をスッキリ保ちつつ、ロールアップでは不可能な高度な条件付き集計が可能になります。これができるようになると、データベース設計の自由度が飛躍的に向上します。

エラーが出た時の原因と対処法

高機能になった分、最初のうちはエラーに直面することも増えるかもしれません。数式エディタが赤くなり「エラーがあります」と言われても、何が悪いのか分からない…。そんな時によくある原因の一つが「型(Type)の不一致」です。

Formula 2.0では、データ型が厳格に区別されます。特に注意が必要なのが「リスト型」の扱いです。リレーションプロパティは、たとえ紐づいているページが1つだけであっても、システム上は「ページのリスト(配列)」として扱われます。そのため、リストそのものに対して足し算をしたり、テキスト結合をしようとしたりするとエラーになります。

【よくあるエラーパターンと解決策】

  • リスト操作忘れ: 「リレーション先の数値」を使いたい場合、prop("リレーション")はリストなのでそのまま計算できません。map()で値を取り出してsum()するか、at(0)を使って「リストの1番目のデータ」を取り出す必要があります。
  • 空データの参照: リレーション先がまだ空っぽの場合や、日付が未入力の場合に計算しようとしてエラーになることがあります。empty()関数を使って「もし空なら計算しない」というガード条件を入れるのが安全です。

デバッグ(修正)のコツとしては、いきなり完成形を目指さず、prop("リレーション").format()のように、一旦format()関数を挟んでテキストとして表示させてみることです。そうすると、中身がどういうデータになっているか(カンマ区切りのテキストなのか、オブジェクトなのか)が可視化されるので、原因究明が早くなります。

より詳しい関数の仕様やエラーメッセージの意味については、公式の一次情報源を参照するのが最も確実です。困ったときは以下のページを確認してみてください。

(出典:Notion公式ヘルプセンター『数式の基本』

タスク管理に役立つ数式の実践事例

最後に、私が実際のタスク管理で愛用している実践的な数式を紹介します。タスク一覧を見た時に、「どれから手を付けるべきか」を一瞬で判断するための「アラート用プロパティ」です。

要件は以下の通りです。

  • ステータスが完了なら「✅」を表示
  • 期限を過ぎていて、かつ未完了なら「🔥炎上」を表示(赤背景)
  • 期限まで3日以内で、かつ未完了なら「⚠️注意」を表示(黄背景)
  • それ以外は「🔵順調」を表示

これを数式で実装すると以下のようになります。

lets(   Status, prop("ステータス"),   DaysLeft, prop("期限").dateBetween(now(), "days"),   ifs(     Status == "完了", "✅",     DaysLeft < 0, style("🔥炎上", "red_background", "b"),     DaysLeft <= 3, style("⚠️注意", "yellow_background"),     "🔵順調"   ) )

この数式プロパティをギャラリービューのカードの表紙に表示させておくだけで、わざわざ日付プロパティを確認しなくても、「赤いアイコンのやつだけ処理すればいい」という直感的なタスク管理が可能になります。脳のリソースを使わずに状況把握ができる仕組みを作ることこそ、自動化の最大のメリットですね。

まとめ:Notion数式で業務効率化を実現

ここまでNotion数式2.0の機能を見てきましたが、単に計算ができるようになっただけでなく、「データを判断し、加工し、人間にとって分かりやすい形で可視化する」ためのツールへと進化したことがお分かりいただけたかと思います。

優れたデータベース設計とは、入力項目が多いことではありません。むしろ、「手動で入力する項目」を極限まで減らし、入力されたデータに基づいて「自動で判定・表示される項目」を増やすことこそが、継続的な運用のコツです。最初は難しく感じるかもしれませんが、まずは「期限切れタスクのアラート」や「シンプルな進捗バー」といった小さな自動化から始めてみてください。Notion数式を味方につけて、自分だけの快適で賢いワークスペースを作り上げていきましょう。

-Notion