14

我想使用 Google Apps 脚本为电子表格制作自定义函数。我做了一个非常简单的功能:

function foo(){
    return "bar";
};

问题是我需要在几百个单元格中使用此功能。当我将函数粘贴=foo()到所有这些单元格中时,该函数在一些单元格中工作,但在大多数情况下,我收到此错误:“服务调用次数过多:电子表格。Utilities.sleep(1000)在调用之间尝试。”

[此处截图]

我想我不明白为什么这个简单的函数被认为是对电子表格服务的调用。我什至没有请求任何数据(函数本身除外)。那是问题吗?如果是这样,是否有解决方法?自定义函数可以使 Google 电子表格功能无限强大,但这个问题阻碍了在多个单元格中使用自定义函数的可能性。建议?

(PS——Utilities.sleep()当所有单元格同时调用它们的函数时,使用错误消息建议的函数根本没有帮助;它只会减慢单个单元格重复调用函数的速率。)

4

2 回答 2

27

根据Apps 脚本功能指南的优化部分:

每次在电子表格中使用自定义函数时,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";
  }
};

然后这样称呼它:

截屏

于 2015-04-15T18:29:35.847 回答
3

通过调用电子表格中的函数,您可以调用电子表格服务,要求它往返于服务器以运行函数的结果。结果,您在很短的时间内发出了几百个请求。

一种解决方法可能是一次添加几个单元格的函数。当然,当您随后再次打开工作表时,您可能会遇到同样的问题。

根据您的功能要完成的工作,可能值得使用内置的电子表格功能。那里有很多权力。编写一个作用于一系列值而不是单个单元格的函数可能是另一个更好的选择。它可以通过自定义菜单项或使用脚本管理器来触发。

请记住,在使用电子表格时,批处理操作是您最好的朋友。

于 2012-12-20T14:19:54.050 回答