39

专用于:仅“新”谷歌表格

这是谷歌在新表格中强调的一个已知问题。

问题:如果您在 google-apps-script 中为 google 表格编写复杂的*自定义函数,您偶尔会遇到单元格,单元格周围会显示一个红色错误框,并带有文本“正在加载...”

谷歌建议:

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

但是,对于遇到此问题的其他开发人员(并且无法逃脱“正在加载...”错误),我已经在下面的答案中写下了我的发现,说明如何始终如一地克服这个问题(有限制)。


*我们将此问题视为 Google 表格不确定的“错误...正在加载数据”问题的规范答案。它不仅限于复杂或缓慢的功能。

4

13 回答 13

8

我还遇到了以下功能的无限加载问题。

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

原来你不应该有一个尾随的“;”。删除分号解决了这个问题。

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

这正如人们所期望的那样运行。

于 2015-04-10T07:31:52.757 回答
5

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

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

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

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

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

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

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

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

最后,如果以上都不起作用,请切换到旧的 google 表格并继续工作。如果您发现任何其他限制或导致功能无法执行的原因,请在下面为我和其他重度 g-sheet 用户的用户写下!

于 2013-12-21T12:19:44.690 回答
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
}

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

于 2015-10-13T19:24:20.193 回答
5

TL;DR - 尝试复制工作表选项卡并删除旧选项卡

我今天在这个问题上苦苦挣扎,并尝试了一些提到的方法。由于各种原因,我无法重命名该函数。

很明显,如果我在单元格 X25 中调用这样的函数:

=myFunction("a", 1, "b", 2, "c", 3)

单元格将被卡住“正在加载...”,而只需稍微更改参数(例如将数字转换为字符串),单元格就会评估得很好。

=myFunction("a", "" & 1, "b", 2, "c", 3)

只需将代码复制到另一个单元格(例如 X24)并在那里执行它似乎绕过了这个问题。一旦我将它移回原始参数或单元格,它就会再次卡住“正在加载...”。所以我会假设它是某种“Cell ID”、函数和参数的缓存,这在谷歌方面很疯狂。

我足够好的解决方案是简单地复制工作表选项卡,删除旧选项卡,最后将新选项卡重命名为原始名称。这为我解决了这个问题。

于 2019-11-04T14:00:29.600 回答
4

原因之一:需要授权的权限。

至于{这个问题,更好地表述自定义函数的单元格结果,显示令人作呕的模糊消息'正在加载...错误:加载数据...'},实际上是在所有实例相同的情况下/类似的自定义函数调用显示此错误,是谷歌表格需要权限来运行脚本(通常另外:意味着过去它不需要这些),所以而不是 {acting proper: then prompting the user for these permissions else返回那个错误},表格反而挂起这个令人作呕的模糊错误。

可能需要 1 个或多个附加权限:

  1. Google App Scripts 已经重写了他们的权限结构——这个问题现在是怎么发生在我身上的,根据我的内部注释 O80U3Z。
  2. 您的代码或它使用的某些库进行了更改以需要更多访问权限......但在这种情况下,您有更好的机会猜测这个令人作呕的模糊错误的原因,所以希望不会在这里阅读。

为了解决这个问题,我通过以下两种方式显式运行了我的 GAS 电子表格代码:单击我的自定义菜单功能之一,并在“脚本编辑器”中运行我的自定义 JS 功能之一,特别是“onOpen()”,因为这是最全面的。第一个通过弹出窗口
“需要授权应用程序“MM6ZBT(MM6Z83 脚本)”需要授权才能运行。虽然 onOpen() 在 GAS 修改其权限的情况下也这样做了,因为我们使用了该表。然后,当我仍然收到这个“正在加载...”错误时,我重新加载了网页(所以表格),并且,至少对于这些令人作呕的模糊错误的情况,它消失了,计算工作正常:- )

于 2016-05-31T03:47:54.917 回答
3

我也遇到了“正在加载数据...”错误,但这里描述的修复都没有对我有用。它似乎不是由此处描述的问题引起的。就我而言,我将其缩小到一个特定的浮点操作问题(在我看来,它看起来像是 Google 表格中的一个真正的错误),并记录了一个可能的解决方法

谷歌表格/应用程序“加载数据”错误:有更好的解决方法吗?

总结一下(应评论者史蒂夫的要求),如果一个单元格

   = myfunction(B10)

生成了“加载数据”错误,然后对我来说可以通过将参数包装在“value()”函数中来修复它:

   = myfunction(value(B10))

它将单元格 B10 中的数字(这似乎是一个正常数字,但不知何故产生了问题)转换为一个正常工作的正常数字。

于 2019-07-12T22:04:36.693 回答
2

我也遇到了你解释的问题。似乎它可以通过不止一种方式引起。

我最终发现我的自定义函数正在显示该错误,因为它依赖于来自=IMPORTRANGE()调用的数据,并且该调用失败了。

我最终发现=IMPORTRANGE()调用失败了,因为我在上传导入表单的新版本时忘记更新它导入的 URL。似乎尝试从已删除的文件中导入可能会导致无限的“正在加载...”错误。

于 2015-01-07T18:00:26.487 回答
1

对我来说,重命名自定义函数解决了这个问题。至少现在。

于 2016-06-17T20:24:03.633 回答
1

附加组件

我有两个附加组件,但没有加载任何功能。

我删除了它们,一切都很好!

于 2016-11-03T07:46:43.313 回答
0

我从另一个电子表格的 importrange 遇到了类似的问题。

实际上,在电子表格中,您应该获得类似“访问权限”之类的信息,您使用 importrange 访问的电子表格但它永远卡在了这里,并且清除缓存等所有提示都不起作用。

最终我复制了电子表格,在这个新的电子表格中,它要求获得许可,现在一切正常。

因此,复制电子表格可能会有所帮助。

于 2019-05-11T11:01:18.047 回答
0

我的应用程序脚本从我的 MSSQL 数据库中提取数据在 GoogleSheets 我的笔记本电脑浏览器上显示得很好,但随后没有显示在 Android GS 应用程序上。

根据这个线程,看起来有许多问题可能导致这种情况,但@DestinyArchitect 上面的回答是:权限似乎是最简单的解决方法。

在测试我的应用脚本时,此 GoogleSheet 文件的共享已关闭。一旦我将它移动到我团队的文件夹中,我们与几个团队成员打开了默认共享,MSSQL 数据就显示在我的 Android GS 应用程序的 GoogleSheet 上。

轻松解决,这次...

于 2019-05-25T16:04:24.737 回答
0

只是为了添加 Azmo 的答案......

实际上,我从代码中删除了所有尾随分号:

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

并且发现,在大范围内执行此操作时,您还可以最大限度地提高 API 的可接受调用次数。

为了解决这个问题,我添加了一个IF THEN检查我的自定义脚本调用。

所以而不是:

=checkedOff(H10,H11)

在执行之前使用类似这样的东西来检查填充的字段:

=if(H17<>"-",checkedOff(H10,H11),0)

于 2018-04-25T08:56:33.853 回答
0

Loading...在我的情况下,由于“可能”函数和公式分辨率之间存在竞争条件,单元格被一条消息卡住了。

这是我的自定义函数:

function ifBlank(value1, value2) {
  return !!value1 ? value1 : value2;
}

这就是所谓的公式: =IFBLANK(VLOOKUP($A2,Overrides!$A$2:$E,5,FALSE),VLOOKUP($A2,'_resourceReq'!$A$2:$C,3)) 这些VLOOKUP值可能非常复杂,也可能需要一些时间来解决。

解决方案:(在我的情况下)

包装VLOOKUP()TO_TEXT()VALUE()例如。

因此,将公式更改为=IFBLANK(TO_TEXT(VLOOKUP($A2,Overrides!$A$2:$E,5,FALSE)),TO_TEXT(VLOOKUP($A2,'_resourceReq'!$A$2:$C,3)))效果很好。

如果这不起作用,可以尝试将函数中的值解析为单元格,然后再将其用作自定义函数的参数。

于 2020-06-12T20:40:24.880 回答