Этот скрипт не заполняет лист после анализа полученных данных.

Надеюсь, это хорошо объяснено. Прежде всего, извините, потому что у меня нулевой опыт программирования, и я просто пытаюсь "исправить" ранее написанный сценарий.

Проблема Сценарий не заполняет лист после анализа извлеченных данных, если функция запускается таймером и лист не открыт в моем браузере.

Скрипт работает нормально, если запустить его вручную при открытом листе.

Детали проблемы: когда я открываю лист, ячейки застревают, показывая "Загрузка", и через короткое время данные записываются.

Ожидаемое поведение - записать данные независимо от того, не открываю ли я лист.

Дополнительная информация: вот как я вручную запускаю функцию

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));

НОТА

Пользовательские функции вычисляются при открытии электронной таблицы и при изменении ее аргументов во время открытия электронной таблицы.

связанные с

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