当サイトではアフィリエイトプログラムを利用して商品を紹介しています。掲載リンクからご購入いただいた場合、当サイトに報酬が発生することがあります。

Notionの数式は、空欄を0に変えます|平均が合わなくなる本当の理由

暗い背景に浮かび上がる関数電卓のキー。Notionの数式が空欄を0に変えることを表した記事のアイキャッチ

Notionで数式を使っていて、集計の数字が思ったものと違うことはないでしょうか。

元のデータは正しい。数式も合っている。それなのに平均が合わない。

原因を確かめました。数式を1枚かませるだけで、空欄が0に変わります。そして0は、集計の分母に入ります。

空欄を掛けると、0が返る

まず、数式が空欄をどう扱うかを見ます。

何も入っていない行で試しました

数値の列を用意して、値を入れないまま数式を計算させます。

数式 空の行での結果
数値 × 2 0
数値 + 10 10
文字の長さ 0

空欄は空欄のまま返る、と思っていました。実際には0として計算されます。

「数値 + 10」が10になっているのが分かりやすいと思います。空欄に10を足したら10。つまり空欄を0として扱っています。

それ自体は、悪いことではありません

計算できる値が返るのは、便利な場面もあります。未入力の行でもエラーにならず、表が崩れません。

問題は、その0が「本当に0だった行」と区別できなくなることです。

同じ元データで、平均が150と200に分かれた

ここが今回の本題です。

3行のうち1行を空にして、集計しました

数値の列に100、200、そして空欄の3行を用意します。この3行を親のページから集計しました。

同時に、「数値 × 2」という数式の列も集計します。数式のほうは200、400、そして0になっているはずです。

集計したもの 平均 合計
数値そのもの 150 300
数値 × 2 の数式 200 600

本来なら300になるはずです

数値の平均が150なら、それを2倍した数式の平均は300になるはずです。返ってきたのは200でした。

理由は分母です。数値そのものを平均するときは、空欄の行が分母に入りません。100と200の2件で割って150。

数式のほうは、空欄の行が0という値になっています。だから3件として数えられて、200足す400足す0を3で割って200。

数式を1枚かませただけで、分母が2から3に変わりました。

合計なら一致します

合計を見ると、300と600で、きちんと2倍になっています。0を足しても合計は変わらないからです。

ずれるのは平均だけ。合計で検算しても気づけません。

図にすると、こういう分かれ方です

同じ3行を集計しているのに、平均が変わる 元の3行 100 / 200 / 空欄 数式は「数値 × 2」 数値そのものを平均 空欄は分母に入らない → 150 数式を平均 空欄が0になり分母に入る → 200 100と200を2で割る 分母は2 200と400と0を3で割る 分母は3 合計は300と600で、きちんと2倍。ずれるのは平均だけ 合計で検算しても気づけない。
同じ3行を、数値そのものと数式の両方で集計した結果です。

件数も変わります

もう1つ、はっきり差が出たところがあります。

2件と3件に分かれました

値が入っている件数を数える集計も同時に試しました。

数えたもの 件数
数値そのもの 2件
数値 × 2 の数式 3件

数式の列は全行に値が入っているので、3件になります。入力率を測るために件数を数えているなら、数式を数えてはいけません。

「100件中80件入力済み」を出したいときに、数式を対象にすると必ず100件になります。

0になるものと、空のままのもの

すべてが0になるわけではありませんでした。

結果が空になる場合もあります

数式 空の行での結果
数値 × 2 0
0で割る 空
日付の差を出す 空
チェックで分岐する 「未」(文字が返る)

0で割った場合と、日付が空のまま差を出した場合は、結果が空になりました。エラーにはなりません。

チェックボックスで分岐する数式は、チェックが入っていない行でも「未」という文字が返ります。チェックボックスには空という状態がないからだと思います。

見分け方は、計算の種類で決まります

数値として足したり掛けたりする計算は、空欄を0として扱います。日付の差や、割り算で答えが出ない場合は、空が返ります。

集計するときに困るのは、0になるほうです。空のままなら、他の空欄と同じ扱いで分母から外れます。

型が違っても、エラーになりません

もう1つ、気をつけたい挙動がありました。

文字と数値を足しても通ります

文字の列と数値の列を足す数式を作りました。型が合わないので拒否されると思っていましたが、作れてしまいます。

空の行での結果は0でした。動いてはいるのですが、意図した計算ではありません。

止まるのは、列が存在しないときだけ

一方、存在しない列名を参照する数式は、作る時点で拒否されました。型の誤りだと明示されます。

数式 結果
文字 + 数値 作れる(0が返る)
存在しない列を参照 拒否される

つまり、列名の打ち間違いは止まりますが、型の組み合わせ間違いは通ります。作れたからといって、正しいとは限りません。

狂わせないための書き方

ここまでを踏まえた対策です。

1. 未入力なら、空を返す

いちばん効くのがこれです。値が入っていない行では、計算せずに空を返すようにします。

「値が空なら空、そうでなければ計算する」という形の分岐を1つ入れるだけです。こうすると、数式の列も元の列と同じ分母で集計されます。

数式が少し長くなりますが、集計が合うほうがずっと大事です。

2. 平均を出すなら、元の列を集計する

数式を経由せずに済むなら、そのほうが確実です。

元の列をそのまま集計して、必要なら結果を倍にする。計算の順番を変えるだけで、分母の問題を避けられます。

数式を経由する必要があるのは、行ごとに違う計算をするときだけです。全行に同じ倍率をかけるだけなら、あとから掛ければ済みます。

3. 件数は、元の列で数える

入力率や進捗率を出すために件数を数えるなら、必ず元の列を対象にします。数式の列を数えると全件になります。

ここは間違えやすいところです。数式で「入力済みなら1」のような列を作って数えたくなりますが、その列は全行に値が入ります。

4. 数式を作ったら、空の行を1つ作って見る

いちばん簡単な確認方法です。何も入力していない行を1つ作って、数式の列に何が出るかを見ます。

0が出ていたら、集計に影響します。空なら安全です。30秒でできて、あとから原因を探すより何倍も速いです。

5. 平均が合わないと思ったら、分母を疑う

以前、集計では平均だけ分母が違うという話を書きました。今回のことは、その続きにあたります。

数値をそのまま集計するときは、空欄が分母から外れます。数式を挟むと、空欄が0になって分母に入ります。どちらも仕様どおりですが、結果は変わります。

合計は一致するので、合計で検算しても気づけません。平均が合わないときは、まず何を集計しているかを確認してください。

よくある質問(FAQ)

空欄が0になるのは、どの計算ですか。

数値として足したり掛けたりする計算です。文字の長さを数える計算でも0が返りました。一方、0で割った場合や、日付が空のまま差を出した場合は空が返ります。作ったら空の行で確認するのが確実です。

数式で空を返すには、どう書けばいいですか。

「値が空かどうか」を判定して、空なら空を返す分岐を入れます。条件分岐の関数と、空かどうかを調べる関数を組み合わせる形です。数式は長くなりますが、集計が合うようになります。

合計は合っているのに、平均だけ違います。

今回の話がそのまま当てはまります。0を足しても合計は変わりませんが、平均の分母は増えます。数式の列を集計していないかを確認してみてください。

進捗率を数式で出したいのですが。

件数を数える部分は、数式ではなく元の列を対象にしてください。数式の列は全行に値が入るので、必ず全件になります。

型が合わない数式が作れてしまうのは、なぜですか。

理由は確かめられていません。分かっているのは、文字と数値を足す数式が作成時に拒否されなかったことと、存在しない列を参照する数式は拒否されたことです。作れたからといって正しいとは限らない、と考えておくのが安全です。

数式の中で、別の数式を参照できますか。

できました。参照された側の結果を使って計算されます。ただし、元の数式が空欄を0にしていれば、その0が伝わっていきます。

空の行を1つ作って、見てみてください

何も入力していない行を作って、数式の列に何が出るかを確認する。0が出ていたら、その列は集計の分母に入っています。30秒で終わって、あとから原因を探すより何倍も速いです。

Notionを使ってみる

上部へスクロール