Как создать функцию сна (милисекунды) в листе Google, чтобы задержать или приостановить формулу в диапазоне - PullRequest
1 голос
/ 17 октября 2019

В листе Google у меня есть:

Range B1:B260

У меня есть функция:

(ImportXML(A1;"//a/@href")
(ImportXML(A2;"//a/@href")
(ImportXML(A3;"//a/@href")
.
.
.
(ImportXML(A260;"//a/@href")

Мне нужно задержать время между расчетами, потому что еслиЯ выполняю это одновременно, я получу #REF!, потому что ограничения в API и =ImportXML()

Будет хорошо, если я задержу 10 секунд для расчета ячейки

Я попытался создать =LEN()Функция для выполнения вычислений в ячейке, только если количество символов больше, чем X ... Но это задерживает лишь крошечную часть времени.

Используя sleep(milliseconds) в сценарии Google, я мог бы получитьформула sleep(B1:B260,5000)? Отложить процесс ImportXML, Importdata, Import .... Process?

1 Ответ

1 голос
/ 17 октября 2019

Вы можете использовать функцию Utilities.sleep(milliseconds) для сна между двумя отдельными удаленными вызовами API. См. Пример ниже:

function runScraper() {
  var resultRange = SpreadsheetApp.getActive().getRange("B1:B260");
  var urlRange = SpreadsheetApp.getActive().getRange("A1:A260");
  for (var i=1; i<=urlRange.getHeight(); i++) {
    var currentValue = resultRange.getCell(i, 1).getValue();
    if (currentValue !== "") continue;

    var url = urlRange.getCell(i, 1).getValue();
    var result = scrape(url);
    resultRange.getCell(i, 1).setValue(result);
    Utilities.sleep(10000);
  }
}

Что касается реализации функции scrape(url), реализация зависит от того, какой API вы используете и какой формат передачи данных используется (JSON, XML ...). Для этого я рекомендую вам проверить следующие ссылки:

Отказ от ответственности

Сценарии Google Apps имеют максимальное время выполнения 6 минут. Если вы подождете 10 секунд для каждого вызова и выполните всего 260 вызовов, максимальное время выполнения будет превышено. Для этого в приведенном выше коде я реализовал проверку, которая проверит, что строка, над которой работает, еще не очищена. Если он уже был очищен, он сразу перейдет к следующему. Это позволит вам легко перезапустить скрипт и продолжить с того места, где он последний раз остановился (из-за тайм-аута).

...