文章

Google 表格公式 - 比较空

本文介绍比较空值和查找非空值

为什么会专门拿出这个东西来说呢?难道不是有一堆比较空值的函数吗?当然,既然拿出来,就说明预设的函数有些不合期望的行为。不管是 COUNTA 还是 COUNTIF 还是 ISBLANK,它们共同的问题就是并不把形如 ="" 的结果视为空。

比如我们用 FILTER 或者 QUERY 筛选出了一些值,我们想计算这些值的个数,一般情况下是没问题的,但是如果没有筛选出任何值,通常函数会返回一个 #N/A,这个值会被计数为 1。

为了避免这个情况,“聪明”的我们将筛选公式用 =IFNA(..., "") 包了起来,满以为这个“空值”就不会被计数了吧,但结果并没有什么区别,还是为 1。因为 经过公式计算出的 "" 值,并不是空值

后注:当然,这里如果使用 =IFNA(...),即省略第二个参数,那结果就是真正的空值了。不过为了继续后面的讨论,我们先假设不知道这一点。

我们拿这个样表做个实验,其中 A5 处有公式 ="",而 A3A6 处是真的什么也没有。

 ABC
1a  
21  
3   
40  
5   
6   
7e  

我们如何计算 A 列有多少个非空值?

我们期望的非空值是 4 个,那么怎么通过公式获得呢?COUNT 肯定就可以排除了,只能计算数值而不能计算字符串,所以我们用 COUNTA 试试。

B1 填入公式 =COUNTA(A1:A)

 ABC
1a5 
21  
3   
40  
5   
6   
7e  

结果不太如意啊,为什么是 5 不是 4 呢?因为 A5 处有公式,虽然看上去是空的,但并非空值。

呵呵。

那有没有其他办法呢?

我们来试试 COUNTIF 的各种跟空值有关的比较。

C1 填入 =COUNTIF(A1:A, "=")D1 填入 =COUNTIF(A1:A, "<>")E1 填入 =COUNTIF(A1:A, "")

 ABCDE
1a5253
21    
3     
40    
5     
6     
7e    

其实前两个结果也是一样的,都把 A5 当成非空值计算了,但是 E1 的公式可以同时获取到真的为空和看上去为空的值,它的结果为 3,也就是说它把 A3A5A6 都看为空了。这是最接近结果的一个公式,为了取得我们期望的非空值,我们可以把总范围长度减去这个值。

F1 填入公式 =ROWS(A1:A)-COUNTIF(A1:A, "")

 ABCDEF
1a52534
21     
3      
40     
5      
6      
7e     

不容易,我们终于得到 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。

 ABCDEFGHI
1a52534 45
21        
3         
40        
5         
6         
7e        

总结来说,计算我们直观上的非空值可以用如下三个公式:

  • =LET(r, A1:A, ROWS(r)-COUNTIF(r, ""))
  • =COUNTIF(MAP(A1:A, LAMBDA(x, x="")), FALSE)
  • =COUNTIF(ARRAYFORMULA(A1:A=""), FALSE)

第三个公式原理上跟第二个一样。(相比来说竟然还是第一个公式最短……)

本文由作者按照 CC BY 4.0 进行授权