如何建立可在Google表格中快速运行的自引用ARRAYFORMULA?

问题描述

Here is an example sheet which you should be able to make a copy of.

Here is a screenshot of that sheet if you just want to look at it for reference.

该表还包含有关该问题的更多详细信息。

但是...

问题的要点是我们有3列(B:D),理想情况下,我们希望将其设置为ARRAYFORMULAS,以便在添加新数据时不断地动态扩展它们。 在这种情况下,每列都有一个数据,用于保存在A2:A中的日期)

这些列中唯一的“静态”输入是最初放置在B2中的数字。

然后需要根据B2中的编号生成单元C2和D2。在我们的 actual 工作表中,有一些相对复杂的逻辑可以进行生成,但是我可以肯定地确定,解决此问题的唯一“重要”依赖是对B2的依赖。

然后,需要根据B2,C2和D2中的数字生成单元格B3。这个逻辑真的 只是B2 + C2 + D2,这很好。

我们遇到的问题是:

很明显,如果每列中都有公式(例如B3 = B2 + C2 + D2,B4 = B3 + C3 + D3 ...),我们可以避免这些问题,但是

  • a)尝试这样做似乎仍然会使工作表与我们使用的计算量非常迟钝(尤其是因为C和D列在我们实际中相对“矮胖”的逻辑)表)

  • b)我们会在这里真的一个动态表,因为它将使工作表的其他方面更加容易

谢谢您的帮助!


这是在B3(using the link above)中编写自引用的ARRAYFORMULA的一种尝试,但是它给出了奇怪的结果,例如即使没有“衰减/匹配”更改负值,排名也会再次下降,这让我认为它没有正确地累积跟踪更改。但这可能有助于了解我的想法:

=ARRAY_CONSTRAIN(

ARRAYFORMULA( ARRAYFORMULA(INDIRECT("B2"&":b"&COUNTA(B2:B))) + C2:C + D2:D),DaysInRange,1)

解决方法

首先,我删除了所有未使用的行和列,这大大加快了速度。

然后我更改了数组公式。如果公式范围指定正确,我认为不需要 ARRAY-CONSTRAIN 函数。

所以试试这个。在 B 列的左侧插入一个空白列。设置新的 B2 = StartRank。 然后在单元格 B3 中:

=ARRAYFORMULA( IF(LEN(INDIRECT("A3:A"&COUNT(A2:A)+1)),INDIRECT("B2:B"&COUNT(A3:A)+1) + 
                      INDIRECT("D2:D"&COUNT(A3:A)+1) + 
                      INDIRECT("E2:E"&COUNT(A3:A)+1),""))

在 D2 中,计算衰减变化:

=ARRAYFORMULA(
  IFS(A2:A = "","",C2:C > GKSheet1!RankCap,round( -1*GKSheet1!DecayPercent*ABS(GKSheet1!RankCap-C2:C)),C2:C < GKSheet1!RankFloor,round(    GKSheet1!DecayPercent*ABS(GKSheet1!RankFloor-C2:C)),TRUE,0))

在 E2 中,计算匹配衰减:

=ARRAYFORMULA(
   IFS(A2:A = "",B2:B > RankCap,F2:F * -10,B2:B < RankFloor,F2:F *  10,F2:F *  60))

我还更改了 A 列的日期公式。我认为唯一的缺点是它不会自动添加行。因此,如果您增加日期范围,即。将您的开始日期移至较早的日期,A 列将被填充,但如果您不添加更多行,则可能不会扩展到“今天”。

我在您的示例表中添加了一个标签 GKSheet1,但我认为我没有更改任何其他内容。它仍然很慢,但这可能是因为工作表中的其他标签。 Here is my sample,里面只有我的一个标签。重新计算大约需要十秒钟,开始日期大约是今天之前的一年 - 例如。如果我们在 2021 年 1 月,则使用 2020 年 1 月 1 日的开始日期。