Skip to content

Instantly share code, notes, and snippets.

@abfo
Last active November 19, 2025 20:47
Show Gist options
  • Select an option

  • Save abfo/954d12d73651c2203e91442d2b50a94f to your computer and use it in GitHub Desktop.

Select an option

Save abfo/954d12d73651c2203e91442d2b50a94f to your computer and use it in GitHub Desktop.
var apiKey = '';
var monitorUrl = '';
var originUrl = '';
function monitor() {
// CRUX
var allCrux = callCrux(null, originUrl);
var desktopCrux = callCrux('DESKTOP', originUrl);
var mobileCrux = callCrux('MOBILE', originUrl);
// Pagespeed Insights
var desktop = callPageSpeed('desktop', monitorUrl);
var mobile = callPageSpeed('mobile', monitorUrl);
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('results');
sheet.appendRow([
Utilities.formatDate(new Date(), 'GMT', 'yyyy-MM-dd'),
desktop.lighthouseResult.categories.performance.score * 100,
desktopCrux.lcp == -1 ? (allCrux.lcp == -1 ? ' ' :allCrux.lcp) : desktopCrux.lcp,
desktopCrux.inp == -1 ? (allCrux.inp == -1 ? ' ' :allCrux.inp) : desktopCrux.inp,
desktopCrux.cls == -1 ? (allCrux.cls == -1 ? ' ' :allCrux.cls) : desktopCrux.cls,
mobile.lighthouseResult.categories.performance.score * 100,
mobileCrux.lcp == -1 ? (allCrux.lcp == -1 ? ' ' :allCrux.lcp) : mobileCrux.lcp,
mobileCrux.inp == -1 ? (allCrux.inp == -1 ? ' ' :allCrux.inp) : mobileCrux.inp,
mobileCrux.cls == -1 ? (allCrux.cls == -1 ? ' ' :allCrux.cls) : mobileCrux.cls
]);
// much more available, i.e. desktop.pageStats.numberResources
}
function callCrux(strategy, origin) {
var lcp = -1;
var inp = -1;
var cls = -1;
var cruxUrl = 'https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=' + apiKey;
var payload = {
"origin": origin,
"metrics": [
"largest_contentful_paint",
"cumulative_layout_shift",
"interaction_to_next_paint"
]
};
if (strategy) {
payload["formFactor"] = strategy;
}
var options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
};
try {
var response = UrlFetchApp.fetch(cruxUrl, options);
var json = JSON.parse(response.getContentText());
if ('largest_contentful_paint' in json.record.metrics) {
lcp = parseFloat(json.record.metrics.largest_contentful_paint.percentiles.p75) / 1000.0;
}
if ('cumulative_layout_shift' in json.record.metrics) {
cls = parseFloat(json.record.metrics.cumulative_layout_shift.percentiles.p75);
}
if ('interaction_to_next_paint' in json.record.metrics) {
inp = parseFloat(json.record.metrics.interaction_to_next_paint.percentiles.p75) / 1000.0;
}
} catch {
}
return { "cls":cls, "inp":inp, "lcp":lcp };
}
function callPageSpeed(strategy, url) {
var pageSpeedUrl = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=' + url + '&key=' + apiKey + '&strategy=' + strategy;
var response = UrlFetchApp.fetch(pageSpeedUrl);
var json = response.getContentText();
return JSON.parse(json);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment