使用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)
但显然这是无效的。
有什么好方法可以获得实际具有新值的线上的差值吗?
谢谢,希望有人能提供帮助。
答案 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
错误。