我有一个电子表格目标,它使用ImportRange从另一个电子表格源中获取一些数据,如
A6 = query(ImportRange("mykey", "Weekly!B:BI"), CONCATENATE("select * WHERE Col1='",B3,"'"), 0)
select子句用于子选择与B3中某个值匹配的数据-如果此单元格值发生更改,则导入将“立即”更新。
如果有人更改了源电子表格中的某些内容,我希望能够强制进行更新,以便我们看到它“立即”反射(reflect)在目标中。目前,这种情况仅发生在“未指定的时间之后”,该时间最多为一分钟左右,对于我的目的来说太慢了。
更新:
根据下面的答案和评论,我在Source中添加了一个功能UpdateTarget,该功能是通过on edit触发器*调用的:
function UpdateTarget() {
try {
var ss = SpreadsheetApp.openById("targetID");
}
catch(err)
{
Browser.msgBox(err);
}
var sheet = ss.getSheetByName("Weekly");
sheet.getRange("A4").setValue("=query(ImportRange("sourceID", "Weekly!B:BI"), CONCATENATE("select * WHERE Col1='",B3,"'"), 0) ");
SpreadsheetApp.flush();
}
这似乎更有效,但是如果我沿这条路线走,我还可以有一个脚本将更新后的值直接写到目标中。
我确实希望Target是其他用户可以复制的模板,并且可以从主Source中提取特定的“实时”数据,但我不愿意在Source中实现在添加新Target时需要维护的脚本。
我认为我真正需要的是一种重新计算公式的方式,使其取决于可以编辑的单元格并将触发重新计算-但是对结果没有影响?
(*旁白:我发现openByID函数返回“不允许 Action ”异常,除非通过显式触发器调用该异常-禁止onEdit编辑其他电子表格-参见https://developers.google.com/apps-script/understanding_triggers)。
最佳答案
当用户打开电子表格或更改影响该公式的单元格(在同一电子表格中)时,将重新计算公式。
由于您使用的是两个不同的电子表格,因此后一种情况不适用。
您从哪个电子表格中调用flush()函数。我认为它在目标电子表格中。这将毫无用处。
一种解决方案是在源电子表格中编写一个脚本,该脚本将在每次编辑源时修改目标电子表格