PageSourceSearch

https://ramblings.mcpher.com/category/google-api/docs/

html mcpher.com collected 2026-10-01 11:40:28 UTC 82,842 bytes, 672 lines download raw bytes

1<!DOCTYPE html>
2<html class="no-js mh-one-sb" lang="en-GB">
3<head>
4<meta charset="UTF-8">
5<meta name="viewport" content="width=device-width, initial-scale=1.0">
6<link rel="profile" href="http://gmpg.org/xfn/11" />
7<meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' />
8
9	<!-- This site is optimized with the Yoast SEO plugin v28.5 - https://yoast.com/product/yoast-seo-wordpress/ -->
10	<title>Docs Archives - Desktop liberation</title>
11	<meta name="description" content="Desktop Liberation and its related blog and G+ community aims to help you use cloud based APIS and services without being constrained by your desktop software. There’s a particular emphasis on Google APIs and JavaScript, but there’s also plenty of Microsoft and other stuff here too. All code here is unprotected and free to re-use" />
12	<link rel="canonical" href="https://ramblings.mcpher.com/category/google-api/docs/" />
13	<meta name="twitter:card" content="summary_large_image" />
14	<meta name="twitter:title" content="Docs Archives - Desktop liberation" />
15	<meta name="twitter:description" content="Desktop Liberation and its related blog and G+ community aims to help you use cloud based APIS and services without being constrained by your desktop software. There’s a particular emphasis on Google APIs and JavaScript, but there’s also plenty of Microsoft and other stuff here too. All code here is unprotected and free to re-use" />
16	<meta name="twitter:site" content="@brucemcpherson" />
17	
17<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"CollectionPage","@id":"https:\/\/ramblings.mcpher.com\/category\/google-api\/docs\/","url":"https:\/\/ramblings.mcpher.com\/category\/google-api\/docs\/","name":"Docs Archives - Desktop liberation","isPartOf":{"@id":"https:\/\/ramblings.mcpher.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ramblings.mcpher.com\/category\/google-api\/docs\/#primaryimage"},"image":{"@id":"https:\/\/ramblings.mcpher.com\/category\/google-api\/docs\/#primaryimage"},"thumbnailUrl":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_xsjrj2xsjrj2xsjr.jpeg","description":"Desktop Liberation and its related blog and G+ community aims to help you use cloud based APIS and services without being constrained by your desktop software. There’s a particular emphasis on Google APIs and JavaScript, but there’s also plenty of Microsoft and other stuff here too. All code here is unprotected and free to re-use","breadcrumb":{"@id":"https:\/\/ramblings.mcpher.com\/category\/google-api\/docs\/#breadcrumb"},"inLanguage":"en-GB"},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/ramblings.mcpher.com\/category\/google-api\/docs\/#primaryimage","url":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_xsjrj2xsjrj2xsjr.jpeg","contentUrl":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_xsjrj2xsjrj2xsjr.jpeg","width":2048,"height":2048},{"@type":"BreadcrumbList","@id":"https:\/\/ramblings.mcpher.com\/category\/google-api\/docs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ramblings.mcpher.com\/"},{"@type":"ListItem","position":2,"name":"Google API","item":"https:\/\/ramblings.mcpher.com\/category\/google-api\/"},{"@type":"ListItem","position":3,"name":"Docs"}]},{"@type":"WebSite","@id":"https:\/\/ramblings.mcpher.com\/#website","url":"https:\/\/ramblings.mcpher.com\/","name":"Desktop liberation","description":"The definitive resource for Google Workspace and Cloud automation","publisher":{"@id":"https:\/\/ramblings.mcpher.com\/#\/schema\/person\/069b96a8a34c876dcd4894f05f56055d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ramblings.mcpher.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/ramblings.mcpher.com\/#\/schema\/person\/069b96a8a34c876dcd4894f05f56055d","name":"brucemcp","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2020\/11\/cropped-gas-1.png","url":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2020\/11\/cropped-gas-1.png","contentUrl":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2020\/11\/cropped-gas-1.png","width":512,"height":512,"caption":"brucemcp"},"logo":{"@id":"https:\/\/ramblings.mcpher.com\/wp-content\/uploads\/2020\/11\/cropped-gas-1.png"},"description":"I am a Google Developer Expert and decided to investigate Google Apps Script in my spare time. The more I investigated the more content I created so this site is extremely rich. Now, in 2019, a lot of things have disappeared or don’t work anymore due to Google having retired some stuff. I am however leaving things as is and where I came across some deprecated stuff, I have indicated it. I decided to write a book about it and to also create videos to teach developers who want to learn Google Apps Script. If you find the material contained in this site useful, you can support me by buying my books and or videos.","sameAs":["https:\/\/x.com\/https:\/\/ramblings.mcpher.com\/https\/\/twitter.com\/brucemcpherson"]}]}</script>
17
18	<!-- / Yoast SEO plugin. -->
19
20
21<link rel='dns-prefetch' href='//www.googletagmanager.com' />
22<link rel='dns-prefetch' href='//fonts.googleapis.com' />
23<link rel='dns-prefetch' href='//pagead2.googlesyndication.com' />
24<link rel='dns-prefetch' href='//fundingchoicesmessages.google.com' />
25<link rel="alternate" type="application/rss+xml" title="Desktop liberation &raquo; Feed" href="https://ramblings.mcpher.com/feed/" />
26<link rel="alternate" type="application/rss+xml" title="Desktop liberation &raquo; Comments Feed" href="https://ramblings.mcpher.com/comments/feed/" />
27<link rel="alternate" type="application/rss+xml" title="Desktop liberation &raquo; Docs Category Feed" href="https://ramblings.mcpher.com/category/google-api/docs/feed/" />
28<style id="wp-img-auto-sizes-contain-inline-css">
29img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
30/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
31</style>
32
33
34<link rel='stylesheet' id='wpo_min-header-0-css' href='https://ramblings.mcpher.com/wp-content/cache/wpo-minify/1788206514/assets/wpo-minify-header-c47655a1.min.css' media='all' />
35<script id="wpo_min-header-0-js" src="https://ramblings.mcpher.com/wp-content/cache/wpo-minify/1788206514/assets/wpo-minify-header-617f1deb.min.js"></script>
35
36
37<!-- Google tag (gtag.js) snippet added by Site Kit -->
38<!-- Google Analytics snippet added by Site Kit -->
vendor: 80 bytes, lines 38-39
38
39<script id="google_gtagjs-js" src="https://www.googletagmanager.com/gtag/js?id=
39GT-PZMQBJ3
vendor: 18 bytes, line 39
39" async></script>
40<script id="google_gtagjs-js-after">
41window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}
42gtag("set","linker",{"domains":["ramblings.mcpher.com"]});
43gtag("js", new Date());
44gtag("set", "developer_id.dZTNiMT", true);
45gtag("config", "GT-PZMQBJ3");
46//# sourceURL=google_gtagjs-js-after
47</script>
47
48<link rel="https://api.w.org/" href="https://ramblings.mcpher.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://ramblings.mcpher.com/wp-json/wp/v2/categories/345" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://ramblings.mcpher.com/xmlrpc.php?rsd" />
49<meta name="generator" content="WordPress 7.1.2" />
50<meta name="generator" content="Site Kit by Google 1.188.0" />
50<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-0073976545556837"
51     crossorigin="anonymous"></script>
51
52
53
54<script async src="https://fundingchoicesmessages.google.com/i/pub-0073976545556837?ers=1" nonce="LLy8N0DUptDCBEvhFuwJ1g"></script>
54<script nonce="LLy8N0DUptDCBEvhFuwJ1g">(function() {function signalGooglefcPresent() {if (!window.frames['googlefcPresent']) {if (document.body) {const iframe = document.createElement('iframe'); iframe.style = 'width: 0; height: 0; border: none; z-index: -1000; left: -1000px; top: -1000px;'; iframe.style.display = 'none'; iframe.name = 'googlefcPresent'; document.body.appendChild(iframe);} else {setTimeout(signalGooglefcPresent, 0);}}}signalGooglefcPresent();})();</script>
54
55
56
57
58<style type="text/css">
59.mh-navigation li:hover, .mh-navigation ul li:hover > ul, .mh-main-nav-wrap, .mh-main-nav, .mh-social-nav li a:hover, .entry-tags li, .mh-slider-caption, .mh-widget-layout8 .mh-widget-title .mh-footer-widget-title-inner, .mh-widget-col-1 .mh-slider-caption, .mh-widget-col-1 .mh-posts-lineup-caption, .mh-carousel-layout1, .mh-spotlight-widget, .mh-social-widget li a, .mh-author-bio-widget, .mh-footer-widget .mh-tab-comment-excerpt, .mh-nip-item:hover .mh-nip-overlay, .mh-widget .tagcloud a, .mh-footer-widget .tagcloud a, .mh-footer, .mh-copyright-wrap, input[type=submit]:hover, #infinite-handle span:hover { background: #f55951; }
60.mh-extra-nav-bg { background: rgba(245, 89, 81, 0.2); }
61.mh-slider-caption, .mh-posts-stacked-title, .mh-posts-lineup-caption { background: #f55951; background: rgba(245, 89, 81, 0.8); }
62@media screen and (max-width: 900px) { #mh-mobile .mh-slider-caption, #mh-mobile .mh-posts-lineup-caption { background: rgba(245, 89, 81, 1); } }
63.slicknav_menu, .slicknav_nav ul, #mh-mobile .mh-footer-widget .mh-posts-stacked-overlay { border-color: #f55951; }
64.mh-copyright, .mh-copyright a { color: #fff; }
65.mh-widget-layout4 .mh-widget-title { background: #edd2cb; background: rgba(237, 210, 203, 0.6); }
66.mh-preheader, .mh-wide-layout .mh-subheader, .mh-ticker-title, .mh-main-nav li:hover, .mh-footer-nav, .slicknav_menu, .slicknav_btn, .slicknav_nav .slicknav_item:hover, .slicknav_nav a:hover, .mh-back-to-top, .mh-subheading, .entry-tags .fa, .entry-tags li:hover, .mh-widget-layout2 .mh-widget-title, .mh-widget-layout4 .mh-widget-title-inner, .mh-widget-layout4 .mh-footer-widget-title, .mh-widget-layout5 .mh-widget-title-inner, .mh-widget-layout6 .mh-widget-title, #mh-mobile .flex-control-paging li a.flex-active, .mh-image-caption, .mh-carousel-layout1 .mh-carousel-caption, .mh-tab-button.active, .mh-tab-button.active:hover, .mh-footer-widget .mh-tab-button.active, .mh-social-widget li:hover a, .mh-footer-widget .mh-social-widget li a, .mh-footer-widget .mh-author-bio-widget, .tagcloud a:hover, .mh-widget .tagcloud a:hover, .mh-footer-widget .tagcloud a:hover, .mh-posts-stacked-item .mh-meta, .page-numbers:hover, .mh-loop-pagination .current, .mh-comments-pagination .current, .pagelink, a:hover .pagelink, input[type=submit], #infinite-handle span { background: #edd2cb; }
67.mh-main-nav-wrap .slicknav_nav ul, blockquote, .mh-widget-layout1 .mh-widget-title, .mh-widget-layout3 .mh-widget-title, .mh-widget-layout5 .mh-widget-title, .mh-widget-layout8 .mh-widget-title:after, #mh-mobile .mh-slider-caption, .mh-carousel-layout1, .mh-spotlight-widget, .mh-author-bio-widget, .mh-author-bio-title, .mh-author-bio-image-frame, .mh-video-widget, .mh-tab-buttons, textarea:hover, input[type=text]:hover, input[type=email]:hover, input[type=tel]:hover, input[type=url]:hover { border-color: #edd2cb; }
68.mh-header-tagline, .mh-dropcap, .mh-carousel-layout1 .flex-direction-nav a, .mh-carousel-layout2 .mh-carousel-caption, .mh-posts-digest-small-category, .mh-posts-lineup-more, .bypostauthor .fn:after, .mh-comment-list .comment-reply-link:before, #respond #cancel-comment-reply-link:before { color: #edd2cb; }
69body, a, blockquote, blockquote cite, .post .entry-title, .page-title, .entry-content h1, .entry-content h2, .entry-content h3, .entry-content h4, .entry-content h5, .entry-content h6, .wp-caption-text, .wp-block-image figcaption, .wp-block-audio figcaption, #respond .comment-reply-title, #respond #cancel-comment-reply-link, #respond .logged-in-as a, .mh-ping-list .mh-ping-item a, .mh-widget-layout1 .mh-widget-title, .mh-widget-layout7 .mh-widget-title, .mh-widget-layout8 .mh-widget-title, .mh-slider-layout4 .mh-slider-caption, .mh-slider-layout4 .mh-slider-caption a, .mh-slider-layout4 .mh-slider-caption a:hover { color: #2a2a2a; }
70.mh-header-nav-bottom li a, .mh-social-nav-bottom .fa-mh-social, .mh-boxed-layout .mh-ticker-item-bottom a, .mh-header-date-bottom, .page-numbers, a .pagelink, .mh-widget-layout3 .mh-widget-title, .mh-widget-layout3 .mh-widget-title a, .mh-tabbed-widget, .mh-tabbed-widget a, .mh-posts-horizontal-title a { color: #543c52; }
71.entry-content a { color: #1e73be; }
72</style>
73<!--[if lt IE 9]>
74<script src="https://ramblings.mcpher.com/wp-content/themes/mh-magazine/js/css3-mediaqueries.js"></script>
74
75<![endif]-->
76<style type="text/css">
77.entry-content { font-size: 15px; font-size: 0.9375rem; }
78h1, h2, h3, h4, h5, h6, .mh-custom-posts-small-title { font-family: "Roboto"; }
79body { font-family: "Roboto"; }
80</style>
81
82<!-- Google AdSense meta tags added by Site Kit -->
83<meta name="google-adsense-platform-account" content="ca-host-pub-2644536267352236">
84<meta name="google-adsense-platform-domain" content="sitekit.withgoogle.com">
85<!-- End Google AdSense meta tags added by Site Kit -->
86
87<!-- Google AdSense snippet added by Site Kit -->
88<script async crossorigin="anonymous" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-0073976545556837&#038;host=ca-host-pub-2644536267352236"></script>
88
89
90<!-- End Google AdSense snippet added by Site Kit -->
91
92<!-- Google AdSense Ad Blocking Recovery snippet added by Site Kit -->
93<script async src="https://fundingchoicesmessages.google.com/i/pub-0073976545556837?ers=1" nonce="4EDLURXSpru1kSuw6JW75A"></script>
93<script nonce="4EDLURXSpru1kSuw6JW75A">(function() {function signalGooglefcPresent() {if (!window.frames['googlefcPresent']) {if (document.body) {const iframe = document.createElement('iframe'); iframe.style = 'width: 0; height: 0; border: none; z-index: -1000; left: -1000px; top: -1000px;'; iframe.style.display = 'none'; iframe.name = 'googlefcPresent'; document.body.appendChild(iframe);} else {setTimeout(signalGooglefcPresent, 0);}}}signalGooglefcPresent();})();</script>
93
94<!-- End Google AdSense Ad Blocking Recovery snippet added by Site Kit -->
95
96<!-- Google AdSense Ad Blocking Recovery Error Protection snippet added by Site Kit -->
97<script>(function(){'use strict';function aa(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}}var ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};
98function ca(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var da=ca(this);function k(a,b){if(b)a:{var c=da;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&ba(c,a,{configurable:!0,writable:!0,value:b})}}
99function ea(a){return a.raw=a}function m(a){var b="undefined"!=typeof Symbol&&Symbol.iterator&&a[Symbol.iterator];if(b)return b.call(a);if("number"==typeof a.length)return{next:aa(a)};throw Error(String(a)+" is not an iterable or ArrayLike");}function fa(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}var ha="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},n;
100if("function"==typeof Object.setPrototypeOf)n=Object.setPrototypeOf;else{var q;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;q=ja.a;break a}catch(a){}q=!1}n=q?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=n;
101function r(a,b){a.prototype=ha(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.A=b.prototype}function la(){for(var a=Number(this),b=[],c=a;c<arguments.length;c++)b[c-a]=arguments[c];return b}k("Number.MAX_SAFE_INTEGER",function(){return 9007199254740991});
102k("Number.isFinite",function(a){return a?a:function(b){return"number"!==typeof b?!1:!isNaN(b)&&Infinity!==b&&-Infinity!==b}});k("Number.isInteger",function(a){return a?a:function(b){return Number.isFinite(b)?b===Math.floor(b):!1}});k("Number.isSafeInteger",function(a){return a?a:function(b){return Number.isInteger(b)&&Math.abs(b)<=Number.MAX_SAFE_INTEGER}});
103k("Math.trunc",function(a){return a?a:function(b){b=Number(b);if(isNaN(b)||Infinity===b||-Infinity===b||0===b)return b;var c=Math.floor(Math.abs(b));return 0>b?-c:c}});k("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});k("Array.prototype.includes",function(a){return a?a:function(b,c){var d=this;d instanceof String&&(d=String(d));var e=d.length;c=c||0;for(0>c&&(c=Math.max(c+e,0));c<e;c++){var f=d[c];if(f===b||Object.is(f,b))return!0}return!1}});
104k("String.prototype.includes",function(a){return a?a:function(b,c){if(null==this)throw new TypeError("The 'this' value for String.prototype.includes must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype.includes must not be a regular expression");return-1!==this.indexOf(b,c||0)}});/*
105
106 Copyright The Closure Library Authors.
107 SPDX-License-Identifier: Apache-2.0
108*/
109var t=this||self;function v(a){return a};var w,x;a:{for(var ma=["CLOSURE_FLAGS"],y=t,z=0;z<ma.length;z++)if(y=y[ma[z]],null==y){x=null;break a}x=y}var na=x&&x[610401301];w=null!=na?na:!1;var A,oa=t.navigator;A=oa?oa.userAgentData||null:null;function B(a){return w?A?A.brands.some(function(b){return(b=b.brand)&&-1!=b.indexOf(a)}):!1:!1}function C(a){var b;a:{if(b=t.navigator)if(b=b.userAgent)break a;b=""}return-1!=b.indexOf(a)};function D(){return w?!!A&&0<A.brands.length:!1}function E(){return D()?B("Chromium"):(C("Chrome")||C("CriOS"))&&!(D()?0:C("Edge"))||C("Silk")};var pa=D()?!1:C("Trident")||C("MSIE");!C("Android")||E();E();C("Safari")&&(E()||(D()?0:C("Coast"))||(D()?0:C("Opera"))||(D()?0:C("Edge"))||(D()?B("Microsoft Edge"):C("Edg/"))||D()&&B("Opera"));var qa={},F=null;var ra="undefined"!==typeof Uint8Array,sa=!pa&&"function"===typeof btoa;function G(){return"function"===typeof BigInt};var H=0,I=0;function ta(a){var b=0>a;a=Math.abs(a);var c=a>>>0;a=Math.floor((a-c)/4294967296);b&&(c=m(ua(c,a)),b=c.next().value,a=c.next().value,c=b);H=c>>>0;I=a>>>0}function va(a,b){b>>>=0;a>>>=0;if(2097151>=b)var c=""+(4294967296*b+a);else G()?c=""+(BigInt(b)<<BigInt(32)|BigInt(a)):(c=(a>>>24|b<<8)&16777215,b=b>>16&65535,a=(a&16777215)+6777216*c+6710656*b,c+=8147497*b,b*=2,1E7<=a&&(c+=Math.floor(a/1E7),a%=1E7),1E7<=c&&(b+=Math.floor(c/1E7),c%=1E7),c=b+wa(c)+wa(a)
109);return c}
110function wa(a){a=String(a);return"0000000".slice(a.length)+a}function ua(a,b){b=~b;a?a=~a+1:b+=1;return[a,b]};var J;J="function"===typeof Symbol&&"symbol"===typeof Symbol()?Symbol():void 0;var xa=J?function(a,b){a[J]|=b}:function(a,b){void 0!==a.g?a.g|=b:Object.defineProperties(a,{g:{value:b,configurable:!0,writable:!0,enumerable:!1}})},K=J?function(a){return a[J]|0}:function(a){return a.g|0},L=J?function(a){return a[J]}:function(a){return a.g},M=J?function(a,b){a[J]=b;return a}:function(a,b){void 0!==a.g?a.g=b:Object.defineProperties(a,{g:{value:b,configurable:!0,writable:!0,enumerable:!1}});return a};function ya(a,b){M(b,(a|0)&-14591)}function za(a,b){M(b,(a|34)&-14557)}
111function Aa(a){a=a>>14&1023;return 0===a?536870912:a};var N={},Ba={};function Ca(a){return!(!a||"object"!==typeof a||a.g!==Ba)}function Da(a){return null!==a&&"object"===typeof a&&!Array.isArray(a)&&a.constructor===Object}function P(a,b,c){if(!Array.isArray(a)||a.length)return!1;var d=K(a);if(d&1)return!0;if(!(b&&(Array.isArray(b)?b.includes(c):b.has(c))))return!1;M(a,d|1);return!0}Object.freeze(new function(){});Object.freeze(new function(){});var Ea=/^-?([1-9][0-9]*|0)(\.[0-9]+)?$/;var Q;function Fa(a,b){Q=b;a=new a(b);Q=void 0;return a}
112function R(a,b,c){null==a&&(a=Q);Q=void 0;if(null==a){var d=96;c?(a=[c],d|=512):a=[];b&&(d=d&-16760833|(b&1023)<<14)}else{if(!Array.isArray(a))throw Error();d=K(a);if(d&64)return a;d|=64;if(c&&(d|=512,c!==a[0]))throw Error();a:{c=a;var e=c.length;if(e){var f=e-1;if(Da(c[f])){d|=256;b=f-(+!!(d&512)-1);if(1024<=b)throw Error();d=d&-16760833|(b&1023)<<14;break a}}if(b){b=Math.max(b,e-(+!!(d&512)-1));if(1024<b)throw Error();d=d&-16760833|(b&1023)<<14}}}M(a,d);return a};function Ga(a){switch(typeof a){case "number":return isFinite(a)?a:String(a);case "boolean":return a?1:0;case "object":if(a)if(Array.isArray(a)){if(P(a,void 0,0))return}else if(ra&&null!=a&&a instanceof Uint8Array){if(sa){for(var b="",c=0,d=a.length-10240;c<d;)b+=String.fromCharCode.apply(null,a.subarray(c,c+=10240));b+=String.fromCharCode.apply(null,c?a.subarray(c):a);a=btoa(b)}else{void 0===b&&(b=0);if(!F){F={};c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split("");d=["+/=",
113"+/","-_=","-_.","-_"];for(var e=0;5>e;e++){var f=c.concat(d[e].split(""));qa[e]=f;for(var g=0;g<f.length;g++){var h=f[g];void 0===F[h]&&(F[h]=g)}}}b=qa[b];c=Array(Math.floor(a.length/3));d=b[64]||"";for(e=f=0;f<a.length-2;f+=3){var l=a[f],p=a[f+1];h=a[f+2];g=b[l>>2];l=b[(l&3)<<4|p>>4];p=b[(p&15)<<2|h>>6];h=b[h&63];c[e++]=g+l+p+h}g=0;h=d;switch(a.length-f){case 2:g=a[f+1],h=b[(g&15)<<2]||d;case 1:a=a[f],c[e]=b[a>>2]+b[(a&3)<<4|g>>4]+h+d}a=c.join("")}return a}}return a};function Ha(a,b,c){a=Array.prototype.slice.call(a);var d=a.length,e=b&256?a[d-1]:void 0;d+=e?-1:0;for(b=b&512?1:0;b<d;b++)a[b]=c(a[b]);if(e){b=a[b]={};for(var f in e)Object.prototype.hasOwnProperty.call(e,f)&&(b[f]=c(e[f]))}return a}function Ia(a,b,c,d,e){if(null!=a){if(Array.isArray(a))a=P(a,void 0,0)?void 0:e&&K(a)&2?a:Ja(a,b,c,void 0!==d,e);else if(Da(a)){var f={},g;for(g in a)Object.prototype.hasOwnProperty.call(a,g)&&(f[g]=Ia(a[g],b,c,d,e));a=f}else a=b(a,d);return a}}
114function Ja(a,b,c,d,e){var f=d||c?K(a):0;d=d?!!(f&32):void 0;a=Array.prototype.slice.call(a);for(var g=0;g<a.length;g++)a[g]=Ia(a[g],b,c,d,e);c&&c(f,a);return a}function Ka(a){return a.s===N?a.toJSON():Ga(a)};function La(a,b,c){c=void 0===c?za:c;if(null!=a){if(ra&&a instanceof Uint8Array)return b?a:new Uint8Array(a);if(Array.isArray(a)){var d=K(a);if(d&2)return a;b&&(b=0===d||!!(d&32)&&!(d&64||!(d&16)));return b?M(a,(d|34)&-12293):Ja(a,La,d&4?za:c,!0,!0)}a.s===N&&(c=a.h,d=L(c),a=d&2?a:Fa(a.constructor,Ma(c,d,!0)));return a}}function Ma(a,b,c){var d=c||b&2?za:ya,e=!!(b&32);a=Ha(a,b,function(f){return La(f,e,d)});xa(a,32|(c?2:0));return a};function Na(a,b){a=a.h;return Oa(a,L(a),b)}function Oa(a,b,c,d){if(-1===c)return null;if(c>=Aa(b)){if(b&256)return a[a.length-1][c]}else{var e=a.length;
114if(d&&b&256&&(d=a[e-1][c],null!=d))return d;b=c+(+!!(b&512)-1);if(b<e)return a[b]}}function Pa(a,b,c,d,e){var f=Aa(b);if(c>=f||e){var g=b;if(b&256)e=a[a.length-1];else{if(null==d)return;e=a[f+(+!!(b&512)-1)]={};g|=256}e[c]=d;c<f&&(a[c+(+!!(b&512)-1)]=void 0);g!==b&&M(a,g)}else a[c+(+!!(b&512)-1)]=d,b&256&&(a=a[a.length-1],c in a&&delete a[c])}
115function Qa(a,b){var c=Ra;var d=void 0===d?!1:d;var e=a.h;var f=L(e),g=Oa(e,f,b,d);if(null!=g&&"object"===typeof g&&g.s===N)c=g;else if(Array.isArray(g)){var h=K(g),l=h;0===l&&(l|=f&32);l|=f&2;l!==h&&M(g,l);c=new c(g)}else c=void 0;c!==g&&null!=c&&Pa(e,f,b,c,d);e=c;if(null==e)return e;a=a.h;f=L(a);f&2||(g=e,c=g.h,h=L(c),g=h&2?Fa(g.constructor,Ma(c,h,!1)):g,g!==e&&(e=g,Pa(a,f,b,e,d)));return e}function Sa(a,b){a=Na(a,b);return null==a||"string"===typeof a?a:void 0}
116function Ta(a,b){var c=void 0===c?0:c;a=Na(a,b);if(null!=a)if(b=typeof a,"number"===b?Number.isFinite(a):"string"!==b?0:Ea.test(a))if("number"===typeof a){if(a=Math.trunc(a),!Number.isSafeInteger(a)){ta(a);b=H;var d=I;if(a=d&2147483648)b=~b+1>>>0,d=~d>>>0,0==b&&(d=d+1>>>0);b=4294967296*d+(b>>>0);a=a?-b:b}}else if(b=Math.trunc(Number(a)),Number.isSafeInteger(b))a=String(b);else{if(b=a.indexOf("."),-1!==b&&(a=a.substring(0,b)),!("-"===a[0]?20>a.length||20===a.length&&-922337<Number(a.substring(0,7)):
11719>a.length||19===a.length&&922337>Number(a.substring(0,6)))){if(16>a.length)ta(Number(a));else if(G())a=BigInt(a),H=Number(a&BigInt(4294967295))>>>0,I=Number(a>>BigInt(32)&BigInt(4294967295));else{b=+("-"===a[0]);I=H=0;d=a.length;for(var e=b,f=(d-b)%6+b;f<=d;e=f,f+=6)e=Number(a.slice(e,f)),I*=1E6,H=1E6*H+e,4294967296<=H&&(I+=Math.trunc(H/4294967296),I>>>=0,H>>>=0);b&&(b=m(ua(H,I)),a=b.next().value,b=b.next().value,H=a,I=b)}a=H;b=I;b&2147483648?G()?a=""+(BigInt(b|0)<<BigInt(32)|BigInt(a>>>0)):(b=
118m(ua(a,b)),a=b.next().value,b=b.next().value,a="-"+va(a,b)):a=va(a,b)}}else a=void 0;return null!=a?a:c}function S(a,b){a=Sa(a,b);return null!=a?a:""};function T(a,b,c){this.h=R(a,b,c)}T.prototype.toJSON=function(){return Ua(this,Ja(this.h,Ka,void 0,void 0,!1),!0)};T.prototype.s=N;T.prototype.toString=function(){return Ua(this,this.h,!1).toString()};
119function Ua(a,b,c){var d=a.constructor.v,e=L(c?a.h:b);a=b.length;if(!a)return b;var f;if(Da(c=b[a-1])){a:{var g=c;var h={},l=!1,p;for(p in g)if(Object.prototype.hasOwnProperty.call(g,p)){var u=g[p];if(Array.isArray(u)){var jb=u;if(P(u,d,+p)||Ca(u)&&0===u.size)u=null;u!=jb&&(l=!0)}null!=u?h[p]=u:l=!0}if(l){for(var O in h){g=h;break a}g=null}}g!=c&&(f=!0);a--}for(p=+!!(e&512)-1;0<a;a--){O=a-1;c=b[O];O-=p;if(!(null==c||P(c,d,O)||Ca(c)&&0===c.size))break;var kb=!0}if(!f&&!kb)return b;b=Array.prototype.slice.call(b,
1200,a);g&&b.push(g);return b};function Va(a){return function(b){if(null==b||""==b)b=new a;else{b=JSON.parse(b);if(!Array.isArray(b))throw Error(void 0);xa(b,32);b=Fa(a,b)}return b}};function Wa(a){this.h=R(a)}r(Wa,T);var Xa=Va(Wa);var U;function V(a){this.g=a}V.prototype.toString=function(){return this.g+""};var Ya={};function Za(a){if(void 0===U){var b=null;var c=t.trustedTypes;if(c&&c.createPolicy){try{b=c.createPolicy("goog#html",{createHTML:v,createScript:v,createScriptURL:v})}catch(d){t.console&&t.console.error(d.message)}U=b}else U=b}a=(b=U)?b.createScriptURL(a):a;return new V(a,Ya)};function $a(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36)};function ab(a,b){b=String(b);"application/xhtml+xml"===a.contentType&&(b=b.toLowerCase());return a.createElement(b)}function bb(a){this.g=a||t.document||document};/*
121
122 SPDX-License-Identifier: Apache-2.0
123*/
124function cb(a,b){a.src=b instanceof V&&b.constructor===V?b.g:"type_error:TrustedResourceUrl";var c,d;(c=(b=null==(d=(c=(a.ownerDocument&&a.ownerDocument.defaultView||window).document).querySelector)?void 0:d.call(c,"script[nonce]"))?b.nonce||b.getAttribute("nonce")||"":"")&&a.setAttribute("nonce",c)};function db(a){a=void 0===a?document:a;return a.createElement("script")};function eb(a,b,c,d,e,f){try{var g=a.g,h=db(g);h.async=!0;cb(h,b);g.head.appendChild(h);h.addEventListener("load",function(){e();d&&g.head.removeChild(h)});h.addEventListener("error",function(){0<c?eb(a,b,c-1,d,e,f):(d&&g.head.removeChild(h),f())})}catch(l){f()}};var fb=t.atob("aHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vaW1hZ2VzL2ljb25zL21hdGVyaWFsL3N5c3RlbS8xeC93YXJuaW5nX2FtYmVyXzI0ZHAucG5n"),gb=t.atob("WW91IGFyZSBzZWVpbmcgdGhpcyBtZXNzYWdlIGJlY2F1c2UgYWQgb3Igc2NyaXB0IGJsb2NraW5nIHNvZnR3YXJlIGlzIGludGVyZmVyaW5nIHdpdGggdGhpcyBwYWdlLg=="),hb=t.atob("RGlzYWJsZSBhbnkgYWQgb3Igc2NyaXB0IGJsb2NraW5nIHNvZnR3YXJlLCB0aGVuIHJlbG9hZCB0aGlzIHBhZ2Uu");function ib(a,b,c){this.i=a;this.u=b;this.o=c;this.g=null;this.j=[];this.m=!1;this.l=new bb(this.i)}
125function lb(a){if(a.i.body&&!a.m){var b=function(){mb(a);t.setTimeout(function(){nb(a,3)},50)};eb(a.l,a.u,2,!0,function(){t[a.o]||b()},b);a.m=!0}}
126function mb(a){for(var b=W(1,5),c=0;c<b;c++){var d=X(a);a.i.body.appendChild(d);a.j.push(d)}b=X(a);b.style.bottom="0";b.style.left="0";b.style.position="fixed";b.style.width=W(100,110).toString()+"%";b.style.zIndex=W(2147483544,2147483644).toString();b.style.backgroundColor=ob(249,259,242,252,219,229);b.style.boxShadow="0 0 12px #888";b.style.color=ob(0,10,0,10,0,10);b.style.display="flex";b.style.justifyContent="center";b.style.fontFamily="Roboto, Arial";c=X(a);c.style.width=W(80,85).toString()+
127"%";c.style.maxWidth=W(750,775).toString()+"px";c.style.margin="24px";c.style.display="flex";c.style.alignItems="flex-start";c.style.justifyContent="center";d=ab(a.l.g,"IMG");d.className=$a();d.src=fb;d.alt="Warning icon";d.style.height="24px";d.style.width="24px";d.style.paddingRight="16px";var e=X(a),f=X(a);f.style.fontWeight="bold";f.textContent=gb;var g=X(a);g.textContent=hb;Y(a,e,f);Y(a,e,g);Y(a,c,d);Y(a,c,e);Y(a,b,c);a.g=b;a.i.body.appendChild(a.g);b=W(1,5);for(c=0;c<b;c++)d=X(a),a.i.body.appendChild(d),
128a.j.push(d)}function Y(a,b,c){for(var d=W(1,5),e=0;e<d;e++){var f=X(a);b.appendChild(f)}b.appendChild(c);c=W(1,5);for(d=0;d<c;d++)e=X(a),b.appendChild(e)}function W(a,b){return Math.floor(a+Math.random()*(b-a))}function ob(a,b,c,d,e,f){return"rgb("+W(Math.max(a,0),Math.min(b,255)).toString()+","+W(Math.max(c,0),Math.min(d,255)).toString()+","+W(Math.max(e,0),Math.min(f,255)).toString()+")"}function X(a){a=ab(a.l.g,"DIV");a.className=$a();return a}
129function nb(a,b){0>=b||null!=a.g&&0!==a.g.offsetHeight&&0!==a.g.offsetWidth||(pb(a),mb(a),t.setTimeout(function(){nb(a,b-1)},50))}function pb(a){for(var b=m(a.j),c=b.next();!c.done;c=b.next())(c=c.value)&&c.parentNode&&c.parentNode.removeChild(c);a.j=[];(b=a.g)&&b.parentNode&&b.parentNode.removeChild(b);a.g=null};function qb(a,b,c,d,e){function f(l){document.body?g(document.body):0<l?t.setTimeout(function(){f(l-1)},e):b()}function g(l){l.appendChild(h);t.setTimeout(function(){h?(0!==h.offsetHeight&&0!==h.offsetWidth?b():a(),h.parentNode&&h.parentNode.removeChild(h)):a()},d)}var h=rb(c);f(3)}function rb(a){var b=document.createElement("div");b.className=a;b.style.width="1px";b.style.height="1px";b.style.position="absolute";b.style.left="-10000px";b.style.top="-10000px";b.style.zIndex="-10000";return b};function Ra(a){this.h=R(a)}r(Ra,T);
129function sb(a){this.h=R(a)}r(sb,T);var tb=Va(sb);function ub(a){var b=la.apply(1,arguments);if(0===b.length)return Za(a[0]);for(var c=a[0],d=0;d<b.length;d++)c+=encodeURIComponent(b[d])+a[d+1];return Za(c)};function vb(a){if(!a)return null;a=Sa(a,4);var b;null===a||void 0===a?b=null:b=Za(a);return b};var wb=ea([""]),xb=ea([""]);function yb(a,b){this.m=a;this.o=new bb(a.document);this.g=b;this.j=S(this.g,1);this.u=vb(Qa(this.g,2))||ub(wb);this.i=!1;b=vb(Qa(this.g,13))||ub(xb);this.l=new ib(a.document,b,S(this.g,12))}yb.prototype.start=function(){zb(this)};
130function zb(a){Ab(a);eb(a.o,a.u,3,!1,function(){a:{var b=a.j;var c=t.btoa(b);if(c=t[c]){try{var d=Xa(t.atob(c))}catch(e){b=!1;break a}b=b===Sa(d,1)}else b=!1}b?Z(a,S(a.g,14)):(Z(a,S(a.g,8)),lb(a.l))},function(){qb(function(){Z(a,S(a.g,7));lb(a.l)},function(){return Z(a,S(a.g,6))},S(a.g,9),Ta(a.g,10),Ta(a.g,11))})}function Z(a,b){a.i||(a.i=!0,a=new a.m.XMLHttpRequest,a.open("GET",b,!0),a.send())}function Ab(a){var b=t.btoa(a.j);a.m[b]&&Z(a,S(a.g,5))};(function(a,b){t[a]=function(){var c=la.apply(0,arguments);t[a]=function(){};b.call.apply(b,[null].concat(c instanceof Array?c:fa(m(c))))}})("__h82AlnkH6D91__",function(a){"function"===typeof window.atob&&(new yb(window,tb(window.atob(a)))).start()});}).call(this);
131
132window.__h82AlnkH6D91__("WyJwdWItMDA3Mzk3NjU0NTU1NjgzNyIsW251bGwsbnVsbCxudWxsLCJodHRwczovL2Z1bmRpbmdjaG9pY2VzbWVzc2FnZXMuZ29vZ2xlLmNvbS9iL3B1Yi0wMDczOTc2NTQ1NTU2ODM3Il0sbnVsbCxudWxsLCJodHRwczovL2Z1bmRpbmdjaG9pY2VzbWVzc2FnZXMuZ29vZ2xlLmNvbS9lbC9BR1NLV3hVenhkN3lsbUlHNGE3MlM2TTRFZzlwVWt3OXNNZHRUYlVRWTBTZG9JZHQ0SHZBRDJLQlRXNU9PbHp6bHhGMDA3aFppalNNNDdxVjZlUHU1RW81bk9mMDB3XHUwMDNkXHUwMDNkP3RlXHUwMDNkVE9LRU5fRVhQT1NFRCIsImh0dHBzOi8vZnVuZGluZ2Nob2ljZXNtZXNzYWdlcy5nb29nbGUuY29tL2VsL0FHU0tXeFdIMlBHZWYyLV9wVnR1MG9JWUE3c2VOS0RsbS1FSC1nUnNZT2cyNnRsQ3JPQ21LZ3N0QUxQeDV1N2NxVmpGZEF2V1pKTEEyaWswMjNkV1N0cXdRaXdSdmdcdTAwM2RcdTAwM2Q/YWJcdTAwM2QxXHUwMDI2c2JmXHUwMDNkMSIsImh0dHBzOi8vZnVuZGluZ2Nob2ljZXNtZXNzYWdlcy5nb29nbGUuY29tL2VsL0FHU0tXeFZkbE96RVJ6T3F5MXo5R1pSeHNlT3YyLUFMSF93VWN6a0VseFBoWUYyRHgxYm55Uks4QV9nd0I5MlF2WFNnYXVBSEo5TlpITHBsVGZtQjFkZ1k1azN3N0FcdTAwM2RcdTAwM2Q/YWJcdTAwM2QyXHUwMDI2c2JmXHUwMDNkMSIsImh0dHBzOi8vZnVuZGluZ2Nob2ljZXNtZXNzYWdlcy5nb29nbGUuY29tL2VsL0FHU0tXeFZ2eFR2SHZtbVR6eTVualVfajB0RTB5RVZDZXFmS0VRVmNyUnp6M3A2c3c3REl5dDZRaVlQY2ZiVmJtRTJPWWZueFJlM3AxbU9TSVUxakktSzJ2TXBCYUFcdTAwM2RcdTAwM2Q/c2JmXHUwMDNkMiIsImRpdi1ncHQtYWQiLDIwLDEwMCwiY0hWaUxUQXdOek01TnpZMU5EVTFOVFk0TXpjXHUwMDNkIixbbnVsbCxudWxsLG51bGwsImh0dHBzOi8vd3d3LmdzdGF0aWMuY29tLzBlbW4vZi9wL3B1Yi0wMDczOTc2NTQ1NTU2ODM3LmpzP3VzcXBcdTAwM2RDQTAiXSwiaHR0cHM6Ly9mdW5kaW5nY2hvaWNlc21lc3NhZ2VzLmdvb2dsZS5jb20vZWwvQUdTS1d4WFp3dlFHOWkwMFdfWm5Hb0RocXRMVVZjanRHY1M5THNVNHBqUTdXMVo0Wl82eDN2TVFZdElQRU03ZnMzY0h1TkZJNEdZUGZLTnpDclBPMHk0dmFwbkNpZ1x1MDAzZFx1MDAzZCJd");</script>
132
133<!-- End Google AdSense Ad Blocking Recovery Error Protection snippet added by Site Kit -->
134<link rel="icon" href="https://ramblings.mcpher.com/wp-content/uploads/2024/06/desktop-liberation-favicon-color-50x50.png" sizes="32x32" />
135<link rel="icon" href="https://ramblings.mcpher.com/wp-content/uploads/2024/06/desktop-liberation-favicon-color.png" sizes="192x192" />
136<link rel="apple-touch-icon" href="https://ramblings.mcpher.com/wp-content/uploads/2024/06/desktop-liberation-favicon-color.png" />
137<meta name="msapplication-TileImage" content="https://ramblings.mcpher.com/wp-content/uploads/2024/06/desktop-liberation-favicon-color.png" />
138<style id="wp-custom-css">
139.bmc-btn-text {
140	
141margin-left: 8px;
142display: inline-block;
143line-height: 0;
144width: 100%;
145flex-shrink: 0;
146color: white;
147font-weight: 300;
148}
149
150.bmc-btn {
151margin-left: 20%;
152}
153</style>
154<style id="wp-block-heading-inline-css">
155h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}
156/*# sourceURL=https://ramblings.mcpher.com/wp-includes/blocks/heading/style.min.css */
157</style>
158<style id="wp-block-paragraph-inline-css">
159.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}
160/*# sourceURL=https://ramblings.mcpher.com/wp-includes/blocks/paragraph/style.min.css */
161</style>
162<link rel='stylesheet' id='wpo_min-footer-0-css' href='https://ramblings.mcpher.com/wp-content/cache/wpo-minify/1788206514/assets/wpo-minify-footer-f705100d.min.css' media='all' />
163
164</head>
165<body id="mh-mobile" class="archive category category-docs category-345 wp-custom-logo wp-theme-mh-magazine mh-boxed-layout mh-right-sb mh-loop-layout1 mh-widget-layout1" itemscope="itemscope" itemtype="https://schema.org/WebPage">
166<div class="mh-container mh-container-outer">
167<div class="mh-header-nav-mobile clearfix"></div>
168	<div class="mh-preheader">
169    	<div class="mh-container mh-container-inner mh-row clearfix">
170							<div class="mh-header-bar-content mh-header-bar-top-left mh-col-2-3 clearfix">
171									</div>
172										<div class="mh-header-bar-content mh-header-bar-top-right mh-col-1-3 clearfix">
173											<aside class="mh-header-search mh-header-search-top">
174							<form role="search" method="get" class="search-form" action="https://ramblings.mcpher.com/">
175				<label>
176					<span class="screen-reader-text">Search for:</span>
177					<input type="search" class="search-field" placeholder="Search &hellip;" value="" name="s" />
178				</label>
179				<input type="submit" class="search-submit" value="Search" />
180			</form>						</aside>
181									</div>
182					</div>
183	</div>
184<header class="mh-header" itemscope="itemscope" itemtype="https://schema.org/WPHeader">
185	<div class="mh-container mh-container-inner clearfix">
186		<div class="mh-custom-header clearfix">
187<div class="mh-header-columns mh-row clearfix">
188<div class="mh-col-1-1 mh-site-identity">
189<div class="mh-site-logo" role="banner" itemscope="itemscope" itemtype="https://schema.org/Brand">
190<a href="https://ramblings.mcpher.com/" class="custom-logo-link" rel="home"><img width="600" height="106" src="https://ramblings.mcpher.com/wp-content/uploads/2024/06/logo-no-background-e1718288110412.png" class="custom-logo" alt="Desktop liberation" decoding="async" fetchpriority="high" /></a><div class="mh-header-text">
191<a class="mh-header-text-link" href="https://ramblings.mcpher.com/" title="Desktop liberation" rel="home">
192<h2 class="mh-header-title">Desktop liberation</h2>
193<h3 class="mh-header-tagline">
193The definitive resource for Google Workspace and Cloud automation</h3>
194</a>
195</div>
196</div>
197</div>
198</div>
199</div>
200	</div>
201	<div class="mh-main-nav-wrap">
202		<nav class="mh-navigation mh-main-nav mh-container mh-container-inner clearfix" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement">
203			<div class="menu-main-menu-container"><ul id="menu-main-menu" class="menu"><li id="menu-item-2233" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-has-children menu-item-2233"><a href="https://ramblings.mcpher.com">Home</a>
204<ul class="sub-menu">
205	<li id="menu-item-2273" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2273"><a href="https://ramblings.mcpher.com/ramblings/about/">About Desktop Liberation</a></li>
206	<li id="menu-item-9161" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9161"><a href="https://ramblings.mcpher.com/reusing-code-from-this-site/">Reusing code from this site</a></li>
207	<li id="menu-item-17494" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-17494"><a href="https://docs.google.com/spreadsheets/d/1DlKpVVYCrCPNfRbGsz6N_K3oPTgdC9gQIKi0aNb42uI/edit#gid=0">My Public GAS Library</a></li>
208	<li id="menu-item-17967" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-17967"><a href="https://ramblings.mcpher.com/privacy-and-usage-policy/">Privacy and Usage Policy</a></li>
209</ul>
210</li>
211<li id="menu-item-9939" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-9939"><a href="https://ramblings.mcpher.com/blog/">Blog</a>
212<ul class="sub-menu">
213	<li id="menu-item-21177" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21177"><a href="https://ramblings.mcpher.com/ramblings-blog/">Access all published posts</a></li>
214</ul>
215</li>
216<li id="menu-item-9160" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9160"><a href="https://ramblings.mcpher.com/download-complete-projects/downloads/">Downloads</a></li>
217<li id="menu-item-20307" class="menu-item menu-item-type-taxonomy menu-item-object-category current-menu-ancestor menu-item-has-children menu-item-20307"><a href="https://ramblings.mcpher.com/category/cloud/apis-and-techniques/">APIS</a>
218<ul class="sub-menu">
219	<li id="menu-item-20319" class="menu-item menu-item-type-taxonomy menu-item-object-category current-category-ancestor current-menu-ancestor current-menu-parent current-category-parent menu-item-has-children menu-item-20319"><a href="https://ramblings.mcpher.com/category/google-api/">Google API</a>
220	<ul class="sub-menu">
221		<li id="menu-item-20333" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20333"><a href="https://ramblings.mcpher.com/category/google-api/charts/">Slides</a></li>
222		<li id="menu-item-20329" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20329"><a href="https://ramblings.mcpher.com/category/google-api/chrome/">Chrome</a></li>
223		<li id="menu-item-20330" class="menu-item menu-item-type-taxonomy menu-item-object-category current-menu-item menu-item-20330"><a href="https://ramblings.mcpher.com/category/google-api/docs/" aria-current="page">Docs</a></li>
224		<li id="menu-item-20327" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20327"><a href="https://ramblings.mcpher.com/category/google-api/drive/">Drive</a></li>
225		<li id="menu-item-20328" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20328"><a href="https://ramblings.mcpher.com/category/google-api/execution/">Execution</a></li>
226		<li id="menu-item-20320" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20320"><a href="https://ramblings.mcpher.com/category/google-api/knowledgegraph/">KnowledgeGraph</a></li>
227		<li id="menu-item-20332" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20332"><a href="https://ramblings.mcpher.com/category/google-api/people/">People</a></li>
228		<li id="menu-item-20331" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20331"><a href="https://ramblings.mcpher.com/category/google-api/sheet/">Sheets</a></li>
229	</ul>
230</li>
231	<li id="menu-item-20324" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20324"><a href="https://ramblings.mcpher.com/category/microsoft-api/">Microsoft API</a>
232	<ul class="sub-menu">
233		<li id="menu-item-20325" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20325"><a href="https://ramblings.mcpher.com/category/microsoft-api/onedrive/">OneDrive</a></li>
234	</ul>
235</li>
236	<li id="menu-item-20308" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20308"><a href="https://ramblings.mcpher.com/category/rest-api/">REST</a></li>
237	<li id="menu-item-20317" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20317"><a href="https://ramblings.mcpher.com/category/cloud/apis-and-techniques/video-intelligence/">Video Intelligence</a></li>
238	<li id="menu-item-20318" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20318"><a href="https://ramblings.mcpher.com/category/cloud/apis-and-techniques/vimeo/">Vimeo</a></li>
239	<li id="menu-item-20316" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20316"><a href="https://ramblings.mcpher.com/category/cloud/apis-and-techniques/vision-apis-and-techniques/">Vision</a></li>
240</ul>
241</li>
242<li id="menu-item-15354" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-15354"><a href="https://ramblings.mcpher.com/category/appsjavascripts/">Apps Script &amp; Java Script</a>
243<ul class="sub-menu">
244	<li id="menu-item-20943" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20943"><a href="https://ramblings.mcpher.com/category/appsjavascripts/snippets/apps-script-v8/">Apps Script v8</a></li>
245	<li id="menu-item-20379" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20379"><a href="https://ramblings.mcpher.com/category/add-ons/">Add-ons</a></li>
246	<li id="menu-item-20944" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20944"><a href="https://ramblings.mcpher.com/category/appsjavascripts/snippets/javascript/">Javascript</a></li>
247	<li id="menu-item-20281" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20281"><a href="https://ramblings.mcpher.com/category/vbatogas/">From VBA to Google Apps Script</a></li>
248	<li id="menu-item-20380" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20380"><a href="https://ramblings.mcpher.com/category/officevba/javascript-api/">Office JavaScript API</a></li>
249	<li id="menu-item-15908" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-15908"><a href="https://ramblings.mcpher.com/category/appsjavascripts/snippets/">Snippets</a></li>
250</ul>
251</li>
252<li id="menu-item-15303" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-15303"><a href="https://ramblings.mcpher.com/category/gcp/">Cloud Platform</a>
253<ul class="sub-menu">
254	<li id="menu-item-20277" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20277"><a href="https://ramblings.mcpher.com/category/bigquery/">BigQuery</a></li>
255	<li id="menu-item-20344" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20344"><a href="https://ramblings.mcpher.com/category/gcp/cloud-functions/">Cloud Functions</a></li>
256	<li id="menu-item-20343" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20343"><a href="https://ramblings.mcpher.com/category/databases/firebase-databases/">Firebase</a></li>
257	<li id="menu-item-20276" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20276"><a href="https://ramblings.mcpher.com/category/kubernetes/">Kubernetes</a></li>
258	<li id="menu-item-20285" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20285"><a href="https://ramblings.mcpher.com/category/gcp/">Google Cloud Platform</a></li>
259	<li id="menu-item-20278" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20278"><a href="https://ramblings.mcpher.com/category/cloud/storage/">Google Cloud Storage</a></li>
260</ul>
261</li>
262<li id="menu-item-20288" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20288"><a href="https://ramblings.mcpher.com/category/databases/">Databases</a>
263<ul class="sub-menu">
264	<li id="menu-item-20291" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20291"><a href="https://ramblings.mcpher.com/category/bigquery/">BigQuery</a></li>
265	<li id="menu-item-20295" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20295"><a href="https://ramblings.mcpher.com/category/databases/cockroach/">CockroachDB</a></li>
266	<li id="menu-item-20326" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20326"><a href="https://ramblings.mcpher.com/category/database-abstraction/">Database abstraction</a></li>
267	<li id="menu-item-20289" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20289"><a href="https://ramblings.mcpher.com/category/elastic/">Elastic</a></li>
268	<li id="menu-item-20342" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20342"><a href="https://ramblings.mcpher.com/category/databases/firebase-databases/">Firebase</a></li>
269	<li id="menu-item-20290" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20290"><a href="https://ramblings.mcpher.com/category/redisreactredux/graphql/">GraphQL</a></li>
270</ul>
271</li>
272<li id="menu-item-15307" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-15307"><a href="https://ramblings.mcpher.com/category/officevba/">Office &#038; VBA</a>
273<ul class="sub-menu">
274	<li id="menu-item-20282" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20282"><a href="https://ramblings.mcpher.com/category/vbatogas/">From VBA to Google Apps Script</a></li>
275	<li id="menu-item-20283" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20283"><a href="https://ramblings.mcpher.com/category/officevba/optimization-officevba/">Optimization</a></li>
276</ul>
277</li>
278</ul></div>		</nav>
279	</div>
280			<div class="mh-extra-nav-wrap">
281			<div class="mh-extra-nav-bg">
282				<nav class="mh-navigation mh-extra-nav mh-container mh-container-inner clearfix" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement">
283					<div class="menu-categories-container"><ul id="menu-categories" class="menu"><li id="menu-item-24300" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24300"><a href="https://ramblings.mcpher.com/category/elastic/">Elastic</a></li>
284<li id="menu-item-24301" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24301"><a href="https://ramblings.mcpher.com/category/redisreactredux/">Full Stack</a></li>
285<li id="menu-item-24302" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24302"><a href="https://ramblings.mcpher.com/category/redisreactredux/graphql/">GraphQL</a></li>
286<li id="menu-item-24303" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24303"><a href="https://ramblings.mcpher.com/category/kubernetes/">Kubernetes</a></li>
287<li id="menu-item-24304" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24304"><a href="https://ramblings.mcpher.com/category/node-js/">Node.js</a></li>
288<li id="menu-item-24305" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24305"><a href="https://ramblings.mcpher.com/category/redisreactredux/redis/">Redis-Vue.JS</a></li>
289</ul></div>				</nav>
290			</div>
291		</div>
292	</header>
293	<div class="mh-subheader">
294		<div class="mh-container mh-container-inner mh-row clearfix">
295										<div class="mh-header-bar-content mh-header-bar-bottom-right mh-col-1-3 clearfix">
296											<nav class="mh-social-icons mh-social-nav mh-social-nav-bottom clearfix" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement">
297							<div class="menu-social-container"><ul id="menu-social" class="menu"><li id="menu-item-24374" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24374"><a target="_blank" href="https://www.linkedin.com/in/brucemcpherson/" title="LimkedIn"><i class="fa fa-mh-social"></i><span class="screen-reader-text">LinkedIn</span></a></li>
298<li id="menu-item-24380" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24380"><a target="_blank" href="https://github.com/brucemcpherson/"><i class="fa fa-mh-social"></i><span class="screen-reader-text">Github</span></a></li>
299</ul></div>						</nav>
300									</div>
301					</div>
302	</div>
303<div class="mh-wrapper clearfix">
304	<div class="mh-main clearfix">
305		<div id="main-content" class="mh-loop mh-content" role="main"><nav class="mh-breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><span itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="https://ramblings.mcpher.com" itemprop="item"><span itemprop="name">Home</span></a><meta itemprop="position" content="1" /></span><span class="mh-breadcrumb-delimiter"><i class="fa fa-angle-right"></i></span><a href="https://ramblings.mcpher.com/category/google-api/">Google API</a><span class="mh-breadcrumb-delimiter"><i class="fa fa-angle-right"></i></span>Docs</nav>
306				<header class="page-header"><h1 class="page-title">Docs</h1>				</header><article class="mh-posts-list-item clearfix post-25810 page type-page status-publish has-post-thumbnail hentry category-api-specific category-apps-script category-appsjavascripts category-docs category-drive category-google-api category-google-authentication category-google-docs category-node-js category-optimization category-sheet category-charts tag-api tag-apps-script tag-atomic tag-gas-fakes tag-google-workspace tag-node tag-worker">
307	<figure class="mh-posts-list-thumb">
308		<a class="mh-thumb-icon mh-thumb-icon-small-mobile" href="https://ramblings.mcpher.com/turning-async-into-synch-on-node-using-workers/"><img width="326" height="245" src="https://ramblings.mcpher.com/wp-content/uploads/2025/07/Gemini_Generated_Image_xsjrj2xsjrj2xsjr-326x245.jpeg" class="attachment-mh-magazine-medium size-mh-magazine-medium wp-post-image" alt="" decoding="async" srcset="https://ramblings.mcpher.com/wp-content/uploads/2025/07/Gemini_Generated_Image_xsjrj2xsjrj2xsjr-326x245.jpeg 326w, https://ramblings.mcpher.com/wp-content/uploads/2025/07/Gemini_Generated_Image_xsjrj2xsjrj2xsjr-678x509.jpeg 678w, https://ramblings.mcpher.com/wp-content/uploads/2025/07/Gemini_Generated_Image_xsjrj2xsjrj2xsjr-80x60.jpeg 80w" sizes="(max-width: 326px) 100vw, 326px" />		</a>
309					<div class="mh-image-caption mh-posts-list-caption">
310				API Specific			</div>
311			</figure>
312	<div class="mh-posts-list-content clearfix">
313		<header class="mh-posts-list-header">
314			<h3 class="entry-title mh-posts-list-title">
315				<a href="https://ramblings.mcpher.com/turning-async-into-synch-on-node-using-workers/" title="Turning async into synch on Node using workers" rel="bookmark">
316					Turning async into synch on Node using workers				</a>
317			</h3>
318			<div class="mh-meta entry-meta">
319<span class="entry-meta-date updated"><i class="fa fa-clock-o"></i><a href="https://ramblings.mcpher.com/2025/07/">July 11, 2025</a></span>
320<span class="entry-meta-comments"><i class="fa fa-comment-o"></i><span class="mh-comment-count-link">Comments Off<span class="screen-reader-text"> on Turning async into synch on Node using workers</span></span></span>
321</div>
322		</header>
323		<div class="mh-posts-list-excerpt clearfix">
324			<div class="mh-excerpt"><p>Emulating a synchronous service on node can be tricky. This example, emulating Apps Script services on Node, shows how you can use Node workers to pipeline async-sync methods. <a class="mh-excerpt-more" href="https://ramblings.mcpher.com/turning-async-into-synch-on-node-using-workers/" title="Turning async into synch on Node using workers">[&#8230;]</a></p>
325</div>		</div>
326	</div>
327</article><article class="mh-posts-list-item clearfix post-6060 page type-page status-publish hentry category-docs category-vbatogas category-google-api category-officevba category-javascript-api tag-vba">
328	<figure class="mh-posts-list-thumb">
329		<a class="mh-thumb-icon mh-thumb-icon-small-mobile" href="https://ramblings.mcpher.com/vbagooscript/vba-debug-object/"><img class="mh-image-placeholder" src="https://ramblings.mcpher.com/wp-content/themes/mh-magazine/images/placeholder-medium.png" alt="No Picture" />		</a>
330					<div class="mh-image-caption mh-posts-list-caption">
331				Docs			</div>
332			</figure>
333	<div class="mh-posts-list-content clearfix">
334		<header class="mh-posts-list-header">
335			<h3 class="entry-title mh-posts-list-title">
336				<a href="https://ramblings.mcpher.com/vbagooscript/vba-debug-object/" title="VBA debug object" rel="bookmark">
337					VBA debug object				</a>
338			</h3>
339			<div class="mh-meta entry-meta">
340<span class="entry-meta-date updated"><i class="fa fa-clock-o"></i><a href="https://ramblings.mcpher.com/2019/04/">April 28, 2019</a></span>
341<span class="entry-meta-comments"><i class="fa fa-comment-o"></i><span class="mh-comment-count-link">Comments Off<span class="screen-reader-text"> on VBA debug object</span></span></span>
342</div>
343		</header>
344		<div class="mh-posts-list-excerpt clearfix">
345			<div class="mh-excerpt"><p>There is a debugger for google apps script. Here&#8217;s how to use it Compared to the VBA debugger it sucks, so you probably need to be able to log and assert. javaScript does not have <a class="mh-excerpt-more" href="https://ramblings.mcpher.com/vbagooscript/vba-debug-object/" title="VBA debug object">[&#8230;]</a></p>
346</div>		</div>
347	</div>
348</article><article class="mh-posts-list-item clearfix post-2716 page type-page status-publish hentry category-docs category-google-api tag-google-sheets">
349	<figure class="mh-posts-list-thumb">
350		<a class="mh-thumb-icon mh-thumb-icon-small-mobile" href="https://ramblings.mcpher.com/apps-built-with-data-abstraction/gdatagdocs/"><img class="mh-image-placeholder" src="https://ramblings.mcpher.com/wp-content/themes/mh-magazine/images/placeholder-medium.png" alt="No Picture" />		</a>
351					<div class="mh-image-caption mh-posts-list-caption">
352				Docs			</div>
353			</figure>
354	<div class="mh-posts-list-content clearfix">
355		<header class="mh-posts-list-header">
356			<h3 class="entry-title mh-posts-list-title">
357				<a href="https://ramblings.mcpher.com/apps-built-with-data-abstraction/gdatagdocs/" title="Get Data From Google Docs" rel="bookmark">
358					Get Data From Google Docs				</a>
359			</h3>
360			<div class="mh-meta entry-meta">
361<span class="entry-meta-date updated"><i class="fa fa-clock-o"></i><a href="https://ramblings.mcpher.com/2019/03/">March 29, 2019</a></span>
362<span class="entry-meta-comments"><i class="fa fa-comment-o"></i><span class="mh-comment-count-link">Comments Off<span class="screen-reader-text"> on Get Data From Google Docs</span></span></span>
363</div>
364		</header>
365		<div class="mh-posts-list-excerpt clearfix">
366			<div class="mh-excerpt"><p>There have been a number of changes to Google Docs over the years each of which has provided more ways to do things. The latest is the new Sheets API V4,which is by far the best <a class="mh-excerpt-more" href="https://ramblings.mcpher.com/apps-built-with-data-abstraction/gdatagdocs/" title="Get Data From Google Docs">[&#8230;]</a></p>
367</div>		</div>
368	</div>
369</article><article class="mh-posts-list-item clearfix post-7505 post type-post status-publish format-standard hentry category-docs category-google-api">
370	<figure class="mh-posts-list-thumb">
371		<a class="mh-thumb-icon mh-thumb-icon-small-mobile" href="https://ramblings.mcpher.com/google-docs-to-excel-asynchronously-2/"><img class="mh-image-placeholder" src="https://ramblings.mcpher.com/wp-content/themes/mh-magazine/images/placeholder-medium.png" alt="No Picture" />		</a>
372					<div class="mh-image-caption mh-posts-list-caption">
373				Docs			</div>
374			</figure>
375	<div class="mh-posts-list-content clearfix">
376		<header class="mh-posts-list-header">
377			<h3 class="entry-title mh-posts-list-title">
378				<a href="https://ramblings.mcpher.com/google-docs-to-excel-asynchronously-2/" title="Google Docs to Excel Asynchronously" rel="bookmark">
379					Google Docs to Excel Asynchronously				</a>
380			</h3>
381			<div class="mh-meta entry-meta">
382<span class="entry-meta-date updated"><i class="fa fa-clock-o"></i><a href="https://ramblings.mcpher.com/2013/08/">August 6, 2013</a></span>
383<span class="entry-meta-comments"><i class="fa fa-comment-o"></i><span class="mh-comment-count-link">Comments Off<span class="screen-reader-text"> on Google Docs to Excel Asynchronously</span></span></span>
384</div>
385		</header>
386		<div class="mh-posts-list-excerpt clearfix">
387			<div class="mh-excerpt"><p>I&#8217;ve been playing around with creating a promise based framework for VBA for a while now, mainly just to see if it was possible. Here&#8217;s a practical implementation that gets the data from a large <a class="mh-excerpt-more" href="https://ramblings.mcpher.com/google-docs-to-excel-asynchronously-2/" title="Google Docs to Excel Asynchronously">[&#8230;]</a></p>
388</div>		</div>
389	</div>
390</article>		</div>
391			<aside class="mh-widget-col-1 mh-sidebar" itemscope="itemscope" itemtype="https://schema.org/WPSideBar"><div id="search-5" class="mh-widget widget_search"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">Search the site</span></h4><form role="search" method="get" class="search-form" action="https://ramblings.mcpher.com/">
392				<label>
393					<span class="screen-reader-text">Search for:</span>
394					<input type="search" class="search-field" placeholder="Search &hellip;" value="" name="s" />
395				</label>
396				<input type="submit" class="search-submit" value="Search" />
397			</form></div><div id="custom_html-40" class="widget_text mh-widget widget_custom_html"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">Support my research and site</span></h4><div class="textwidget custom-html-widget"><p>
398	<b>GitHub Sponsors</b> lets individuals and businesses financially support open-source developers through recurring or one-time contributions, ensuring critical software stays sustainable. Sponsoring gives individuals perks like exclusive updates, early release access, and profile badges, while companies gain brand visibility, simplified billing, and a direct line to maintainers to help influence softw
398are roadmaps.
399</p>
400<p>
401
402I maintain hundreds of <a src="https://github.com/brucemcpherson">github repositories</a> with much of the code referenced on this site and elsewhere. </p><p>
403	
404If you find any of it useful, consider sponsoring my open source work.</p>
405<p>
406	
407
408<iframe src="https://github.com/sponsors/brucemcpherson/card" title="Sponsor brucemcpherson" height="100" width="600" style="border: 0;"></iframe> </p>
409<hl></hl>
410<h4>
411	AI effect on technical blogs
412</h4>
413<p>
414	AI coding assistants and search overviews are driving a sharp decline in web traffic to technical blogs, forums, and documentation sites. Because developers now get instant, inline solutions inside their code editors or direct answers on search engine results pages, fewer users visit original sites—depriving them of ad revenue, community engagement, and direct support. This creates a risky feedback loop: as human-driven tech hubs struggle to survive, the open web sources that AI relies on for training lose the funding and contributors needed to keep content accurate and up to date.
415</p>
416<p>
417	Help contribute to the cost of keeping this site going.
418</p>
419<script type="text/javascript" src="https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js" data-name="bmc-button" data-slug="brucemcpher" data-color="#00796b" data-emoji="☕" data-font="Cookie" data-text="Buy me a coffee?" data-outline-color="#ffffff" data-font-color="#ffffff" data-coffee-color="#FFDD00" ></script>
419</div></div><div id="mh_magazine_youtube-4" class="mh-widget mh_magazine_youtube"><h4 class="mh-widget-title"><span class="mh-widget-title-inner"><i class="fa fa-youtube-play"></i>My YouTube Channel</span></h4>			<div class="mh-video-widget">
420        		<div class="mh-video-container">
421        			<iframe seamless width="1280" height="720" src="//www.youtube.com/embed/zlzIE14vi0k?wmode=opaque&amp;hd=1&amp;autoplay=0&amp;showinfo=0&amp;controls=0&amp;rel=1" allowfullscreen></iframe>
422        		</div>
423			</div></div><div id="shortcodes-ultimate-6" class="mh-widget shortcodes-ultimate"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">My Publications</span></h4><div class="textwidget"><div class="su-divider su-divider-style-default" style="margin:1px 0;border-width:1px;border-color:#FFFFFF"></div></div></div><div id="mh_magazine_custom_slider-15" class="mh-widget mh_magazine_custom_slider">        	<div class="flexslider mh-slider-widget mh-slider-layout5">
424				<ul class="slides">							<li class="mh-slider-item">
425								<article>
426									<a href="https://bookauthority.org/books/best-google-books?t=5xhjwb&#038;s=award&#038;book=1491940468" title="Going GAS made it to the Best Google Books of All Time" target="_blank">
427										<img src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/Screenshot-2022-08-16-09.12.31.png" alt="Going GAS made it to the Best Google Books of All Time" />
428									</a>
429																			<div class="mh-slider-caption">
430											<div class="mh-slider-content">
431																									<h2 class="mh-slider-title">
432														<a href="https://bookauthority.org/books/best-google-books?t=5xhjwb&#038;s=award&#038;book=1491940468" title="Going GAS made it to the Best Google Books of All Time" target="_blank">
433															Going GAS made it to the Best Google Books of All Time														</a>
434													</h2>
435																																					<div class="mh-slider-excerpt mh-excerpt">
436														BookAuthority collects and ranks the best books in the world, and it is a great honor to get this kind of recognition. Thank you for all your support!														<a class="mh-excerpt-more" href="https://bookauthority.org/books/best-google-books?t=5xhjwb&#038;s=award&#038;book=1491940468" title="Going GAS made it to the Best Google Books of All Time" target="_blank">
437															[...]														</a>
438													</div>
439																							</div>
440										</div>
441																	</article>
442							</li>							<li class="mh-slider-item">
443								<article>
444									<a href="http://shop.oreilly.com/product/0636920048503.do" title="Going GAS Video" target="_blank">
445										<img src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/download.jpeg" alt="Going GAS Video" />
446									</a>
447																			<div class="mh-slider-caption">
448											<div class="mh-slider-content">
449																									<h2 class="mh-slider-title">
450														<a href="http://shop.oreilly.com/product/0636920048503.do" title="Going GAS Video" target="_blank">
451															Going GAS Video														</a>
452													</h2>
453																																					<div class="mh-slider-excerpt mh-excerpt">
454														An accelerated video course over about 8 hours and 70 lessons taking you through JavaScript and Apps Script from start to finish.														<a class="mh-excerpt-more" href="http://shop.oreilly.com/product/0636920048503.do" title="Going GAS Video" target="_blank">
455															[...]														</a>
456													</div>
457																							</div>
458										</div>
459																	</article>
460							</li>							<li class="mh-slider-item">
461								<article>
462									<a href="https://shop.oreilly.com/product/0636920054115.do" title="Video Course for Beginners" target="_blank">
463										<img src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/download-2.jpeg" alt="Video Course for Beginners" />
464									</a>
465																			<div class="mh-slider-caption">
466											<div class="mh-slider-content">
467																									<h2 class="mh-slider-title">
468														<a href="https://shop.oreilly.com/product/0636920054115.do" title="Video Course for Beginners" target="_blank">
469															Video Course for Beginners														</a>
470													</h2>
471																																					<div class="mh-slider-excerpt mh-excerpt">
472														A video course over about 8 hours and 70 lessons taking you through the basics of Apps Script and JavaScript														<a class="mh-excerpt-more" href="https://shop.oreilly.com/product/0636920054115.do" title="Video Course for Beginners" target="_blank">
473															[...]														</a>
474													</div>
475																							</div>
476										</div>
477																	</article>
478							</li>							<li class="mh-slider-item">
479								<article>
480									<a href="https://shop.oreilly.com/product/0636920045816.do#" title="Going GAS Book" target="_blank">
481										<img src="https://ramblings.mcpher.com/wp-content/uploads/2019/11/going-gas-e1580831309419.jpg" alt="Going GAS Book" />
482									</a>
483																			<div class="mh-slider-caption">
484											<div class="mh-slider-content">
485																									<h2 class="mh-slider-title">
486														<a href="https://shop.oreilly.com/product/0636920045816.do#" title="Going GAS Book" target="_blank">
487															Going GAS Book														</a>
488													</h2>
489																																					<div class="mh-slider-excerpt mh-excerpt">
490														For those who prefer book and eBook formats, a 450+ page deep dive into Apps Script. Especially useful for those transitioning from another platform.														<a class="mh-excerpt-more" href="https://shop.oreilly.com/product/0636920045816.do#" title="Going GAS Book" target="_blank">
491															[...]														</a>
492													</div>
493																							</div>
494										</div>
495																	</article>
496							</li>							<li class="mh-slider-item">
497								<article>
498									<a href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons" title="Live Project" target="_blank">
499										<img src="https://ramblings.mcpher.com/wp-content/uploads/2023/08/CreateAI-PoweredWorkspaceAdd-ons-Cover.jpg" alt="Live Project" />
500									</a>
501																			<div class="mh-slider-caption">
502											<div class="mh-slider-content">
503																									<h2 class="mh-slider-title">
504														<a href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons" title="Live Project" target="_blank">
505															Live Project														</a>
506													</h2>
507																																					<div class="mh-slider-excerpt mh-excerpt">
508														Create, Implement and test a  AI Powered Google Worksp
508ace Add-Ons. add functionality from a collection of Google Cloud APIs such as Cloud Storage, CardService, Drive and others														<a class="mh-excerpt-more" href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons" title="Live Project" target="_blank">
509															[...]														</a>
510													</div>
511																							</div>
512										</div>
513																	</article>
514							</li>				</ul>
515			</div></div><style>/* ul */
516.arpw-ul {
517display:block;
518margin-block-top:10px;
519margin-block-end:10px;
520
521
522}
523
524/* li */
525.arpw-li {}
526
527/* title */
528.arpw-title {
529display:block;
530margin-top:10px;
531margin-block-end:10px;
532font-size: 18px;
533font-family: Roboto;
534color: #e64946;}
535
536/* thumbnail */
537.arpw-thumbnail {
538vertical-align:top;}
539
540/* date */
541.arpw-time {}
542
543/* excerpt */
544.arpw-summary {
545font-family:roboto;
546font-size: 14px;}</style><div id="arpw-widget-2" class="mh-widget arpw-widget-random"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">Discover more content</span></h4><div class="arpw-random-page "><ul class="arpw-ul"><li class="arpw-li arpw-clearfix"><a class="arpw-title" href="https://ramblings.mcpher.com/gassnippets2/importing-predictwise-data/" rel="bookmark">Importing Predictwise data</a><div class="arpw-summary">Since it&#8217;s almost time for Eurovision again, I thought I&#8217;d see if I could find something to do with predicting the result, rather than analyzing &hellip;</div></li><li class="arpw-li arpw-clearfix"><a href="https://ramblings.mcpher.com/database-abstraction-and-google-apps-script/datastore-driver/relative-performance/"  rel="bookmark"><img width="150" height="150" src="https://ramblings.mcpher.com/wp-content/uploads/2019/04/image-150x150.png" class="arpw-thumbnail aligncenter wp-post-image" alt="Relative performance" decoding="async" loading="lazy" /></a><a class="arpw-title" href="https://ramblings.mcpher.com/database-abstraction-and-google-apps-script/datastore-driver/relative-performance/" rel="bookmark">Relative performance</a><div class="arpw-summary">Some information on performance when using the DataStore back end in Database abstraction with google apps scriptThe library reference is  Mj61W-201_t_zC9fJg1IzYiz3TLx7pV4j   Comparing scriptDB, parse and datastore &hellip;</div></li><li class="arpw-li arpw-clearfix"><a class="arpw-title" href="https://ramblings.mcpher.com/color-fiesta/visualizing-tables/" rel="bookmark">Visualizing tables</a><div class="arpw-summary">If you want to embed or publish Excel data to web pages, there are many solutions. Excel 2013 does fancy things with skydrive to share &hellip;</div></li><li class="arpw-li arpw-clearfix"><a class="arpw-title" href="https://ramblings.mcpher.com/oauth2-for-apps-script-in-a-few-lines-of-code/migrating-from-cezyoauth2/trying-to-like-oauth2/step-by-step-apps-script-oauth2-authentication-with-github/" rel="bookmark">Step by Step &#8211; Apps Script Oauth2 authentication with Github</a><div class="arpw-summary">In Oauth2 step by step &#8211; apps script authentication for the Drive JSON API I posted a tutorial on using EzyOauth2 &#8211; taking some pain &hellip;</div></li><li class="arpw-li arpw-clearfix"><a href="https://ramblings.mcpher.com/get-started-snippets/how-to-embed-gist-samples-in-google-sites/"  rel="bookmark"><img width="150" height="116" src="https://ramblings.mcpher.com/wp-content/uploads/2020/02/githubgist-150x116.png" class="arpw-thumbnail aligncenter wp-post-image" alt="How to embed gist samples in Google Sites" decoding="async" loading="lazy" /></a><a class="arpw-title" href="https://ramblings.mcpher.com/get-started-snippets/how-to-embed-gist-samples-in-google-sites/" rel="bookmark">How to embed gist samples in Google Sites</a><div class="arpw-summary">Warning This post is about how you were able to create and insert Google Gadgets onto Sites- Since first writing about it, Google has now &hellip;</div></li></ul></div><!-- Generated by https://wordpress.org/plugins/advanced-random-posts-widget/ --></div><div id="mh_magazine_social-3" class="mh-widget mh_magazine_social"><h4 class="mh-widget-title"><span class="mh-widget-title-inner">Stay connected</span></h4>				<nav class="mh-social-icons mh-social-widget clearfix">
547					<div class="menu-social-container"><ul id="menu-social-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24374"><a target="_blank" href="https://www.linkedin.com/in/brucemcpherson/" title="LimkedIn"><i class="fa fa-mh-social"></i><span class="screen-reader-text">LinkedIn</span></a></li>
548<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24380"><a target="_blank" href="https://github.com/brucemcpherson/"><i class="fa fa-mh-social"></i><span class="screen-reader-text">Github</span></a></li>
549</ul></div>				</nav></div>	</aside>	</div>
550	</div>
551<footer class="mh-footer" itemscope="itemscope" itemtype="https://schema.org/WPFooter">
552<div class="mh-container mh-container-inner mh-footer-widgets mh-row clearfix">
553<div class="mh-col-1-4 mh-widget-col-1 mh-footer-4-cols  mh-footer-area mh-footer-1">
554<div id="custom_html-14" class="widget_text mh-footer-widget widget_custom_html"><h6 class="mh-widget-title mh-footer-widget-title"><span class="mh-widget-title-inner mh-footer-widget-title-inner">Book : Going Gas</span></h6><div class="textwidget custom-html-widget"><figure class="aligncenter"><a href="https://www.oreilly.com/library/view/going-gas/9781491940457/"><img class="aligncenter wp-image-14523" style="border: 1px solid #000000;" src="https://ramblings.mcpher.com/wp-content/uploads/2023/03/going-gas-footer2.jpg" alt="Going Gas book"/></a></figure>
555<div style="margin-top:4px">
556	<p>
557		Whether you’re moving from Microsoft Office to Google Docs or simply want to learn how to automate Docs with Google Apps Script, this practical guide shows you by example how to work with each of the major Apps Script services. The book introduces JavaScript basics for experienced developers unfamiliar with the language, and demonstrates ways to build real-world apps using all of the Apps Script services previously covered.
558	</p>
559</div></div></div></div>
560<div class="mh-col-1-4 mh-widget-col-1 mh-footer-4-cols  mh-footer-area mh-footer-2">
561<div id="custom_html-15" class="widget_text mh-footer-widget widget_custom_html"><h6 class="mh-widget-title mh-footer-widget-title"><span class="mh-widget-title-inner mh-footer-widget-title-inner">Video: Apps Script for developers</span></h6><div class="textwidget custom-html-widget"><figure class="aligncenter"><a href="http://shop.oreilly.com/product/0636920048503.do"><img class="aligncenter wp-image-14523" style="border: 1px solid #000000;" src="https://ramblings.mcpher.com/wp-content/uploads/2023/03/video-footer.jpg" alt="" width="100%"  /></a></figure>
562<div style="margin-top:4px">
563	<p>
564		In this Google Apps Script for Developers training course, expert author Bruce Mcpherson will teach you how to customize, enhance, and automate your Google Docs, Sheets, and Gmail with Google Apps Script. This course is designed for the absolute beginner, meaning no previous experience with Google Apps Script is required.</p>
565
566<p>
567Once you have completed this computer based training course, you will have learned how to customize, enhance, and automate your Docs, Sheets, and Gmail with Google Apps Script.
568	</p>
569	
570</div>
571</div></div></div>
572<div class="mh-col-1-4 mh-widget-col-1 mh-footer-4-cols  mh-footer-area mh-footer-3">
573<div id="custom_html-16" class="widget_text mh-footer-widget widget_custom_html"><h6 class="mh-widget-title mh-footer-widget-title"><span class="mh-widget-title-inner mh-footer-widget-title-inner">Video: Apps Script for beginners</span></h6><div class="textwidget custom-html-widget"><figure class="aligncenter"><a href="https://shop.oreilly.com/product/0636920054115.do"><img class="aligncenter wp-image-14523" style="border: 1px solid #000000;" src="https://ramblings.mcpher.com/wp-content/uploads/2022/08/download-2.jpeg" alt="" width="100%" /></a></figure>
574<div style="margin-top:4px">
575	<p>
576	
577
578The key to using Google Apps Script is understanding its underlying language – JavaScript. The course teaches you enough of the concepts and syntax of JavaScript that you’ll come away with the ability to confidently code Google Apps Script tasks on your own.
579		</p>
580</div></div></div></div>
581<div class="mh-col-1-4 mh-widget-col-1 mh-footer-4-cols  mh-footer-area mh-footer-4">
582<div id="custom_html-33" class="widget_text mh-footer-widget widget_custom_html"><h6 class="mh-widget-title mh-footer-widget-title"><span class="mh-widget-title-inner mh-footer-widget-title-inner">Live Book</span></h6><div class="textwidget custom-html-widget"><!-- wp:image {"id":24146} -->
583<figure class="wp-block-image"><a href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons"><img src="https://ramblings.mcpher.com/wp-content/uploads/2023/08/CreateAI-PoweredWorkspaceAdd-ons-Cover.jpg"  class="wp-image-24146"
584																																																												alt="Manning liveproject create ai powered Google Workspace Add-ons"/></a></figure> 
585	
586
587<p>create, implement and test a Workspace Add-on</p><p>add functionality from a collection of Google Cloud APIs such as Cloud Storage, CardService, Drive and others</p><p>organize extracted data from a variety of documents using the Google AI Platform </p><a href="https://www.manning.com/liveprojectseries/create-google-workspace-add-ons"><b>Manning LiveProject</b></a>
588<!-- /wp:image --></div></div></div>
589</div>
590</footer>
591<div class="mh-copyright-wrap">
592	<div class="mh-container mh-container-inner clearfix">
593		<p class="mh-copyright">
594			bruce mcpherson is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Based on a work at http://www.mcpher.com. Permissions beyond the scope of this license may be available at code use guidelines		</p>
595	</div>
596</div>
597<a href="#" class="mh-back-to-top"><i class="fa fa-chevron-up"></i></a>
598</div><!-- .mh-container-outer -->
599<script type="speculationrules">
600{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/mh-magazine/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
601</script>
vendor: 1 bytes, line 601
601
602<script id="wpo_min-footer-0-js-extra">
603var PT_CV_PUBLIC = {"_prefix":"pt-cv-","page_to_show":"5","_nonce":"ba18ada535","is_admin":"","is_mobile":"","ajaxurl":"https://ramblings.mcpher.com/wp-admin/admin-ajax.php","lang":"","loading_image_src":"data:image/gif;base64,R0lGODlhDwAPALMPAMrKygwMDJOTkz09PZWVla+vr3p6euTk5M7OzuXl5TMzMwAAAJmZmWZmZszMzP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAPACwAAAAADwAPAAAEQvDJaZaZOIcV8iQK8VRX4iTYoAwZ4iCYoAjZ4RxejhVNoT+mRGP4cyF4Pp0N98sBGIBMEMOotl6YZ3S61Bmbkm4mAgAh+QQFCgAPACwAAAAADQANAAAENPDJSRSZeA418itN8QiK8BiLITVsFiyBBIoYqnoewAD4xPw9iY4XLGYSjkQR4UAUD45DLwIAIfkEBQoADwAsAAAAAA8ACQAABC/wyVlamTi3nSdgwFNdhEJgTJoNyoB9ISYoQmdjiZPcj7EYCAeCF1gEDo4Dz2eIAAAh+QQFCgAPACwCAAAADQANAAAEM/DJBxiYeLKdX3IJZT1FU0iIg2RNKx3OkZVnZ98ToRD4MyiDnkAh6BkNC0MvsAj0kMpHBAAh+QQFCgAPACwGAAAACQAPAAAEMDC59KpFDll73HkAA2wVY5KgiK5b0RRoI6MuzG6EQqCDMlSGheEhUAgqgUUAFRySIgAh+QQFCgAPACwCAAIADQANAAAEM/DJKZNLND/kkKaHc3xk+QAMYDKsiaqmZCxGVjSFFCxB1vwy2oOgIDxuucxAMTAJFAJNBAAh+QQFCgAPACwAAAYADwAJAAAEMNAs86q1yaWwwv2Ig0jUZx3OYa4XoRAfwADXoAwfo1+CIjyFRuEho60aSNYlOPxEAAAh+QQFCgAPACwAAAIADQANAAAENPA9s4y8+IUVcqaWJ4qEQozSoAzoIyhCK2NFU2SJk0hNnyEOhKR2AzAAj4Pj4GE4W0bkJQIAOw==","is_mobile_tablet":"","sf_no_post_found":"No posts found.","lf__separator":","};
604var PT_CV_PAGINATION = {"first":"\u00ab","prev":"\u2039","next":"\u203a","last":"\u00bb","goto_first":"Go to first page","goto_prev":"Go to previous page","goto_next":"Go to next page","goto_last":"Go to last page","current_page":"Current page is","goto_page":"Go to page"};
605//# sourceURL=wpo_min-footer-0-js-extra
606</script>
vendor: 1 bytes, line 606
606
607<script id="wpo_min-footer-0-js" src="https://ramblings.mcpher.com/wp-content/cache/wpo-minify/1788206514/assets/wpo-minify-footer-802f1722.min.js"></script>
607
608
609<!-- Shortcodes Ultimate custom CSS - start -->
610<style type="text/css">
611/* Spoiler Title */
612.su-spoiler.my-custom-spoiler > .su-spoiler-title {
613
614	/* Text Size */
615	font-size: 18px;
616
617
618	/* Background Color */
619	background: #FFFFFF;
620
621	/* Text Color */
622	color: #0FC700;
623	
624	/* Icon Color */
625	color: #C71E00;
626
627}
628
629/* Spoiler Icon */
630.su-spoiler.my-custom-spoiler > .su-spoiler-title > .su-spoiler-icon {
631	
632	/* Icon Color */
633	color: #C71E00;
634}
635
636/* Spoiler Title folder*/
637.su-spoiler.my-custom-spoiler2 > .su-spoiler-title {
638
639	/* Text Size */
640	font-size: 18px;
641
642
643	/* Background Color */
644	background: #FFFFFF;
645
646	/* Text Color */
647	color: #0a7ac4;
648
649}
650
651/* Spoiler Icon folder */
652.su-spoiler.my-custom-spoiler2 > .su-spoiler-title > .su-spoiler-icon {
653	
654	/* Icon Color */
655	color: #0592f0;
656}
657
658/*Tabs*/
659.su-tabs > .su-tabs-nav > span.su-tabs-current:hover {
660
661  /* Background color */
662  background-color: #ffcc00;
663
664  /* Text color */
665  color: #00ffcc;
666
667}
668</style>
669<!-- Shortcodes Ultimate custom CSS - end -->
670</body>
671</html>
672<!-- Cached by WP-Optimize (gzip) - https://teamupdraft.com/wp-optimize/ - Last modified: September 30, 2026 7:50 pm (Europe/London UTC:1) -->

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.