Google表格 - ArrayFormula计算与以前单元格的差异

时间:2014-04-19 06:20:54

标签: google-sheets array-formulas

使用Google电子表格,我希望能够将公式放入标题列,这样我就不必手动填充行(我有一个每天自动添加值的Google脚本)。我知道执行此操作的常用方法是使用ArrayFormula。

我有一些我想要设置的公式,但是现在我试图在当前单元格和前一行的单元格之间找到区别。

这应该是它应该做的:

Bal Dif 0 20 20 20 0 21 1 22 1

我最接近ArrayFormula的是:

Bal Dif 0 20 20 0 20 1 21 1 22 1

这是使用公式:=arrayformula(D2:D-D1:D)。 它几乎就像我需要=arrayformula(D1:D-D0:D)但显然这是无效的。

有什么好方法可以获得实际具有新值的线上的差值吗?

谢谢,希望有人能提供帮助。

4 个答案:

答案 0 :(得分:1)

我发现了另一种适合我需要的解决方案,这里没有提及无需手动复制(即:使用arrayformula函数)来计算同一列中的值与其前一个值之间的差的问题。

假设您的值位于B列,并从第3行开始:ARRAYFORMULA(IFERROR(IF(ARRAY_CONSTRAIN(B3:B,COUNTA(B3:B),1)>ARRAY_CONSTRAIN(B2:B,COUNTA(B3:B),1),ARRAY_CONSTRAIN(B3:B,COUNTA(B3:B),1)-ARRAY_CONSTRAIN(B2:B,COUNTA(B3:B),1),NA()),NA()))

这里的关键是使用ARRAY_CONSTRAIN([needed_range_for_calculation],[number_of_non_blank_values],1)而不是过滤(我认为这是资源匮乏且可读性较差)。

如果发生错误(例如:B2中的NaN)或先前的值大于当前值,则上面的公式将返回#N / A值。如果允许负差异,则它将变为:ARRAYFORMULA(IFERROR(ARRAY_CONSTRAIN(B3:B,COUNTA(B3:B),1)- ARRAY_CONSTRAIN(B2:B,COUNTA(B3:B),1),NA()))

如果您的公式写在第一行,则@ user3912079在电子表格中使用IF(row(B:B)=1;NA();([your formula]))发布的解决方案应该可以正常工作。

答案 1 :(得分:0)

其实我真的不明白为什么不简单地写'" E2"细胞:

D2-D1(假设您的值在D列中),然后向下拖动公式,直到您有值。 (我知道您在D列中会有越来越多的值,但是您可以添加if条件来检查特定D单元格是否为空,如果不是,则计算前一行的减法。 )

也许这不是你想要的(然后抱歉,我误解了这个问题),但无论如何我会这样做。

希望它有所帮助。

更新:

在理解了真正的问题后,我会使用这个函数:

<强> = ARRAYFORMULA(如果(ISBLANK(A3:A100),&#34;&#34;,过滤器(A3:A100,A3:A100 -1个)-filter(A2:A99, A2:A99 -1个)))

假设您的数据在A列中(并且A列中的值都不小于0!),请将其写入单元格B3,它将​​生成差异。

说明:查看函数的最后一部分 - ... filter(A3:A100,A3:A100&gt; -1)-filter(A2:A99,A2:A99&gt; -1) - 这只是两个查询,它们将返回两个相同大小的列表。第一个是A3-A100,第二个是A2-A99。两个列表中的元素应该相等是至关重要的。 (在这种情况下,98个元素都在两个列表中)。并且在两个列表之间存在减法( - )符号,因此如果我们在这两个列表之前放置ARRAYFORMULA,它将对每个&#34;对进行减法。在列表中。列表的第一个元素是&#34; A3&#34;和&#34; A2&#34;,所以A3-A2将是B3的值。列表的第二个元素是&#34; A4&#34;和&#34; A3&#34;,所以A4-A3将转到B4,依此类推。所以基本上我们已经完成了:

<强> = ARRAYFORMULA(过滤器(A3:A100,A3:A100 -1个)-filter(A2:A99,A2:A99 -1个))

主要部分已完成,但额外的IF用于如果当前A字段为空,则我们写一个空字符串(&#34;&#34;),否则我们计算上面提到的减法。

再次完整的功能:

<强> = ARRAYFORMULA(如果(ISBLANK(A3:A100),&#34;&#34;,过滤器(A3:A100,A3:A100 -1个)-filter(A2:A99,A2:A99&GT ; - 1)))

如前所述,此函数假定A列中只有非负数。如果不是这种情况,只需将过滤条件(-1)重写为非常小的NEGATIVE数。 (如&#34; -99999999&#34;)

希望它有所帮助。

答案 2 :(得分:0)

我迟到了吗? 我也到了下一行的数组公式。为什么不在aray中查看下一行的值,所以你同时拥有新值和差值。

https://docs.google.com/spreadsheets/d/1mR2zI1KKqBtj0LGgO_keWyVbWRqotsLTiak40BNXI8E/edit?usp=sharing

评论:我已经使用过这些数组,它们在两个地方寻找下一行。在创建公式时,工作表都会超过30000行,但是嘿可以删除,并且每次都可以。

答案 3 :(得分:0)

我发现以前的答案有点复杂。

假设 A2:A 包含数据,以下内容更为简洁:

=ARRAYFORMULA(IF(A2:A="", "", IF(ROW(A2:A)=ROW(A2), "", A2:A-A1:A)))

这会生成下表:

<头>
巴尔 差异
0 ##公式在这里##
20 20
20 0
21 1
22 1

说明:

带有 IF 的第一个 (A2:A="") 避免填满整个列。它还避免了片材的膨胀。如果没有那个检查,工作表会在后台无限增长。当页面大小达到限制时会触发错误。

带有 IF 的第二个 ROW(A2:A)=ROW(A2) 处理第一行数据,如果我们需要第一行中的其他内容,我们可以更改这一行。

最后一部分 (A2:A-A1:A) 计算差异。在大多数其他计算中,Google 表格会抱怨 ARRAYFORMULA 定义中的尺寸不匹配。在这种情况下,虽然 A2:A 的大小小于 A1:A

如果允许我们把公式放在 B3 处,公式可以更简单:

=ARRAYFORMULA(IF(A3:A="", "", A3:A-A2:A))

注意:对于知道 IFS 语句的人来说,它在这里不起作用。 IFS 公式将失败并出现 size mismatch 错误。