Whats wrong with my PageSpeed Appscript code?

39 Views Asked by At

My script used to work, now it seizes to pull any data. I've been trying to resolve the code for some time now and keep getting different errors, so thought i'd post it here.

The script allows field data to be extracted from Google's PSI for a list of URLs. The script runs every ONE_HOUR - but I can't seem to get it pulling data. Here is my code (minus my API key and list of URLs):

here is a two images of the errors I am facing and what the script should be exporting

error message image

data export image

Any help would be truly grateful!

var pageSpeedApiKey = 'Enter API key';

const URL_COLUMN_INDEX = 1;
const DATE_COLUMN_INDEX = 0;

const ONE_HOUR = 60 * 60 * 1000;
const CHECK_FREQUENCY = ONE_HOUR * 24;

const HEADERS = ["Timestamp", "URL", "Device", "Performance Score", "FCP", "LCP", "CLS", "Interactive", "Total Blocking Time", "Speed Index", "First Input Delay (FID)"];

const urls = [
  'enter URL',

];

var spreadsheet = SpreadsheetApp.openById('sheetURL');
var sheet = spreadsheet.getSheetByName('results');

let lastRow = sheet.getLastRow();
let maxLookback = urls.length * 3;
let startingRow = lastRow - maxLookback + 1;
let lastUrlsAndDates = sheet.getRange(startingRow, 1, maxLookback, 2).getValues();

function createHeaders() {
  sheet.getRange(1, 1, 1, HEADERS[0].length).setValues(HEADERS);
}

function monitor() {
  console.info("Checking " + urls.length + " URLs...");
  for (var i = 0; i < urls.length; i++) {
    let url = urls[i];
    if (!isAlreadyChecked(url)) {
      checkPerformances(url);
      break;
    }
  }
  console.info("Nothing more to do...");
}

function checkPerformances(url) {
  populatePageSpeedInfo(url, 'desktop');
  populatePageSpeedInfo(url, 'mobile');
}

function populatePageSpeedInfo(urlToMonitor, strategy) {
  console.info("Getting page speed info for: " + urlToMonitor + " With Strategy: " + strategy);
  var rowNumber = reserveRowForUrl(urlToMonitor, strategy);
  var pageSpeedUrl = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=' + urlToMonitor + '&key=' + pageSpeedApiKey + '&strategy=' + strategy;
  var response = UrlFetchApp.fetch(pageSpeedUrl, { muteHttpExceptions: true });
  if (response.getResponseCode() == 200) {
    var json = JSON.parse(response.getContentText());
    instertDataToSheet(rowNumber, urlToMonitor, json, strategy);
  } else {
    sheet.deleteRow(rowNumber);
    console.error("Unable to check performances for: '" + urlToMonitor + "' Error: " + response.getResponseCode());
  }
}

function isAlreadyChecked(url) {
  let lastCheckDate = getLastCheckTime(url);
  let elapsedSinceLastCheck = new Date() - lastCheckDate;
  return elapsedSinceLastCheck < CHECK_FREQUENCY;
}

function getLastCheckTime(url) {
  for (var i = lastUrlsAndDates.length - 1; i > 0; i--) {
    let curUrl = lastUrlsAndDates[i][URL_COLUMN_INDEX];
    if (curUrl === url) {
      return new Date(lastUrlsAndDates[i][DATE_COLUMN_INDEX]);
    }
  }
  return new Date(0);
}

function reserveRowForUrl(urlToMonitor, strategy) {
  var lock = LockService.getDocumentLock();
  try {
    lock.tryLock(10000);
    var lastRow = sheet.getLastRow();
    var rowNumber = lastRow + 1;
    sheet.insertRowBefore(rowNumber);
    sheet.getRange(rowNumber, DATE_COLUMN_INDEX + 1).setValue(new Date());
    sheet.getRange(rowNumber, URL_COLUMN_INDEX + 1).setValue(urlToMonitor);
    sheet.getRange(rowNumber, URL_COLUMN_INDEX + 2).setValue(strategy);
    return rowNumber;
  } finally {
    lock.releaseLock();
  }
}

function instertDataToSheet(rowNumber, urlToMonitor, json, strategy) {
  var metrics = json.lighthouseResult.categories.performance.auditRefs;
  var metricData = metrics.reduce(function (data, metric) {
    if (metric.result && metric.result.numericValue) {
      data[metric.id] = metric.result.numericValue;
    }
    return data;
  }, {});

  var values = [
    new Date(),
    urlToMonitor,
    strategy,
    metricData['performance-score'] || '',
    metricData['first-contentful-paint'] || '',
    metricData['largest-contentful-paint'] || '',
    metricData['cumulative-layout-shift'] || '',
    metricData['interactive'] || '',
    metricData['total-blocking-time'] || '',
    metricData['speed-index'] || '',
    metricData['max-potential-fid'] || ''
  ];
  sheet.getRange(rowNumber, 4, 1, HEADERS[11].length).setValues([values]);
}

function onOpen(e) {
  var menu = SpreadsheetApp.getUi().createMenu('Page Speed Insights');
  menu.addItem('Create Headers', 'createHeaders');
  menu.addItem('Monitor', 'monitor');
  menu.addToUi();
}```
0

There are 0 best solutions below