Запустить макрос таблицы Google без ограничений по времени

Я пытаюсь запустить макрос электронной таблицы Google (macro.gs), который должен загружать огромное количество ссылок сайта Google, принадлежащих домену, но выполнение занимает много времени, поэтому сценарий заканчивается, а он еще не завершен. Я читал, что это так (ограниченное по времени исполнение), поэтому я не могу там ничего сделать.

function listSites() {
  var domain="domain";
  var PAGE_LENGTH=200;
  sheet = SpreadsheetApp.getActiveSheet();
  var sites = SitesApp.getAllSites(domain,0,PAGE_LENGTH);
  for(var i=0; sites.length != 0; i+=PAGE_LENGTH){
    for (var j=0; j<sites.length; j++) {
      sheet.appendRow([sites[j].getUrl()]);
    }
    sites = SitesApp.getAllSites(domain, i, PAGE_LENGTH);
  }
};

Однако я также прочитал, что могу попытаться запустить "Очередь задач" с помощью скрипта Google Apps, чтобы запустить ее без ограничений по времени, но я не уверен, смогу ли я запустить макрос электронной таблицы внутри задачи, чтобы обойти это ограничение по времени.

Пока все, что я прочитал, не дает никакой информации о том, как это сделать.

1 ответ

Добавление строки действительно уместно только в том случае, если ваш лист нестабилен, например, вы не можете быть уверены, что новые данные были добавлены в промежуток времени между вычислением последней строки и временем добавления новых данных.

Альтернатива состоит в том, чтобы создать ваш вывод и затем сериализовать его за одну запись, используя setValues с прямоугольным 2d Array:

function writeAllSiteUrls() {
  const domain = "domain",
      PAGE_LENGTH = 200,
      output = [];

  var i = 0;
  do {
    var search = SitesApp.getAllSites(domain, i * PAGE_LENGTH, PAGE_LENGTH);
    var urls = search.map(function (site) {
      return site.getUrl();
    });
    Array.prototype.push.apply(output, urls);
    ++i;
  } while (search.length);

  if (!output.length)
    return;

  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(sheet.getLastRow() +1, 1, output.length, output[0].length).setValues(output);
}

Конечно, вы могли бы создать более сложный возвращаемый объект, а не просто URL-адрес сайта, но на самом деле это был не ваш вопрос. Также обратите внимание, что любой код скрипта Apps, относящийся к Сайтам Google, имеет дело только со "старой" версией Сайтов Google - те, которые созданы с использованием новой версии, недоступны:

Восстановленная версия Сайтов была запущена 22 ноября 2016 года. Сценарий приложений не может в настоящее время получить доступ или изменить Сайты, созданные с помощью этой версии, но сценарий по-прежнему может получать доступ к классическим Сайтам.

Рекомендации

Другие вопросы по тегам