新的Google表格自定义功能有时会无限期地显示"正在加载..."

Ang*_*elo 25 google-sheets google-apps-script

特定于:"新"谷歌表.

这是谷歌在新表中强调的已知问题.

问题:如果您在谷歌工作表的谷歌应用程序脚本中编写复杂的*自定义函数,您偶尔会遇到单元格,在单元格周围显示一个红色错误框,文本为"正在加载..."

谷歌建议:

如果发生这种情况,请尝试重新加载页面或重命名该函数并更改对新名称的所有引用.

但是对于遇到此问题的其他开发人员(以及谁无法逃避"加载..."错误),我在下面的答案中写了我的发现,如何一致地克服这个问题(有限制).


*我们将此问题视为Google Sheet无限期"错误......加载数据"问题的规范答案.它不仅限于复杂或慢速的功能.

Ang*_*elo 9

重要提示:在实验时创建整个电子表格的多个副本。我有 3 个谷歌电子表格已损坏并完全无法访问(卡在刷新循环中)。当我尝试自定义函数时发生了这种情况,所以您已被警告!

您需要尝试以下一种或多种方法来解决此问题:

  1. 根据谷歌的建议,尝试重新加载电子表格或重新命名函数或更改单元格中的参数,看看是否可以解决问题。

  2. 将所有自定义函数放在 try-catch 块中。这将有助于检测您可能未正确测试的代码问题。例如:

    try{ //方法 }catch(ex){ return "Exception:"+ex; }

  3. 恢复到旧工作表并测试您的功能并检查任何其他类型的错误,例如无限循环或无效的数据格式。如果该功能在旧工作表中不起作用,那么在新工作表中也将无法工作,并且调试起来会更加困难。

  4. 确保您的参数均不会引用、预期或将包含大于 100 万 (1000000) 的数字。不知道为什么,但是使用大于一百万的数字作为任何参数都会导致您的函数无法执行。如果必须,请要求减小输入的尺寸(可能除以 1000 或要求使用 M 而不是 mm)。

  5. 检查数字或浮点问题,其中数字可能超过一组正常的有效数字。新工作表的数字似乎有点问题,因此如果您期望非常大或非常复杂的数字,您的函数可能无法工作。

最后,如果上述方法都不起作用,请切换到旧的谷歌表格并继续工作。如果您发现任何其他限制或函数无法执行的原因,请写在下面,以供我和其他g-sheet重度用户使用!

  • 改用旧床单的建议不再适用。 (4认同)
  • 不要将新工作表与应用程序脚本一起用于生产代码。他们还没有完全准备好天然气。即使您遵循此建议,它也可能会以其他方式出现问题。只是进行试验,但不要将其提供给用户。 (2认同)

小智 6

我还有以下功能的无限加载问题.

// check if an item can be checked off
function checkedOff( need, have ) {
  var retStr = "nope";
  if( have >= need ){
    retStr = "yep";
  }
  return retStr;
};
Run Code Online (Sandbox Code Playgroud)

事实证明你不应该有一个尾随";".删除分号解决了这个问题.

// check if an item can be checked off
function checkedOff( need, have ) {
  var retStr = "nope";
  if( have >= need ){
    retStr = "yep";
  }
  return retStr;
}
Run Code Online (Sandbox Code Playgroud)

这可以像人们期望的那样运行.


小智 5

FWIW,我刚刚遇到了这个问题,罪魁祸首最终是一个getRange()将数千行拉入数组的调用。它会定期挂在“正在加载...”消息上。

我通过将该范围放入文档缓存来解决它。这有点笨拙,因为缓存只存储字符串,而不是数组,但是您可以.split(',')在需要访问数组时将其强制回数组。

(在我的情况下,它是一个单一的数组。可能有一种方法可以使用双数组来做到这一点,通过将每一行或每一列发送到自己的缓存中,或者一次读取 N 个项目的缓存值,每个 N 成为它自己的大批。)

这是我的代码中的相关部分:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("mySheet"); //search the "mySheet" sheet
// is the big list already in the cache?
var cache = CacheService.getDocumentCache();
var cached = cache.get("columnValues");
if (cached != null) {
   var columnValues = cached.split(','); // take the cached string and make it an array
} else { // it's not in the cache, so put it there
  var column = 1; // the column with your index
  var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); // first row is header
  cache.put("columnValues",columnValues,60000); // this forces the array into a string as if you used .join() on it
}
Run Code Online (Sandbox Code Playgroud)

这绝对是 Apps 脚本中的一个错误——getRange() 不应该在没有超时或错误消息的情况下挂起。但至少有一个解决方法。这是针对它打开的错误,我还在其中放置了工作表中的完整 code.gs。