等待公式完成,然后再执行脚本

时间:2019-07-10 07:00:52

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

我有这种情况:

  • 工作表“ BQ”使用1

  • 与BigQuery连接
  • 第二张表“ F”包含一个公式,该公式可从“ BQ”中读取数据

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

这是脚本示例:

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

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

    如前所述,
  • 触发BigQuery数据重新加载
  • “等待”查询完成
  • “等待”公式以处理新数据并更新第二张工作表
  • 在第二张工作表中解析数据并执行其操作...

这是查询运行的时间:

enter image description here

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

enter image description here

我有问题,我不知道该怎么做“ 等待”部分。起初我以为SpreadsheetApp.flush();就足够了,但是最后即使查询仍在运行或Spreadsheet仍在更新公式,脚本也开始读取,因此该命令对我来说毫无用处。

此刻,我正在根据操作(查询和工作表更新)所需的时间使用固定的Utilities.sleep(20000);,但我想知道是否有更高级的方法进行“睡眠”,直到工作表完全更新

1 个答案:

答案 0 :(得分:2)

我不是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)`;
}