【问题标题】:Wait for formula to be completed before executing script在执行脚本之前等待公式完成
【发布时间】:2019-07-10 07:00:52
【问题描述】:

我有这种情况:

  • 使用 1 将工作表“BQ”与 BigQuery 连接

  • 第二张表“F”包含一个从“BQ”读取数据的公式

  • 触发 BigQuery 数据重新加载的 AppsScript

这是脚本示例:

var spreadsheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
SpreadsheetApp.enableAllDataSourcesExecution();
spreadsheet.getRange("A1").getCell(1,1).getDataSourceTables()[0].refreshData();

此应用脚本执行以下操作:

  • 触发 BigQuery 数据重新加载,如前所述
  • “等待”查询完成
  • “等待”公式处理新数据并更新第二张工作表
  • 解析第二张表中的数据并做它必须做的事情......

这是查询运行的时间:

这是根据公式更新工作表的时间:

我有一个问题,我不知道如何做“等待”部分。起初我认为只有SpreadsheetApp.flush(); 就足够了,但最后脚本开始读取,即使查询仍在运行或电子表格仍在更新公式,所以这个命令对我的需要没有用。

目前我正在使用固定的Utilities.sleep(20000);,基于我看到的两个操作(查询和工作表更新)所需的时间,但我想知道是否有更高级的方法来执行在工作表完全更新之前“休眠”

【问题讨论】:

  • 尝试使用waitForCompletion()
  • 这对于DataSource(操作的第一部分)听起来不错,您对基于公式的更新有什么建议吗?谢谢

标签: google-apps-script google-sheets google-bigquery


【解决方案1】:

我不是 Google 表格专家。可能有一种实用的方法来知道公式何时完成。但是即使没有它,您是否可以注入某些“签名”来指示公式结果正在更改?天真地,它可能是concat( <original_formula_output>, "|||||", NOW())

所以等待循环可以是:

var cell_content_before = FetchingFormulaCellContent();
TriggerFormulaUpdate();
WHILE (cell_content_before == FetchingFormulaCellContent() 
       AND waiting_timeout_is_not_reached) {
  Utilities.sleep(1000)`;
}

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多