安装程序:我有一个Google表,我想在其中运行一个使用脚本实现的自定义函数。此脚本用于执行相对较长的URL查找和解码过程(每次调用10 ms,取决于带宽和ping)。自定义函数使用一个列作为输入,并返回结果。
问题:当我的Google工作表打开时,使用此计算的列将被刷新。这会使Google工作表暂停大约10秒,直到重新计算列中的每个单元格为止。当我将其添加到电子表格中时,情况只会变得更糟。
问题:是否可以更改函数脚本,或者更改Google中的设置,以便只在更改输入单元格时计算缓慢的自定义函数?
对于任何好奇的人,这是我的问题的演示表
发布于 2019-05-02 01:52:55
在我对在google中,我可以在自定义函数中包装一个标准函数来控制它何时运行吗?的回答中,我分享了这样的想法:在重新计算“昂贵的公式”时,有两个名为“冻结”/“解冻”的按钮来控制。
在这种情况下,您可以在关闭电子表格之前用自定义函数“冻结”范围,以便下次打开它时会打开得更快,然后当您需要更新冻结的范围时,就会“解冻”它。
在发布了最初的版本后,OP要求提供一个简单的版本,但是由于我最初的实现是一些快速而肮脏的西班牙语内容,所以我在那里共享了最重要的代码行。核心方法服务是
copyTo覆盖公式结果范围,其值仅为la复制粘贴值。clear删除先前粘贴的公式结果setFormula将公式添加回电子表格。然后,我意识到我可以改进发布的未列出的Google工作表附加项,它使用PropertiesService实现“公式存储”,其中包含添加/删除/列出公式和动态菜单而不是按钮的函数。
要尝试的其他方法是使用时间驱动的触发器来运行,如果您忘记冻结自定义函数结果的范围,就让它在夜间运行。
发布于 2019-11-03 00:46:32
如果有较少的自定义函数,性能会稍微好一些。您可以重写您的函数以接受数组,因此您将只有一个函数,而不是一次运行100个函数。
function mySlowFunction(x) {
//Utilities.sleep(x*100); //100 ms
if (x.map) {
return x.map(function(y) {return mySlowFunction(y) });
} else {
return x * 100;
}
}https://stackoverflow.com/questions/54623539
复制相似问题