我有一个电子表格目标,它使用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();
}
这似乎更有效,但我可能还有一个脚本可以将更新的值直接写入目标,如果我正沿着这条路线行进的话。
我真的希望Target成为其他用户可以复制的模板,并且可以从主源中提取特定的“实时”数据,我不愿意在Source中实现需要在添加新目标时进行维护的脚本。
我认为我真正需要的是一种重新陈述公式的方法,使其依赖于可以编辑的单元格并触发重新计算 - 但是对结果没有影响?
(*旁白:我发现openByID函数返回“Action not allowed”异常,除非通过显式触发器调用 - onEdit禁止编辑其他电子表格 - 请https://developers.google.com/apps-script/understanding_triggers)。
答案 0 :(得分:3)
当用户打开电子表格或更改影响公式的单元格(在同一电子表格中)时,将重新计算公式。
由于您使用的是两种不同的电子表格,因此后一种情况不适用。
您从哪个电子表格调用flush()函数。我假设它在目标电子表格中。这没用。
一种解决方案是在源电子表格中编写一个脚本,每次编辑源代码时都会修改目标电子表格
答案 1 :(得分:1)
的必需:强> 的
导入的数据 - 将所有内容复制到的目标。
导入的数据配置 - 包含以下字段:
+---------------------------------------------+--------------------------------+ | A | B | +---------------------------------------------+--------------------------------+ | Import Data from Spreadsheet with the key: | key | | Import Data from Spreadsheet between range: | A:AA | | Imported Data select columns: | SELECT * | | Imported Data criteria: | WHERE Col15 contains 'Offered' | | Imported Data should by ordered by column: | ORDER BY Col1 | +---------------------------------------------+--------------------------------+
的脚本:强> 的
function onOpen() {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
}
catch(err)
{
Browser.msgBox(err);
}
var configsheet = ss.getSheetByName("Imported Data Config");
var configkey = configsheet.getRange("B1").getValue();
var configrange = configsheet.getRange("B2").getValue();
var configselect = configsheet.getRange("B3").getValue();
var configwhere = configsheet.getRange("B4").getValue();
var configorderby = configsheet.getRange("B5").getValue();
var importedsheet = ss.getSheetByName("Imported Data");
importedsheet.getRange("A1").setValue('=QUERY(IMPORTRANGE("' + configkey + '","' + configrange + '"),"' + configselect + ' ' + configwhere + ' ' + configorderby + '")');
SpreadsheetApp.flush();
// Solution of sourcecode is: http://stackoverflow.com/questions/13631584/how-can-i-force-a-recalculation-of-cell-using-importrange-function-in-a-google-s
// OnOpen Trigger: https://developers.google.com/apps-script/understanding_triggers
// Active Spreadsheet solution: https://productforums.google.com/forum/#!topic/docs/XIY0WNX0uL8
Browser.msgBox("Sync Complete!");
}
这使您可以在不编辑脚本的情况下更改公式,并且可以更轻松地在各种工作表中传输脚本。
答案 2 :(得分:0)
我也遇到过这个问题。我只需要导入一个位于恒定位置的单元格。
我为自己解决这个问题的方法是在目标表上使用以下触发onEdit的函数。
function Refresh() {
var ss = SpreadsheetApp.openById('*yourtargetsheetID*');
var sheet = ss.getSheetByName('*yourtargetsheetname*');
sheet.getRange('*locationofyourimportrangeformula*').setFormula('*yourimportrangeformula*');
}