Этот скрипт не заполняет лист после анализа полученных данных.
Надеюсь, это хорошо объяснено. Прежде всего, извините, потому что у меня нулевой опыт программирования, и я просто пытаюсь "исправить" ранее написанный сценарий.
Проблема Сценарий не заполняет лист после анализа извлеченных данных, если функция запускается таймером и лист не открыт в моем браузере.
Скрипт работает нормально, если запустить его вручную при открытом листе.
Детали проблемы: когда я открываю лист, ячейки застревают, показывая "Загрузка", и через короткое время данные записываются.
Ожидаемое поведение - записать данные независимо от того, не открываю ли я лист.
Дополнительная информация: вот как я вручную запускаю функцию
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [
{name: "Manual Push Report", functionName: "runTool"}
];
sheet.addMenu("PageSpeed Menu", entries);
}
Дополнительная информация: Я установил триггеры с помощью графического интерфейса Google Apps Script См. Триггер
Перед публикацией кода скрипта вы можете увидеть, как ячейки выглядят на листе:
Код сценария
function runTool() {
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Results");
var rows = activeSheet.getLastRow();
for(var i=3; i <= rows; i++){
var workingCell = activeSheet.getRange(i, 2).getValue();
var stuff = "=runCheck"
if(workingCell != ""){
activeSheet.getRange(i, 3).setFormulaR1C1(stuff + "(R[0]C[-1])");
}
}
}
// URL check //
function runCheck(Url) {
var key = "XXXX Google PageSpeed API Key";
var strategy = "desktop"
var serviceUrl = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=" + Url + "&key=" + key + "&strategy=" + strategy +"";
var array = [];
var response = UrlFetchApp.fetch(serviceUrl);
if (response.getResponseCode() == 200) {
var content = JSON.parse(response.getContentText());
if ((content != null) && (content["lighthouseResult"] != null)) {
if (content["captchaResult"]) {
var score = content["lighthouseResult"]["categories"]["performance"]["score"];
} else {
var score = "An error occured";
}
}
array.push([score,"complete"]);
Utilities.sleep(1000);
return array;
}
}
Вы можете попробовать код, используя приведенный ниже лист с действующим ключом API Pagespeed.
Вам нужно только добавить триггер и дождаться его выполнения, пока лист не открыт в вашем браузере.
https://docs.google.com/spreadsheets/d/1ED2u3bKpS0vaJdlCwsLOrZTp5U0_T8nZkmFHVluNvKY/copy
1 ответ
Предлагаю вам изменить свой алгоритм. Вместо использования пользовательской функции для вызоваUrlFetchApp
, сделайте этот вызов в функции, вызываемой триггером, управляемым по времени.
Вы могли бы сохранить свой runCheck
как есть, просто замените
activeSheet.getRange(i, 3).setFormulaR1C1(stuff + "(R[0]C[-1])");
по
activeSheet.getRange(i, 3, 1, 2).setValues(runCheck(url));
НОТА
Пользовательские функции вычисляются при открытии электронной таблицы и при изменении ее аргументов во время открытия электронной таблицы.
связанные с