【问题标题】:.getValue() return #N/A when reading ImportXML cell sometimes.getValue() 有时在读取 ImportXML 单元格时返回 #N/A
【发布时间】:2013-01-14 11:01:49
【问题描述】:

我编写了一个脚本,将 ImportXML 公式写入一个单元格,然后在几秒钟后尝试读取该单元格并将其替换为返回值。

问题是我经常(但不总是)在用获取的值替换单元格时得到#N/A。问题是我能够在短时间内看到正确的值,因此 ImportXML 会获取并正确返回该值,但在重写到电子表格时它会变得混乱。

示例代码:

myformula = '=ImportXML("http://api.something/01.xml","/offers/price")';
sheet.getRange("A1").setFormula(myformula);
Utilities.sleep(5000);
sheet.getRange("A1").setValue(sheet.getRange("A1").getValue());

我注意到,当最近获取该 URL(并由 Google 在内部缓存)时,它会获取正确的值。

关于如何解决这个问题的建议?

【问题讨论】:

    标签: google-apps-script google-sheets google-sheets-importxml


    【解决方案1】:

    您的脚本无法接收电子表格已完成重新计算的通知。重新计算所用的时间是不确定的。显然,您的 5 秒延迟通常就足够了,但有时重新计算需要更长的时间。

    sleep() 替换为重试循环以延长时间窗口。

    myformula = '=ImportXML("http://api.something/01.xml","/offers/price")';
    sheet.getRange("A1").setFormula(myformula);
    while (sheet.getRange("A1").getValue() === "#N/A") {
      Utilities.sleep(5000);
    }
    sheet.getRange("A1").setValue(sheet.getRange("A1").getValue());
    

    但就像我说的,每次执行时我都会在单元格中看到正确的值,然后在我重写它之后,它会得到 #N/A。所以换句话说,如果我不重写值,我会在不到一秒的时间内在单元格中看到结果。 – Mille 2013 年 1 月 14 日 19:32

    这是云计算现实的一部分。电子表格对象正在更新,并与正在处理原始缓存副本的所有查看者共享。缓存副本与原始副本同步,但这不是即时的。当您查看工作表时,您是一个用户。您的脚本正在另一台谷歌服务器上“在云端”执行,虽然它最终会看到与您相同版本的电子表格,但可能需要一段时间。让两个用户进行更改(you+script)需要多次同步操作,因此有时受影响的单元格会处于不确定状态。

    有一个与此类似的open issue 1131,在 cmets 中有一些解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 2018-08-24
      • 2021-12-21
      相关资源
      最近更新 更多