{"id":4038,"date":"2021-06-21T07:00:00","date_gmt":"2021-06-21T06:00:00","guid":{"rendered":"https:\/\/www.diogonunes.com\/blog\/?p=4038"},"modified":"2021-03-13T15:57:02","modified_gmt":"2021-03-13T15:57:02","slug":"monitor-psi-pagespeed-google-sheets","status":"publish","type":"post","link":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/","title":{"rendered":"Monitor PageSpeed (v5) with Google Sheets"},"content":{"rendered":"<p><a href=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?resize=580%2C280&#038;ssl=1\" alt=\"\" width=\"580\" height=\"280\" class=\"aligncenter size-large wp-image-4040\" srcset=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?resize=1024%2C495&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?resize=400%2C193&amp;ssl=1 400w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?resize=768%2C371&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?resize=1200%2C580&amp;ssl=1 1200w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?w=1250&amp;ssl=1 1250w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>The goal is to create a Google Sheet that can track the historical PageSpeed Insights (PSI) perfomance data of one or more pages\/URLs. You will use JavaScript code to call the PageSpeed Insights API and store the result in your sheet.<\/p>\n<p><!--more--><\/p>\n<h3>Run the test + Store the data<\/h3>\n<p>For each target URL, the script will run the PSI test for both desktop and mobile and record the overall test score (configurable). Since the PSI scores tend to slightly vary between executions, the script runs the test three times (configurable) and store the average.<\/p>\n<ol>\n<li>Generate a <strong>PageSpeed Insights<\/strong> (PSI) key:\n<ol>\n<li>Open the <a href=\"https:\/\/developers.google.com\/speed\/docs\/insights\/v5\/get-started\">PSI docs<\/a> and click the <strong>Get a Key<\/strong> button<\/li>\n<li>Follow the wizard and copy the generated key<\/li>\n<\/ol>\n<\/li>\n<li>Create a new <a href=\"https:\/\/sheets.google.com\/\">Google Sheet<\/a><\/li>\n<li>Navigate to <strong>Tools > Script Editor<\/strong><\/li>\n<li>From the <strong>Google Apps Script<\/strong> editor, give your script a name (e.g. <code>PSI Monitoring<\/code>)<\/li>\n<li>Navigate to <strong>File > Project properties<\/strong>, create a new <strong>Script property<\/strong> named <code>PSI_API_KEY<\/code> and paste in your API key<\/li>\n<li>In <code>Code.gs<\/code>, paste the script below\n<ol>\n<li>Don&#8217;t forget to find the <code>\/\/ TODO<\/code> comments and configure them as you desire<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<pre><code class=\"javascript\">\/\/ Adapted from Rick Viscomi (@rick_viscomi)\n\/\/ Originally adapted from https:\/\/ithoughthecamewithyou.com\/post\/automate-google-pagespeed-insights-with-apps-script by Robert Ellison\n\nvar scriptProperties = PropertiesService.getScriptProperties();\nvar pageSpeedApiKey = scriptProperties.getProperty(\"PSI_API_KEY\");\nvar pageSpeedMonitorTitles = [\n    \/\/ TODO: CHANGE THESE\n  \"Website name\",\n  \"More descriptive than long urls\",\n];\nvar pageSpeedMonitorUrls = [\n  \/\/ TODO: CHANGE THESE\n  \"https:\/\/yourdomain.com\",\n  \"https:\/\/another.website\",\n];\n\nfunction monitor() {\n  for (var i = 0; i &lt; pageSpeedMonitorUrls.length; i++) {\n    var url = pageSpeedMonitorUrls[i];\n    var title = pageSpeedMonitorTitles[i];\n    \/\/ Scores tend to fluctuate, specially on STG, so we average them\n    var desktopScore = getAverageScore(url, \"desktop\", 3);\n    var mobileScore = getAverageScore(url, \"mobile\", 3);\n    addRow(\"Sheet1\", title, desktopScore, mobileScore);\n  }\n}\n\nfunction callPageSpeed(url, strategy) {\n  var pageSpeedUrl =\n    \"https:\/\/pagespeedonline.googleapis.com\/pagespeedonline\/v5\/runPagespeed?url=\" + url + \"&key=\" + pageSpeedApiKey + \"&strategy=\" + strategy;\n  var response = UrlFetchApp.fetch(pageSpeedUrl);\n  var json = response.getContentText();\n  return JSON.parse(json);\n}\n\nfunction addRow(sheetName, desc, desktopScore, mobileScore) {\n  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();\n  var sheet = spreadsheet.getSheetByName(sheetName);\n  sheet.appendRow([\n    Utilities.formatDate(new Date(), \"GMT\", \"yyyy-MM-dd\"),\n    desc,\n    desktopScore,\n    mobileScore\n  ]);\n}\n\nfunction extractOverallScore(data) {\n  return data.lighthouseResult.categories.performance.score * 100;\n}\n\nfunction getAverageScore(url, strategy, attempts) {\n  var scores = [];\n  for (var i = 0; i &lt; attempts; i++) {\n    var auditData = callPageSpeed(url, strategy);\n    scores.push(extractOverallScore(auditData));\n  }\n  var totalScore = 0;\n  for (const score of scores) {\n    totalScore += score;\n  }\n  return totalScore \/ scores.length; \/\/ average\n}\n<\/code><\/pre>\n<p>The script will store the results in a sheet named &#8220;Sheet1&#8221; (configurable). If you rename it, make sure you update the script as well.<\/p>\n<p>You can test the script by opening the <strong>Select function<\/strong> menu, selecting <strong>monitor<\/strong>, and clicking the <strong>Run<\/strong> button. For your first run, you&#8217;ll need to authorize the script to run the API. If all goes well, you can open up your sheet to see the results.<\/p>\n<h3>Run it on a schedule<\/h3>\n<p>Right now, you can run the PSI test with the click of a button. But ideally the test would run every day automatically. Luckily, we can configure triggers to run our script:<\/p>\n<ol>\n<li>Return to the <strong>Google Apps Script<\/strong> editor<\/li>\n<li>Navigate to <strong>Edit > Current project&#8217;s triggers<\/strong><\/li>\n<li>Configure your trigger \u2013 if you want to run it daily, use the following config:\n<ul>\n<li>Run the <code>monitor<\/code> function<\/li>\n<li>&#8220;Time-driven&#8221;, &#8220;Day timer&#8221;, Select any hour<\/li>\n<\/ul>\n<\/li>\n<li>Save your trigger<\/li>\n<\/ol>\n<p><a href=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/PSI-Schedule.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/PSI-Schedule.png?resize=580%2C623&#038;ssl=1\" alt=\"\" width=\"580\" height=\"623\" class=\"aligncenter size-large wp-image-4042\" srcset=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/PSI-Schedule.png?resize=953%2C1024&amp;ssl=1 953w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/PSI-Schedule.png?resize=372%2C400&amp;ssl=1 372w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/PSI-Schedule.png?resize=768%2C825&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/PSI-Schedule.png?resize=1200%2C1290&amp;ssl=1 1200w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/PSI-Schedule.png?w=1256&amp;ssl=1 1256w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>That&#8217;s it. Now your Google Sheet will be updated on a daily basis with your latest PSI scores for your target URLs.<\/p>\n<h3>tl;dr<\/h3>\n<p>If you want to copy a Google Sheet that already contains all this (plus a dashboard), you can duplicate <a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1VBHLI7v_07t8iDlagrYgiLaYrKGMTRJRwonZ5I4MPm8\/edit?usp=sharing\">this sheet from Rick Viscomi<\/a>. Go to &#8220;File > Make a copy&#8230;&#8221; to clone it. Everything is now set up for you except for the API key property and the daily trigger. Follow the steps above to set those up.<\/p>\n<p>Don&#8217;t forget to clear the historical data there and overwrite the sample URLs with your target URLs. Easy!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The goal is to create a Google Sheet that can track the historical PageSpeed Insights (PSI) perfomance data of one or more pages\/URLs. You will use JavaScript code to call the PageSpeed Insights API and store the result in your sheet.<\/p>\n","protected":false},"author":1,"featured_media":4040,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2],"tags":[81,55,31,33,48],"class_list":["post-4038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech","tag-javascript","tag-testing","tag-tutorial","tag-utilities","tag-web-dev"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Monitor PageSpeed (v5) with Google Sheets - The Geeky Gecko<\/title>\n<meta name=\"description\" content=\"The goal is to create a GSheet that can track the historical PageSpeed Insights (PSI) perfomance data of one or more pages\/URLs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Monitor PageSpeed (v5) with Google Sheets - The Geeky Gecko\" \/>\n<meta property=\"og:description\" content=\"The goal is to create a GSheet that can track the historical PageSpeed Insights (PSI) perfomance data of one or more pages\/URLs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/\" \/>\n<meta property=\"og:site_name\" content=\"The Geeky Gecko\" \/>\n<meta property=\"article:published_time\" content=\"2021-06-21T06:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1250\" \/>\n\t<meta property=\"og:image:height\" content=\"604\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Diogo Nunes\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dialexnunes\" \/>\n<meta name=\"twitter:site\" content=\"@dialexnunes\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Diogo Nunes\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/\"},\"author\":{\"name\":\"Diogo Nunes\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c\"},\"headline\":\"Monitor PageSpeed (v5) with Google Sheets\",\"datePublished\":\"2021-06-21T06:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/\"},\"wordCount\":432,\"publisher\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c\"},\"image\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1\",\"keywords\":[\"javascript\",\"testing\",\"tutorial\",\"utilities\",\"web dev\"],\"articleSection\":[\"Technology\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/\",\"url\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/\",\"name\":\"Monitor PageSpeed (v5) with Google Sheets - The Geeky Gecko\",\"isPartOf\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1\",\"datePublished\":\"2021-06-21T06:00:00+00:00\",\"description\":\"The goal is to create a GSheet that can track the historical PageSpeed Insights (PSI) perfomance data of one or more pages\/URLs.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1\",\"width\":1250,\"height\":604},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.diogonunes.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Monitor PageSpeed (v5) with Google Sheets\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#website\",\"url\":\"https:\/\/www.diogonunes.com\/blog\/\",\"name\":\"The Geeky Gecko\",\"description\":\"The Geeky Gecko\",\"publisher\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.diogonunes.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c\",\"name\":\"Diogo Nunes\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2026\/04\/Geeky-Gecko-2026-v2.png?fit=799%2C799&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2026\/04\/Geeky-Gecko-2026-v2.png?fit=799%2C799&ssl=1\",\"width\":799,\"height\":799,\"caption\":\"Diogo Nunes\"},\"logo\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/image\/\"},\"sameAs\":[\"http:\/\/www.diogonunes.com\",\"https:\/\/x.com\/dialexnunes\"],\"url\":\"https:\/\/www.diogonunes.com\/blog\/author\/diogo-nunes\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Monitor PageSpeed (v5) with Google Sheets - The Geeky Gecko","description":"The goal is to create a GSheet that can track the historical PageSpeed Insights (PSI) perfomance data of one or more pages\/URLs.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/","og_locale":"en_US","og_type":"article","og_title":"Monitor PageSpeed (v5) with Google Sheets - The Geeky Gecko","og_description":"The goal is to create a GSheet that can track the historical PageSpeed Insights (PSI) perfomance data of one or more pages\/URLs.","og_url":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/","og_site_name":"The Geeky Gecko","article_published_time":"2021-06-21T06:00:00+00:00","og_image":[{"width":1250,"height":604,"url":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1","type":"image\/png"}],"author":"Diogo Nunes","twitter_card":"summary_large_image","twitter_creator":"@dialexnunes","twitter_site":"@dialexnunes","twitter_misc":{"Written by":"Diogo Nunes","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#article","isPartOf":{"@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/"},"author":{"name":"Diogo Nunes","@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c"},"headline":"Monitor PageSpeed (v5) with Google Sheets","datePublished":"2021-06-21T06:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/"},"wordCount":432,"publisher":{"@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c"},"image":{"@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1","keywords":["javascript","testing","tutorial","utilities","web dev"],"articleSection":["Technology"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/","url":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/","name":"Monitor PageSpeed (v5) with Google Sheets - The Geeky Gecko","isPartOf":{"@id":"https:\/\/www.diogonunes.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#primaryimage"},"image":{"@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1","datePublished":"2021-06-21T06:00:00+00:00","description":"The goal is to create a GSheet that can track the historical PageSpeed Insights (PSI) perfomance data of one or more pages\/URLs.","breadcrumb":{"@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#primaryimage","url":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1","width":1250,"height":604},{"@type":"BreadcrumbList","@id":"https:\/\/www.diogonunes.com\/blog\/monitor-psi-pagespeed-google-sheets\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.diogonunes.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Monitor PageSpeed (v5) with Google Sheets"}]},{"@type":"WebSite","@id":"https:\/\/www.diogonunes.com\/blog\/#website","url":"https:\/\/www.diogonunes.com\/blog\/","name":"The Geeky Gecko","description":"The Geeky Gecko","publisher":{"@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.diogonunes.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c","name":"Diogo Nunes","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2026\/04\/Geeky-Gecko-2026-v2.png?fit=799%2C799&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2026\/04\/Geeky-Gecko-2026-v2.png?fit=799%2C799&ssl=1","width":799,"height":799,"caption":"Diogo Nunes"},"logo":{"@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/image\/"},"sameAs":["http:\/\/www.diogonunes.com","https:\/\/x.com\/dialexnunes"],"url":"https:\/\/www.diogonunes.com\/blog\/author\/diogo-nunes\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/10\/Screenshot_2020-08-26_at_15.40.55.png?fit=1250%2C604&ssl=1","jetpack-related-posts":[{"id":3978,"url":"https:\/\/www.diogonunes.com\/blog\/framework-review-cypress\/","url_meta":{"origin":4038,"position":0},"title":"Framework review: Cypress","author":"Diogo Nunes","date":"4 January, 2021","format":false,"excerpt":"Fast and reliable testing for anything that runs in a browser. It uses Javascript to make setting up, writing, running and debugging tests easy \u2014 for QAs and developers. \u2014 Official website Code Example of automation at GitHub. Use cases \ud83e\udd47 Automate end-to-end (E2E) tests using the UI or the\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/09\/herbert-goetsch-vImJ5GYMMqQ-unsplash-1.jpg?fit=1200%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/09\/herbert-goetsch-vImJ5GYMMqQ-unsplash-1.jpg?fit=1200%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/09\/herbert-goetsch-vImJ5GYMMqQ-unsplash-1.jpg?fit=1200%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/09\/herbert-goetsch-vImJ5GYMMqQ-unsplash-1.jpg?fit=1200%2C800&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/09\/herbert-goetsch-vImJ5GYMMqQ-unsplash-1.jpg?fit=1200%2C800&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":4398,"url":"https:\/\/www.diogonunes.com\/blog\/testers-toolbox-2-heuristics\/","url_meta":{"origin":4038,"position":1},"title":"Heuristics (Toolbox #2)","author":"Diogo Nunes","date":"29 November, 2021","format":false,"excerpt":"tl;dr Heuristics are shortcuts to make decisions or pick what to test next. \ud83c\udfc6 This post was featured in Software Testing Weekly #100 This is part of my free testing course, focused on teaching you the fundamentals of testing \ud83d\ude09 Theory If mnemonics act as \"memory shortcuts\", then heuristics are\u2026","rel":"","context":"In &quot;Work&quot;","block_context":{"text":"Work","link":"https:\/\/www.diogonunes.com\/blog\/category\/work\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/10\/patrick-tomasso-1NTFSnV-KLs-unsplash.jpg?fit=1200%2C901&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/10\/patrick-tomasso-1NTFSnV-KLs-unsplash.jpg?fit=1200%2C901&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/10\/patrick-tomasso-1NTFSnV-KLs-unsplash.jpg?fit=1200%2C901&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/10\/patrick-tomasso-1NTFSnV-KLs-unsplash.jpg?fit=1200%2C901&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/10\/patrick-tomasso-1NTFSnV-KLs-unsplash.jpg?fit=1200%2C901&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":825,"url":"https:\/\/www.diogonunes.com\/blog\/bootstrap-switch-on-rails\/","url_meta":{"origin":4038,"position":2},"title":"Using Bootstrap Switch 3 on Rails","author":"Diogo Nunes","date":"9 June, 2014","format":false,"excerpt":"Replace Bootstrap's checkboxes and radio buttons by an elegant switch... a Bootstrap Switch. I'm a great fan of Twitter's Bootstrap. Recently I had to develop a settings page which involved displaying a lot of Yes\/No checkboxes. It looked outdated. I wanted something a bit more \"app-like\" - a Yes\/No switch.\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/bootstrap-switch-3-demo-examples.png?fit=564%2C430&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/bootstrap-switch-3-demo-examples.png?fit=564%2C430&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/bootstrap-switch-3-demo-examples.png?fit=564%2C430&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":4204,"url":"https:\/\/www.diogonunes.com\/blog\/framework-review-playwright\/","url_meta":{"origin":4038,"position":3},"title":"Framework review: Playwright","author":"Diogo Nunes","date":"29 March, 2021","format":false,"excerpt":"Playwright enables end-to-end testing. Test modern single page apps, across all modern browsers, using in your preferred language (JS, TS, Java, C#, Python). \u2014 Official website Code Example of automation at GitHub. Use cases \ud83e\udd48 Automate end-to-end (E2E) tests using the UI. It also supports mocks. Learning curve \ud83e\udd48 Most\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":4453,"url":"https:\/\/www.diogonunes.com\/blog\/playwright-cheat-sheet\/","url_meta":{"origin":4038,"position":4},"title":"Playwright cheat sheet","author":"Diogo Nunes","date":"7 February, 2022","format":false,"excerpt":"\u2b50\ufe0f This post was featured in Software Testing Weekly #110 and Coding JAG #76 My first experience with Playwright was terrible. However the testing community seems to be loving it, thus I gave it another shot. I started by doing a free course, but I don't recommend it, it's very\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/11\/patrick-tomasso-Oaqk7qqNh_c-unsplash.jpg?fit=1200%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/11\/patrick-tomasso-Oaqk7qqNh_c-unsplash.jpg?fit=1200%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/11\/patrick-tomasso-Oaqk7qqNh_c-unsplash.jpg?fit=1200%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/11\/patrick-tomasso-Oaqk7qqNh_c-unsplash.jpg?fit=1200%2C800&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/11\/patrick-tomasso-Oaqk7qqNh_c-unsplash.jpg?fit=1200%2C800&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3955,"url":"https:\/\/www.diogonunes.com\/blog\/framework-review-karate\/","url_meta":{"origin":4038,"position":5},"title":"Framework review: Karate","author":"Diogo Nunes","date":"2 November, 2020","format":false,"excerpt":"Karate is the only open-source tool to combine API test-automation, mocks, performance-testing and even UI automation into a single, unified framework. You don't have to compile (Java) code. Just write tests in a readable syntax. \u2014 Official website Code Example of automation at GitHub. Use cases \ud83e\udd47 Automate API tests.\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/08\/thao-le-hoang-igLzPKOvZNw-unsplash-scaled.jpg?fit=1200%2C798&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/08\/thao-le-hoang-igLzPKOvZNw-unsplash-scaled.jpg?fit=1200%2C798&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/08\/thao-le-hoang-igLzPKOvZNw-unsplash-scaled.jpg?fit=1200%2C798&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/08\/thao-le-hoang-igLzPKOvZNw-unsplash-scaled.jpg?fit=1200%2C798&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2020\/08\/thao-le-hoang-igLzPKOvZNw-unsplash-scaled.jpg?fit=1200%2C798&ssl=1&resize=1050%2C600 3x"},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/posts\/4038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/comments?post=4038"}],"version-history":[{"count":4,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/posts\/4038\/revisions"}],"predecessor-version":[{"id":4140,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/posts\/4038\/revisions\/4140"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/media\/4040"}],"wp:attachment":[{"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/media?parent=4038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/categories?post=4038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/tags?post=4038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}