Запустить макрос таблицы 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 года. Сценарий приложений не может в настоящее время получить доступ или изменить Сайты, созданные с помощью этой версии, но сценарий по-прежнему может получать доступ к классическим Сайтам.
Рекомендации
Array.prototype.push.apply
Array#map
Range#setValues
- Сайты Google: старые и новые