服务次数过多(Google Apps脚本)

jrc*_*03c 14 google-sheets google-apps-script custom-function

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

function foo(){
    return "bar";
};
Run Code Online (Sandbox Code Playgroud)

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

[此处截图]

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

(PS - Utilities.sleep()当所有单元同时调用它们的功能时,使用错误消息建议的功能根本没有帮助;它只会降低单个单元重复调用该功能的速率.)

Kyl*_*Mit 25

根据"应用脚本功能指南"中的" 优化"部分:

每次在电子表格中使用自定义功能时,Google表格都会单独调用Apps脚本服务器.如果您的电子表格包含数十(或数百,或数千!)个自定义函数调用,则此过程可能会非常慢.

因此,如果您打算在大范围的数据上多次使用自定义函数,请考虑修改函数,使其以二维数组的形式接受范围作为输入,然后返回一个二维数组即可溢出到适当的细胞.

为此,传入一个输入,表示您要返回的数组的大小.当您开始执行函数时,请检查输入参数是否为数组input.map.如果是,您可以在每个项目上调用该函数并返回整个集合.

所以在你的情况下像这样:

function foo(){
    return "bar";
};
Run Code Online (Sandbox Code Playgroud)

您可以像这样更新功能:

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";
  }
};
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

截图

  • 如果 `foo` 函数接受多个参数,但只有第一个参数可能是数组,是否也有类似的方法来递归数组? (2认同)

小智 3

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

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

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

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