【问题标题】:Triggering function refresh when using ArrayFormula使用 ArrayFormula 时触发函数刷新
【发布时间】:2021-06-22 16:23:03
【问题描述】:

我遇到了一个问题,我需要确保 Google 表格在数据更改时触发单元格刷新。出于各种原因,我的工作表设置方式是我在单元格的标题中有一个 ArrayFormula 计算/登录,它基本上会计算它下面的所有行。为简单起见,我的方程是 ArrayFormula 并传递一个值,例如“C2:C”,这最终是说“请给我给定行的 C 列的值。所以我可能有类似 ArrayFormula(C2:C + 1) 的东西 - 这实际上是说'给我当前行的 C 列并添加一个。

现在,问题是我正在构建一个自定义函数,我们称之为 Foo,并且我还想将它传递给“给定行的列 C” - 所以现在可以说我的 ArrayFormula 看起来像这样:ArrayFormula(Foo( C2:C))。

我认为,问题在于,由于谷歌表格试图巧妙地缓存函数调用的方式,它无法识别值何时更改并重新计算调用。 Google 表格看到“C2:C”根本没有改变,所以它不会刷新它,即使我确实改变了给定行的 C 列的值。

有人对如何更好地实施或解决此问题有任何建议吗?

我使用以下谷歌表格创建了一个很好的测试用例:https://docs.google.com/spreadsheets/d/1fCiRSiuII-2vOWJD9LWWkh9qjK0P_dZskofwBYxiZUI/edit?usp=sharing

如果您注意到,我有两列,Total Sft 和“Total sqft New”。这两个都应该产生相同的值。在第一个中,我进行了手动乘法 - 例如 A2:A*B2:B - 生成了预期的结果。 在第二列中,我创建了一个名为 testFunctionMultiply 的测试函数,而不是手动多重方程,它执行相同的操作 - 将值相乘。

如您所见,这些列显示不同的值,而我本以为它们会匹配。想法?

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    数组公式不适用于每个函数。例如,像本机 DGET 函数一样。如果您修改函数以接受数组,那么它会按预期工作。 Here 是您工作表的副本。

    现在的公式是:

    ={"Total Sqft New";ARRAYFORMULA(IF(ISBLANK(Sheet1!A2:A),,testFunctionMultiply(A2:A,B2:B)))}
    

    脚本:

    function testFunctionMultiply(param1, param2) {
      const arg1 = param1.flat()
      const arg2 = param2.flat()
      const output = []
    
      for (i = 0; i < arg1.length; i++){
        output.push([Number(arg1[i])*Number(arg2[i])])
      }
    
      return output
    }
    

    提示:

    不要使用“”作为空值。例如,Google 应用程序脚本将在 .getLastRow() 方法中获取此信息。

    //Wrong:
    =IF(A2 = "","","Not blank"
    
    //Good:
    =IF(A2 = "",,"Not blank:
    

    【讨论】:

    • 谢谢!这有助于我更好地理解我所缺少的。但是上面的一个关键问题是,它会导致对每个新行条目进行重新计算,不是吗?现在我遇到了超时问题。有什么聪明的解决方案可以解决这个问题,所以它只计算新条目?
    • 这就是数组公式的原理。或者修改不返回自定义函数但将值粘贴到工作表本身的脚本。然后您可以通过菜单/快捷方式/按钮/计时器触发器重新运行此脚本。然后你(或触发器)在你添加完行后运行。
    • 嗨 Remco - 对不起,我不明白你的评论。你能重新解释一下吗?由于我的工作表有数千行,而且说实话,我只使用 arrayformula 是因为需要它的不同集成,因此它会触发新条目 - 所以通常计算确实是一次性的,不需要为每个人重新计算。需要有关如何保持此性能的架构指导。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2018-07-16
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多