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

Posted

技术标签:

【中文标题】新的 Google 表格自定义功能有时会无限期显示“正在加载...”【英文标题】:New Google Sheets custom functions sometimes display "Loading..." indefinitely 【发布时间】:2014-01-10 05:15:56 【问题描述】:

仅适用于:"NEW" google sheets。

这是一个已知问题as highlighted by google in the new sheets.

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

Google 建议:

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

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


*我们将此问题作为canonical answer 处理 Google 表格的无限期“错误...正在加载数据”问题。它不仅限于复杂或缓慢的功能。

【问题讨论】:

“这是一个已知问题,谷歌在新表格中突出显示。”链接显示它应该直接指向 developers.google.com/apps-script/migration/… --pls 更新。但是,如果“这个问题”是 1“突出显示”,则此处缺少的描述说 URL 的最后 4 个单词“参数必须是确定性的”或等效的(-为什么在此处丢失?)作为无限有效的原因(作为无限循环或big op) 用于“加载”被挂起或非常慢,因此排除这一点,因此警报是误导性的或错误的错误消息,是关键。这里的意图是什么? 正如引用的几乎所有信息一样,请引用来源:对于“谷歌建议”;来源似乎是web.archive.org/web/20140311062149/https://… ...但还要注意引用的文本现在已被删除-为什么? - 因为谷歌现在认为这已经解决了? -我当然不希望,因为我经常遇到某些自定义功能,这些功能很短而且很快大部分但通常并非总是无限挂起'正在加载...错误:正在加载数据...' -我目前最大的表格问题: 为什么我现在在这里阅读。 很高兴看到这篇文章,只是将我的函数重命名为修复了加载问题。我已经通过缓存和依赖注入优化了脚本中的 tar,只是挠头才意识到这不是我。现在工作起来像闪电一样快。 这个错误看起来像是一个缓存设计缺陷,它已经存在多年,没有任何真正的解决方案。这似乎没有任何未解决的问题。我找到了一种重现问题的简单方法:只需“发布”使用自定义函数的工作表,几个小时后不打开真实工作表,发布的缓存版本将包含“#NAME?”或“正在加载...”,直到您重新打开工作表的可编辑版本...如果您使用“大”范围作为函数调用的输入,此错误似乎也会更频繁地发生。 【参考方案1】:

我还遇到了以下函数的无限加载问题。

// 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;

这会按预期运行。

【讨论】:

+1 非常感谢!因为到目前为止这对我有用:1of1 time;工作表“item or model or category MNHZOG”大部分单元格的公式为“=name_full_NGUTR5(..)”,显示“正在加载...”,错误为“错误:加载数据”;在其 NGT1M3.gs(刚刚添加)中进行了此修复,其中仅涉及我添加的代码:只需将 ';function F_C_NSBPAS(f)..' 替换为删除第一个 ';';即使该工作表没有调用此函数(而是同一电子表格中的另一张工作表),那么所有单元格结果都显示正常。 - 一个小的“救生员” -谢谢! 谢谢。我发现这也扩展到函数中的尾随分号。例如 function custom() if (true) return "true"; ; 有时也会导致无限加载。【参考方案2】:

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() 不应在没有超时或错误消息的情况下挂起。但至少有一个解决方法。这是 the bug I opened 反对它,我还把完整的 code.gs 从我的工作表中放了出来。

【讨论】:

【参考方案3】:

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

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

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

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

    试试 //方法 抓住(前) 返回“异常:”+ex;

    Revert to the old sheets 并测试您的函数并检查任何其他类型的错误,例如无限循环或无效数据格式。如果该功能在旧sheet中不起作用,那么它在新sheet中也不起作用,并且更难以调试。

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

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

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

【讨论】:

不要将新工作表与应用程序脚本一起用于生产代码。他们还没有完全准备好使用天然气。即使您遵循此建议,它也可能以其他方式中断。只是试验它,但不要把它交给用户。 关于切换到旧工作表的建议不再适用。【参考方案4】:

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

就这个问题,更好地表述自定义函数的单元格结果显示令人作呕的模糊消息“正在加载...错误:正在加载数据...”,确实在所有实例的情况下显示此错误的相同/相似自定义函数调用的原因是,Google 表格需要权限才能运行脚本(通常另外:意味着过去它不需要这些),所以而不是 acting proper: then prompting the user for这些权限否则会返回该错误,表格反而会因这个令人作呕的模糊错误而挂起。

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

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

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

【讨论】:

【参考方案5】:

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

记录了一个可能的解决方法

Google Sheets / Apps "Loading data" error: is there a better workaround?

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

   = myfunction(B10)

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

   = myfunction(value(B10))

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

【讨论】:

最好在您的答案中直接提供解决问题所需步骤的简短描述。 SO不太喜欢只留下一个包含所有信息的链接,因为链接可能会消失,我们会处于这种情况:Wisdom of the Ancients【参考方案6】:

TL;DR - 尝试复制工作表标签并删除旧标签

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

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

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

单元格会卡在“正在加载...”,而只是稍微更改一个参数(例如将数字转换为字符串),单元格的评估结果会很好。

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

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

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

【讨论】:

【参考方案7】:

我也遇到了你解释的问题。似乎不止一种方式造成的。

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

我非常讨厌这个,但它也为我解决了问题,所以 +1。【参考方案9】:

附加组件

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

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

【讨论】:

【参考方案10】:

只是添加到 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)

【讨论】:

【参考方案11】:

我在使用另一个电子表格的 importrange 时遇到了类似的问题。

实际上在电子表格中你应该得到类似的东西 “访问权限”您使用 importrange 处理的电子表格 但它永远卡在了这里,清除缓存等所有提示都没有奏效。

最终我复制了电子表格,并在这个新电子表格中请求了许可,现在一切正常。

所以复制电子表格可能会有所帮助。

【讨论】:

importrange 不是自定义函数【参考方案12】:

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

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

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

这次很容易解决...

【讨论】:

【参考方案13】:

在我的情况下,由于“可能”函数和公式解析之间存在竞争条件,单元格被 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))) 效果很好。

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

【讨论】:

以上是关于新的 Google 表格自定义功能有时会无限期显示“正在加载...”的主要内容,如果未能解决你的问题,请参考以下文章

WordPress 创建自定义功能

Ktor 自定义功能交换网址

在“成员”Wordpress 插件中添加自定义功能

后台文章编辑器的可视区域添加自定义功能按钮

Excel 自定义功能不适用于工作表

脚本编辑器中的功能可以正常工作,但不能来自工作表自定义功能