Дождитесь завершения формулы перед выполнением скрипта - PullRequest
0 голосов
/ 10 июля 2019

У меня есть такой сценарий:

  • Лист "BQ" связан с BigQuery с использованием 1

  • AВторой лист «F» содержит формулу, которая считывает данные из «BQ»

  • AppsScript, который запускает перезагрузку данных BigQuery

Вот скриптпример:

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

У меня проблема, я не знаю, как выполнить часть " wait ".Сначала я думал, что достаточно только SpreadsheetApp.flush();, но в конце сценарий начинает читать, даже если запрос все еще выполняется или Spreadsheet все еще обновляет формулу, поэтому эта команда для меня бесполезна.

Atв тот момент, когда я использую фиксированный Utilities.sleep(20000);, основываясь на времени, которое я видел, что необходимо для обеих операций (запрос и обновление листа), но мне интересно, есть ли более высокоуровневый подход для выполнения «сна»пока Лист полностью не обновится

1 Ответ

2 голосов
/ 11 июля 2019

Я не эксперт Google Sheet. Там может быть прагматический способ просто знать, когда формула закончена. Но даже без этого вы можете ввести определенную «подпись», чтобы указать, что результат формулы изменяется? Наивно, это может быть 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)`;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...