在执行脚本之前等待公式完成

Posted

技术标签:

【中文标题】在执行脚本之前等待公式完成【英文标题】: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(操作的第一部分)听起来不错,您对基于公式的更新有什么建议吗?谢谢 【参考方案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)`;

【讨论】:

以上是关于在执行脚本之前等待公式完成的主要内容,如果未能解决你的问题,请参考以下文章

Python脚本在执行另一个脚本之前等待

在执行代码技术之前等待页面加载的用户脚本?

php脚本等待shell脚本执行完成

Perl 脚本不等待 .bat 文件完成并继续执行

批处理脚本 - 在执行程序之前等待 5 秒 [重复]

执行sql脚本,不等待完成