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

时间:2013-12-21 12:19:45

标签: google-apps-script google-sheets

仅适用于:"NEW" google sheets

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

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

谷歌建议:

  

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

然而,对于遇到此问题的其他开发人员(以及无法解决“loading ...”错误的人),我在下面的答案中写了我的发现,如何一致地克服这个问题(有限制)。 / p>


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

14 个答案:

答案 0 :(得分:6)

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

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

事实证明,你不应该跟踪&#34 ;;"。删除分号解决了这个问题。

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

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

答案 1 :(得分:4)

FWIW,我刚碰到这个,罪魁祸首最终成为一个getRange()调用,将数千行拉入数组。它会定期挂在" Loading ..."消息。

我通过将该范围放入文档缓存来解决这个问题。它有点kludgy,因为缓存只存储字符串,而不是数组,但是当您需要访问数组时,可以使用.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反对它,我也从我的工作表中提取了完整的代码。

答案 2 :(得分:3)

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

至于{这个问题,更好地表达了自定义函数的单元格结果,显示了令人作呕的模糊消息“正在加载......错误:正在加载数据...”},实际上在所有实例的情况下显示此错误的相同/类似的自定义函数调用,是Google表格需要运行脚本的权限(通常另外:意味着过去它不需要这些),因此而不是{正确行动:然后提示用户这些权限也会返回该错误},Sheets反而挂起了这个令人作呕的模糊错误。

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

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

    要修复,我明确地运行了我的GAS电子表格代码:单击我的一个自定义菜单功能,并在“脚本编辑器”中运行我的一个自定义JS函数,特别是'onOpen()',因为这是最多的全面。第一个提升了我的新权限,通过弹出“需要授权”应用程序“MM6ZBT(MM6Z83脚本)”需要授权才能运行。'虽然onOpen()也是在GAS修改其权限的情况下做的,因为我们用过那张纸。然后,因为我仍然得到这个“正在加载...”错误,我重新加载了网页(所以表格),并且,至少对于这个令人作呕的模糊错误的情况,它已经消失了,计算工作正常: - )

答案 3 :(得分:2)

我也有你解释过的问题。它似乎可以通过多种方式引起。

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

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

答案 4 :(得分:1)

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

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

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

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

    尝试{ //方法 }赶上(前){ 返回“例外:”+ ex; }

  3. Revert to the old sheets并测试您的函数并检查是否存在任何其他类型的错误,例如无限循环或无效数据格式。如果该功能在旧工作表中不起作用,则无法在新工作表中使用,并且调试起来会更加困难。

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

  5. 检查数字可能超出正常有效数字集的数字或浮点问题。新的表格似乎有点数字,所以如果您期望非常大或非常复杂的数字,您的功能可能无法正常工作。

  6. 最后,如果上述方法都无效,请切换到旧的Google工作表并继续工作。 如果您发现任何其他限制或导致功能无法执行的原因,请在下面为我和其他g-sheet用户的用户写下这些内容!

答案 5 :(得分:1)

附加组件

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

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

答案 6 :(得分:0)

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

答案 7 :(得分: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)

答案 8 :(得分:0)

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

实际上,在电子表格中,您应该得到类似 使用importrange处理的电子表格的“访问权限” 但是它永远卡在其中,并且清除缓存等所有提示均无效。

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

因此,这可能有助于复制电子表格。

答案 9 :(得分:0)

  

我遇到另一个导入范围类似的问题   电子表格。

     

实际上,在电子表格中,您应该会看到类似“权限   访问”您使用importrange处理的电子表格,但是   永远停留在此,清除缓存等所有提示都没有   工作。

     

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

     

因此可能有助于复制电子表格

这是我的问题。
由于某种原因,工作表未链接工作表,因为它没有权限。
复制到一张新纸上可以得到许可,并且可以正常工作。

答案 10 :(得分:0)

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

在此线程中,似乎有许多问题可能导致此问题,但是@DestinyArchitect的回答是:权限似乎是最简单的解决方法。

在测试我的应用脚本时,此GoogleSheet文件的“共享”功能已关闭。 将其移动到团队的文件夹后,我们默认打开了共享共享,其中有几个团队成员,MSSQL数据立即显示在我的Android GS应用程序的GoogleSheet中。

这次轻松解决...

答案 11 :(得分:0)

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

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

如果有

的单元格,则进行总结(应评论者史蒂夫的要求)
   = myfunction(B10)

生成了“正在加载数据”错误,对我而言,可以通过将参数包装在“ value()”函数中来解决:

   = myfunction(value(B10))

将单元格B10中的数字(看起来像是正常数字,但以某种方式产生了问题)转换为正常工作的正常数字。

答案 12 :(得分:0)

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

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

非常清楚,如果我在单元格X25中调用了这样的函数:

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

该单元格将停留在“正在加载...”状态,而只是稍微更改一个参数(例如,将数字转换为字符串),该单元格就可以正常运行。

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

仅将代码复制到另一个单元格(例如X24)并在那里执行它似乎可以绕过该问题。一旦将其移回原始参数或单元格,它再次卡在“正在加载...”中。 因此,我认为这是对“单元格ID”,函数和参数的某种缓存,它们在Google方面很重要。

我的适当解决方案是简单地复制“工作表”标签,删除旧的标签,最后将新的标签重命名为原始名称。这为我解决了问题。

答案 13 :(得分: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)))效果很好。

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