【问题标题】:Custom Functions and Recalculation自定义函数和重新计算
【发布时间】:2014-08-06 14:37:30
【问题描述】:

我有一个自定义函数,它接受三个范围名称作为输入参数。当这些范围内的单元格值发生变化时,函数输出保持不变。这是平台的“功能”。

是否有任何适当的方法(到目前为止)使 Google 表格中的自定义函数动态重新计算?我知道人们曾尝试将now() 添加为参数,该参数用于不断地重新计算而不管需要。 (现在被新床单屏蔽了。)有没有人找到满意的解决方案?

【问题讨论】:

    标签: google-apps-script google-sheets custom-function


    【解决方案1】:

    使自定义函数重新计算的正确方法是更改​​它的参数。关于使用 NOW() 和其他类似的内置函数作为自定义函数的参数,来自Custom functions in Google Sheets

    自定义函数参数必须是deterministic。也就是说,内置 每次返回不同结果的电子表格函数 计算 - 例如 NOW() 或 RAND() - 不允许作为参数 一个自定义函数。如果自定义函数尝试返回基于值 在这些 volatile 内置函数之一上,它将显示 Loading... 无限期。

    comment Mogsdad 到这个答案:

    实际上,这将显示#ERROR!,而不是“Loading...”,此函数不允许使用NOW()、RAND() 或RANDBETWEEN() 引用单元格

    【讨论】:

    • 实际上,这将显示#ERROR!,而不是“正在加载...”,此函数不允许使用 NOW()、RAND() 或RANDBETWEEN()
    【解决方案2】:

    问题:-

    电子表格单元格上的自定义脚本只会在单元格上定义的自定义函数的参数发生更改或被操作时自行执行。如果它们保持不变,则从缓存中驱动较早的结果。

    可能的解决方案:-

    A)

    显然,您可以在任何单元格上使用 Now(),然后将该单元格传递给您的函数参数。确保每分钟更改电子表格设置 -> 计算 -> onchange。 (这将每分钟更改一次函数的参数,从而执行脚本)

    更新的电子表格似乎不允许 Now() 或 Rand() 等 函数不再间接/直接传递给自定义 功能。

    B)

    添加一个“刷新”菜单项,并可能转到您的脚本并定义一个函数,当您单击“刷新”菜单时该函数会更改单元格的值。将该值作为参数传递给执行脚本的函数。

    C)

    转到您的脚本并创建一个函数。假设 updateCellValue()。现在在这里定义相同的逻辑,旨在更改单元格的值。

    示例:SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());

    现在转到 Edit->Current Project 的触发器并创建一个触发器,该触发器将在每个自定义时间限制后触发您的函数 (updateCellValue)。这将与解决方案 B 执行相同的操作,但您不必单击菜单的刷新按钮。

    似乎有点 hack 但我可能觉得这是目前唯一的方法 更新电子表格以获取自定义功能,例如获取数据 从服务器动态获取。

    【讨论】:

    • 感谢(选项 C)!我试过了,但它消除了我的日期格式(我需要是一个特定的模式)。你知道我如何维护格式并只更新值吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 2015-02-05
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多