【问题标题】:Google Sheets ArrayFormula performance problemGoogle Sheets ArrayFormula 性能问题
【发布时间】:2021-07-20 13:16:27
【问题描述】:

我有一个包含 2 列的数组,其中每个单元格都应该执行属于其前身的添加操作。 数组的长度取决于长度变化的第三列。所以我决定使用 ArrayFormula 来执行操作:

=ARRAYFORMULA($D2:D+$C3:C)

从单元格 D3 开始,这应该取其前一行的值并添加其左侧相邻列的值。不幸的是,这不起作用,因为 ArrayFormula 不支持不同长度的数组。

我解决这个问题的第一步是通过手动定义数组来使它们具有相同的长度:

=ARRAYFORMULA($D2:D290+$C3:C291)

这可行,但我发现它的性能太慢了。我可以从字面上看它逐个单元格地填充列单元格。这取决于所需的预计算,这些预计算总是引发 CellChanged-Events 开始下一次计算。看来,这不能并行化。

问题 1:有没有办法更快地执行此操作?只要我保持数组的长度固定,我就可以在每个单元格中使用简单的加法运算,但这对我的第二个问题没有帮助。

问题 2:有没有办法对不同长度的数组进行这些计算?

Example how it looks (fixed array-length) (Cropped to show, how the values really are added

【问题讨论】:

  • 您的 C 或 D 列是否也填充了公式?我刚刚测试了 444 行,数组公式立即计算了它们。
  • 您好,C 列由另一个 ArrayFormula(带有嵌套查询)填充。 D 列是我要填充的列。
  • 你能分享一份你的工作表吗?
  • 我添加了外部数据以将此工作表填充到工作表本身,并将 C 列中的填充查询更改为此子集。这是我真正的测试值。一个有趣的事实是,ArrayFormular 的工作方式再次不同,并使用 0 而不是 2 行填充列,其中 evalues 出现在 C 列中。docs.google.com/spreadsheets/d/…

标签: arrays performance google-sheets array-formulas


【解决方案1】:

我添加了一个新工作表(“Erik 帮助”)。在该表中,我删除了 D 列中的所有内容,包括标题,并在 D1 中将其替换为以下公式:

=ArrayFormula({"Div/SLR-"&CHAR(10)&"Kumuliert";IF(A2:A="";;SUMIF(IF(ROW(A2:A);ROW(A2:A));"<="&ROW(A2:A);C2:C))})

标题中间的&CHAR(10)& 不是绝对必要的;我只是觉得它可以制作更整洁的表格,因为它可以控制标题的中断并减小列的宽度。

公式的其余部分基本上用简单的英语写成,“继续将 C 列中小于或等于 D 列中每一行向下移动的行逐一求和。”

至于您的工作表中处理速度慢的问题,您的工作表中有超过 31,000 行,这意味着您的公式必须全部处理,即使其中大部分是不必要的。您会注意到我添加的工作表在行和列中都进行了修剪,只包含比您可能需要的略多一点的内容;因此,我的公式会在您的 A1 公式加载后立即处理。

另外,我不清楚为什么您的 A1 公式要求从 2020 年 3 月 3 日开始接收数据,而此时您的第一个“Div/SLR-List”日期才到 6 月。我建议将 A1 公式中的“起始”日期替换为对 K2 的引用。

【讨论】:

  • 非常感谢!只要行受到 IF(A2:A=""... 语句的限制,该解决方案就可以正常工作并且性能也很好。:)
  • 太棒了。感谢您进行报告并将回复帖子标记为“最佳答案”。这确实有助于这里的所有贡献者一目了然地知道哪些问题已经解决。它还可以帮助像您这样的所有未来网站访问者快速找到他们想要找到的答案。
猜你喜欢
  • 2020-06-12
  • 2020-12-03
  • 2020-08-15
  • 2015-07-16
  • 2020-09-06
  • 2021-07-25
  • 2020-04-13
  • 1970-01-01
  • 2017-11-26
相关资源
最近更新 更多