我编写了一个脚本,将一个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());
我注意到,当网址最近被提取(并由Google内部缓存)时,它会获得正确的值。
关于如何解决这个问题的建议?
答案 0 :(得分:3)
您的脚本无法接收电子表格已完成重新计算的通知。重新计算的经过时间是不确定的。显然,你的5秒延迟通常就足够了,但有时候recalc需要更长时间。
用重试循环替换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
这是云计算现实的一部分。电子表格对象正在更新,并与正在处理原始文件的缓存副本的所有查看者共享。缓存副本与原始副本同步,但这不是即时的。当您查看工作表时,您就是一个用户。您的脚本正在另一台谷歌服务器上“在云端”执行,虽然它最终会看到与您相同版本的电子表格,但可能需要一段时间。让两个用户进行更改(你+脚本)需要多次同步操作,因此受影响的单元有时会处于不稳定状态。
有一个open issue 1131与此类似,在评论中有一些解决方法。