【问题标题】:How can I force a recalculation of cell using ImportRange function in a Google Spreadsheet?如何使用 Google 电子表格中的 ImportRange 函数强制重新计算单元格?
【发布时间】:2012-11-29 17:42:55
【问题描述】:

我有一个电子表格目标,它使用 ImportRange 从另一个电子表格源中获取一些数据,如

A6 = query(ImportRange("mykey", "Weekly!B:BI"), CONCATENATE("select * WHERE Col1='",B3,"'"), 0)

select 子句是子选择与 B3 中的值匹配的数据 - 如果此单元格值发生更改,则“立即”更新导入。

如果有人更改源电子表格中的某些内容,我希望能够强制更新,以便我们“立即”看到它反映在目标中。目前,这只发生在“经过一些未指定的时间后”,最多一分钟左右,对于我的目的来说太慢了。

更新:

根据下面的答案和 cmets,我在 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 函数返回“不允许操作”异常,除非它通过显式触发器调用 - 禁止 onEdit 编辑其他电子表格 - 请参阅 https://developers.google.com/apps-script/understanding_triggers)。

【问题讨论】:

    标签: google-apps-script google-sheets google-sheets-formula importrange


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的解释,我计划让其他用户添加访问同一源的其他目标,因此如果我必须使用每个新目标编辑脚本,这可能不是一个理想的解决方案 - 但是我给了去吧。请参阅上面的更新 - 它只是部分工作......
    • 您应该从目标电子表格中的 A6 中完全删除公式,并从源电子表格中的脚本中修改 A6
    • 再次感谢 - 是的,这会起作用,但实际上这与让 Source 直接使用新值更新 Target 并没有太大区别。我想要的——但一开始没有明确说明——恰恰相反,可以触发目标从源更新......
    【解决方案2】:

    通过恢复单元格公式强制重新计算 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!");
    }
    

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

    【讨论】:

      【解决方案3】:

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

      我自己解决这个问题的方法是在目标工作表上使用以下触发 onEdit 的函数。

      function Refresh() {
        var ss = SpreadsheetApp.openById('*yourtargetsheetID*');
        var sheet = ss.getSheetByName('*yourtargetsheetname*');
        sheet.getRange('*locationofyourimportrangeformula*').setFormula('*yourimportrangeformula*');
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 2015-12-14
        • 2013-07-12
        相关资源
        最近更新 更多