0

使用 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

4 回答 4

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]))用于检查它是否是第一行的解决方案应该可以正常工作。

于 2020-01-06T14:05:05.297 回答
0

其实我真的不明白你为什么不简单地写信给“E2”单元格:

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

也许这不是你要找的(那么对不起,我误解了这个问题),但无论如何我会这样做。

希望它有所帮助。

更新:

在了解了真正的问题之后,我会使用这个功能:

=arrayformula(if(isblank(A3:A100),"",filter(A3:A100,A3:A100>-1)-filter(A2:A99,A2:A99>-1)))

假设您的数据在 A 列中(并且 A 列中没有任何值小于 0!),将其写入单元格 B3,它将​​产生 diff-s。

说明:查看函数的最后一部分 - ...filter(A3:A100,A3:A100>-1)-filter(A2:A99,A2:A99>-1) - 这只是两个查询返回两个相等大小的列表。第一个来自 A3-A100,第二个来自 A2-A99。两个列表中的元素必须相等,这一点很重要。(在这种情况下,两个列表中都有 98 个元素)。并且两个列表之间有一个减法 (-) 符号,因此如果我们将 ARRAYFORMULA 放在这两个列表之前,它将对列表中的每个“对”进行减法。列表的第一个元素是“A3”和“A2”,因此 A3-A2 将是 B3 的值。列表的第二个元素是“A4”和“A3”,因此 A4-A3 将转到 B4,依此类推。所以基本上我们完成了:

=arrayformula(过滤器(A3:A100,A3:A100>-1)-过滤器(A2:A99,A2:A99>-1))

主要部分已经完成,尽管额外的 IF 用于如果当前 A 字段为空白,则我们写入一个空字符串 (""),否则我们计算减法,如上所述。

所以再次完整的功能:

=arrayformula(if(isblank(A3:A100),"",filter(A3:A100,A3:A100>-1)-filter(A2:A99,A2:A99>-1)))

正如我之前所说,此函数假定 A 列中只有非负数。如果不是这种情况,只需将过滤条件 (-1) 重写为一个非常小的负数。(如“-99999999”)

希望能帮助到你。

于 2014-04-24T16:36:21.890 回答
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

解释:

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

第二个IFwithROW(A2:A)=ROW(A2)处理第一行数据,如果我们在第一行需要其他东西,我们可以改变这一行。

最后一部分 ( A2:A-A1:A) 计算差值。在大多数其他计算中,谷歌表格抱怨ARRAYFORMULA定义中的大小不匹配。在这种情况下,它可以正常工作,尽管 的大小A2:A小于A1:A.

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

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

注意:对于知道该IFS语句的人,它在这里不起作用。IFS公式将因size mismatch错误而失败。

于 2021-06-10T22:11:40.533 回答
-1

我迟了吗?我也到达了查看下一行的数组公式。为什么不在数组中查看下一行的值,这样您就可以在同一行中同时获得新值和差异。

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

评论:我使用了这些数组公式,它们在两个地方查找下一行。在创建公式时,工作表都超过 30000 行,但是可以删除它们,一切正常。

于 2017-06-12T01:56:33.743 回答