Google 表格公式 - 比较空
本文介绍比较空值和查找非空值
为什么会专门拿出这个东西来说呢?难道不是有一堆比较空值的函数吗?当然,既然拿出来,就说明预设的函数有些不合期望的行为。不管是 COUNTA 还是 COUNTIF 还是 ISBLANK,它们共同的问题就是并不把形如 ="" 的结果视为空。
比如我们用 FILTER 或者 QUERY 筛选出了一些值,我们想计算这些值的个数,一般情况下是没问题的,但是如果没有筛选出任何值,通常函数会返回一个 #N/A,这个值会被计数为 1。
为了避免这个情况,“聪明”的我们将筛选公式用 =IFNA(..., "") 包了起来,满以为这个“空值”就不会被计数了吧,但结果并没有什么区别,还是为 1。因为 经过公式计算出的 "" 值,并不是空值。
后注:当然,这里如果使用
=IFNA(...),即省略第二个参数,那结果就是真正的空值了。不过为了继续后面的讨论,我们先假设不知道这一点。
我们拿这个样表做个实验,其中 A5 处有公式 ="",而 A3 和 A6 处是真的什么也没有。
| A | B | C | |
|---|---|---|---|
| 1 | a | ||
| 2 | 1 | ||
| 3 | |||
| 4 | 0 | ||
| 5 | |||
| 6 | |||
| 7 | e |
我们如何计算 A 列有多少个非空值?
我们期望的非空值是 4 个,那么怎么通过公式获得呢?COUNT 肯定就可以排除了,只能计算数值而不能计算字符串,所以我们用 COUNTA 试试。
B1 填入公式 =COUNTA(A1:A)
| A | B | C | |
|---|---|---|---|
| 1 | a | 5 | |
| 2 | 1 | ||
| 3 | |||
| 4 | 0 | ||
| 5 | |||
| 6 | |||
| 7 | e |
结果不太如意啊,为什么是 5 不是 4 呢?因为 A5 处有公式,虽然看上去是空的,但并非空值。
呵呵。
那有没有其他办法呢?
我们来试试 COUNTIF 的各种跟空值有关的比较。
C1 填入 =COUNTIF(A1:A, "="),D1 填入 =COUNTIF(A1:A, "<>"),E1 填入 =COUNTIF(A1:A, "")
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | a | 5 | 2 | 5 | 3 |
| 2 | 1 | ||||
| 3 | |||||
| 4 | 0 | ||||
| 5 | |||||
| 6 | |||||
| 7 | e |
其实前两个结果也是一样的,都把 A5 当成非空值计算了,但是 E1 的公式可以同时获取到真的为空和看上去为空的值,它的结果为 3,也就是说它把 A3、A5、A6 都看为空了。这是最接近结果的一个公式,为了取得我们期望的非空值,我们可以把总范围长度减去这个值。
F1 填入公式 =ROWS(A1:A)-COUNTIF(A1:A, "")
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | a | 5 | 2 | 5 | 3 | 4 |
| 2 | 1 | |||||
| 3 | ||||||
| 4 | 0 | |||||
| 5 | ||||||
| 6 | ||||||
| 7 | e |
不容易,我们终于得到 4 了。当然,因为 A1:A 这个范围用到了两次,为了避免重复,可以用 LET 重构一下,将公式改为 =LET(r, A1:A, ROWS(r)-COUNTIF(r, "")),结果不变。
其实还有另一个办法,在 H1 填入公式 =COUNTIF(MAP(A1:A, LAMBDA(x, x="")), FALSE) 同样可以得到 4。
因为这里 x="" 进行比较时,不管是真的空值,还是公式计算出来的 "" 值,都会得到 TRUE,所以我们计算 FALSE 的个数,得到的就是我们期望的非空值的个数。
但是如果把这里的 x="" 替换为 ISBLANK(x) 就不行了,因为后者会把 "" 视为非空值。
I1 填入公式 =COUNTIF(MAP(A1:A, LAMBDA(x, ISBLANK(x))), FALSE) 结果是 5。
| A | B | C | D | E | F | G | H | I | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | a | 5 | 2 | 5 | 3 | 4 | 4 | 5 | |
| 2 | 1 | ||||||||
| 3 | |||||||||
| 4 | 0 | ||||||||
| 5 | |||||||||
| 6 | |||||||||
| 7 | e |
总结来说,计算我们直观上的非空值可以用如下三个公式:
=LET(r, A1:A, ROWS(r)-COUNTIF(r, ""))=COUNTIF(MAP(A1:A, LAMBDA(x, x="")), FALSE)=COUNTIF(ARRAYFORMULA(A1:A=""), FALSE)
第三个公式原理上跟第二个一样。(相比来说竟然还是第一个公式最短……)