5

我有一个电子表格目标,它使用 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)。

4

3 回答 3

3

当用户打开电子表格或更改影响公式的单元格(在同一电子表格中)时,将重新计算公式。

由于您使用的是两个不同的电子表格,因此后一种情况不适用。

您从哪个电子表格调用 flush() 函数。我假设它在目标电子表格中。这将毫无用处。

一种解决方案是在源电子表格中编写一个脚本,该脚本将在每次编辑源时修改目标电子表格

于 2012-11-29T18:25:28.150 回答
1

通过恢复单元格公式强制重新计算 importrange

必需的:

导入的数据 - 将所有内容复制到的目标。

导入的数据配置 - 具有以下字段:

+----------------------------------------------------------+--- ---------------------------------------------+
| 一个 | 乙|
+----------------------------------------------------------+--- ---------------------------------------------+
| 使用以下键从电子表格导入数据:| 关键 |
| 从范围之间的电子表格导入数据:| 答:AA |
| 导入的数据选择列:| 选择 * |
| 导入数据标准:| 其中 Col15 包含“提供”|
| 导入的数据应按列排序:| 由 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!");
}

这使您可以在不编辑脚本的情况下更改公式,并且可以更轻松地跨不同工作表传输脚本。

于 2014-01-30T19:31:04.053 回答
0

我也有这个问题。我只需要导入一个固定位置的单元格。

我为自己解决这个问题所做的是使用在目标表上触发 onEdit 的以下函数。

function Refresh() {
  var ss = SpreadsheetApp.openById('*yourtargetsheetID*');
  var sheet = ss.getSheetByName('*yourtargetsheetname*');
  sheet.getRange('*locationofyourimportrangeformula*').setFormula('*yourimportrangeformula*');
}
于 2016-09-09T04:09:43.553 回答