google-apps-script - .getValue() 有时在读取 ImportXML 单元格时返回 #N/A

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

我编写了一个脚本,将 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 内部缓存)时,它得到的值是正确的。

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

最佳答案

您的脚本无法接收电子表格已完成重新计算的通知。重新计算的耗时是不确定的。显然,您的 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());

But like I said, every time it executes I see the right value in the cell, then after I rewrite it, it gets #N/A. So in other word, if I don't rewrite the value, I see the result in less then one second in the cell. – Mille Jan 14 '13 at 19:32

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

有一个 open issue 1131这与此类似,在评论中有一些解决方法。

关于google-apps-script - .getValue() 有时在读取 ImportXML 单元格时返回 #N/A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14317226/

相关文章:

javascript - 丢失的 ; Google 脚本中的 before 语句

google-sheets - 谷歌表格过滤器中的附加自定义列

javascript - 谷歌邮件合并单个电子邮件

regex - 通过 Google Sheets 正则表达式提取根域

web-scraping - 通过 Google Docs 阻止网站抓取

google-apps-script - 如何使用谷歌应用程序脚本仅将句子的一部分加粗?

json - 如何在 Microsoft Excel 中解析 JSON 或 CSV 字符串中的单个值?还是谷歌表格?

google-apps-script - Google Apps 脚本从电子表格脚本更新融合表

XPath 简单的条件语句?如果节点 X 存在,那么 Y 存在吗?

xpath - 带有变量的 url 的 Google 电子表格公式