我有一个电子表格目标,它使用 ImportRange 从另一个电子表格源获取一些数据,如
A6 = query(ImportRange("mykey", "Weekly!B:BI"), CONCATENATE("select * WHERE Col1='",B3,"'"), 0)
select 子句是子选择与 B3 中的值匹配的数据 - 如果此单元格值发生更改,则“立即”更新导入。
如果有人更改源电子表格中的某些内容,我希望能够强制更新,以便我们“立即”看到它反映在目标中。目前,这只发生在“某个未指定的时间之后”,最多一分钟左右,对于我的目的来说太慢了。
更新:
根据下面的答案和评论,我在 Source 中添加了一个函数 UpdateTarget,该函数从编辑触发器 * 调用:
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();
}
这似乎更有效,但如果我沿着这条路线走,我也可以有一个脚本将更新的值直接写入目标。
我真的希望目标成为其他用户可以复制的模板,并且可以从主源中提取特定的“实时”数据,我不愿意在源中实现需要在添加新目标时维护的脚本。
我认为我真正需要的是一种重新陈述公式的方法,使其依赖于可以编辑的单元格并触发重新计算 - 但对结果没有影响?
(*旁白:我发现 openByID 函数返回“不允许操作”异常,除非它通过显式触发器调用 - 禁止 onEdit 编辑其他电子表格 -请参阅https://developers.google.com/apps-script/understanding_triggers)。