我想使用Google Apps脚本为电子表格制作自定义功能。我做了一个非常简单的功能:
function foo(){
return "bar";
};
问题是我需要在几百个单元格中使用此功能。当我将函数=foo()
粘贴到所有这些单元格中时,该函数可以在一些单元格中运行,但在大多数情况下我都会收到此错误:“服务调用太多次:电子表格。请尝试{{1在电话之间。“
我想我不明白为什么这个函数很简单,被认为是对电子表格服务的调用。我甚至没有请求任何数据(除了函数本身)。那是问题吗?如果是这样,有没有解决方法?自定义函数可以使Google Spreadsheets无限强大,但是这个问题限制了在多个单元格中使用自定义函数的可能性。建议?
(PS - 当所有单元同时调用它们的函数时,使用错误消息建议的Utilities.sleep(1000)
函数根本没有帮助;它只会降低单个单元格重复调用函数的速率。)
答案 0 :(得分:21)
根据“应用脚本功能指南”中的Optimization section:
每次在电子表格中使用自定义功能时,Google表格都会单独调用Apps脚本服务器。如果您的电子表格包含数十(或数百,或数千!)个自定义函数调用,则此过程可能会非常慢。
因此,如果您打算在大范围的数据上多次使用自定义函数,请考虑修改函数,使其以二维数组的形式接受范围作为输入,然后返回二维可以溢出到适当单元格中的数组。
要执行此操作,请传入一个表示您要返回的数组大小的输入。当您开始执行函数时,请检查输入参数是否为input.map
的数组。如果是,您可以在每个项目上调用该函数并返回整个集合。
所以在你的情况下这样:
function foo(){
return "bar";
};
您可以像这样更新功能:
function foo(input){
if (input.map) { // Test whether input is an array.
return input.map(foo); // Recurse over array if so.
} else {
// do actual function work here
return "bar";
}
};
然后像这样称呼它:
答案 1 :(得分:3)
通过调用电子表格中的函数,您可以通过要求它往返于服务器以运行函数结果来调用电子表格服务。因此,您可以在很短的时间内提出几百个请求。
一种解决方法可能是一次添加几个单元格。当然,当您随后再次打开工作表时,您可能会遇到同样的问题。
根据您的功能尝试完成的内容,使用内置电子表格功能可能值得。那里有很多力量。编写一个作用于一系列值而不是单个单元格的函数可能是另一个更好的选项。它可以通过自定义菜单项或使用脚本管理器触发。
请注意,批处理操作是您处理电子表格时最好的朋友。