ArrayFormula和"AND"公式在Google Sheets中的应用

71

在Google Sheets中,当使用AND公式的ArrayFormula时,我没有得到应该得到的结果。

A B
6 7

在单元格C1中,我输入以下公式:=and(A1>5,B1>6) ,然后我得到了 True 的结果。但如果在单元格 D1 中输入公式:=ArrayFormula(and(A1:A>5,B1:B>6)) 我得到的结果是 False

以下是我的两个问题:

  1. 为什么ArrayFormula不会对整个列重复执行?
  2. 为什么我在没有使用ArrayFormula的情况下得到了True,但用了ArrayFormula后却得到了False
4个回答

123

AND对于数组公式的运作方式并不相同,因为它会将整个数组在左上角单元格中进行AND操作,而不考虑维数个数。

即它检查的是"">"",它是FALSE,与任何东西进行AND操作都会返回FALSE,并将该结果向下传递。

您可以使用真值乘法来创建可与ARRAYFORMULA一起使用的AND操作,就像这样:

=ArrayFormula((A1:A>1)*(B1:B>6) = 1)

OR 的等效写法显然是

=ArrayFormula((A1:A>1)+(B1:B>6) > 0)

4
你也可以反过来使用它,FALSE、空白和0为假,其他所有内容为真。这让你可以使用快捷方式,例如 ARRAYFORMULA(IF(LEN(A2:A), <something>, "")) :) - Robin Gertenbach
还有一个有趣的运算:异或(XOR):=ArrayFormula((A1:A>1)<>(B1:B>6)) - General Grievance
请注意,在条件周围需要加上括号;否则,乘法或加法会优先于比较运算符。 - Aaron Dunigan AtLee
1
谢谢。此外,AND在ARRAYFORMULA中的行为令人惊讶,似乎违反了最小惊奇原则。顺便说一下,NOT在ARRAYFORMULA中的行为不是这样的吗? - Cheeso
1
AND是一种聚合函数,SUM的行为类似于它聚合整个范围。NOT不是一种聚合函数,因此预计会逐个元素进行操作。我认为可能有多种情况,人们对不同的聚合函数的正确行为有不同的期望。始终将其应用于整个范围可以给出一个简单的经验法则,即聚合在数组公式中不会改变。(这里可能会漏掉一些反例) - Robin Gertenbach

9
=ARRAYFORMULA(IF(ISNUMBER(G3:G),IF(AND( G3:G>=7.5,G3:G<=8),"Full Day",IF(AND(G3:G>8,G3:G<24) ,"Full Day+",IF(AND(G3<7.5,G3>=4),"Half Day",IF(G3<4,"Short Leave",)))),))

由于您使用了ARRAYFORMULA函数,您应该使用*代替AND函数。
=ARRAYFORMULA(IF(ISNUMBER(A3:A),IF((A3:A>=7.5)*(A3:A<=8),"Full Day",IF((A3:A>8)*(A3:A<24) ,"Full Day+",IF((A3<7.5)*(A3>=4),"Half Day",IF(A3<4,"Short Leave",)))),))

使用ARRAYFORMULA函数时,应该使用*代替AND函数,使用+代替OR函数。


说明

我现在不记得有关此事的官方网站了。在任何情况下。

点1
ARRAYFORMULA中,AND给出一个单一值。而不是TRUE/FALSE的数组

点2
您还必须记住,在“数学语言”中,TRUE=1FALSE=0

意思是

+----------+--------+
| Formula  | Result |
+----------+--------+
| =TRUE+2  |      3 |
| =FALSE+2 |      2 |
+----------+--------+

如您所见,可以在布尔值TRUE/FALSE1/0之间互相转换。

第三点
关于AND函数

如果所有提供的参数在逻辑上都为真,则AND函数返回true,如果任何提供的参数在逻辑上为假,则返回false。

把它们结合起来
在数组公式中,我们利用上述信息,而不是在进行比较时使用AND/OR

因此,“乘法”(A3:A>=7.5)*(A3:A<=8)仅在两侧均返回TRUE时返回 1(表示TRUE)。所有其他情况都返回 0(表示FALSE)。这就是AND函数的确切行为,并且可以在ARRAYFORMULA中使用。

关于OR函数

如果任何提供的参数在逻辑上为真,则OR函数返回true,如果所有提供的参数在逻辑上为假,则返回false。

在数组公式中使用+(“加法”)代替OR函数时,应用相同的逻辑。


7

AND 不能与 Arrayformula 同时使用。然而,有一种有趣的方法可以在不真正使用它们的情况下使用 ANDOR 运算符。

在使用 arrayformula 时,为了执行 AND 函数,您必须将2个条件相乘,例如:

=arrayformula(if((condition1)*(condition2), value if true, value if false)) 

同样地,使用OR函数是相同的,只不过您需要添加2个条件,而不是使用一个“*”符号。
=arrayformula(if((condition1)+(condition2), value if true, value if false)) 

2
为什么ArrayFormula不会在整个列中重复所有单元格?
正如之前的答案所述,
AND会对整个数组进行操作,而不考虑维度。但是,鉴于电子表格的最新更新,现在可以使用按维度保留AND。如果您想要逐行使用AND,则可以使用BYROW:
=BYROW(
  A2:B4, 
  LAMBDA(
    row,
    AND(INDEX(row,0,1)>5,INDEX(row,0,2)>6))
)

这里,INDEX 用于访问每行的第一列和第二列。如果您不想使用 INDEX ,另一个选择是使用 MAP,它提供了在 LAMBDA 之前对每个参数进行映射的 MAP

=MAP(A2:A4, B2:B4, LAMBDA(a,b,AND(a>5,b>6)))
A B MAP BYROW
6 7
8 1
9 7

1
对我来说,地图是最易读的解决方案,也是最符合最少惊喜原则的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接