<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8912422413468109862</id><updated>2024-11-05T19:01:52.702-08:00</updated><category term="Digital Inspiration"/><category term="Digital Inspiration Technology Blog"/><category term="Technorati"/><category term="Mashable"/><category term="Computer Tricks"/><category term="Internet"/><category term="Windows"/><category term="TechCrunch"/><category term="Security"/><category term="Software"/><category term="Themes"/><category term="Facebook"/><category term="Google"/><category term="Hacking"/><category term="Email"/><category term="Gmail"/><category term="Access"/><category term="Android"/><category term="Followers"/><category term="Likes"/><category term="Music"/><category term="SEO"/><category term="Search Engine Tips"/><category term="Software Tricks"/><category term="twitter"/><category term="7"/><category term="Blocked"/><category term="Computer"/><category term="Downloads"/><category term="Earn"/><category term="Firefox"/><category term="Mobiles"/><category term="Proxy"/><category term="Seven"/><category term="Sites"/><category term="emoney"/><category term="free"/><category term="keylogger"/><category term="pdf"/><category term="youtube"/><title type='text'>UrTrix - UnRevealed Tricks</title><subtitle type='html'>...latest PC Tricks as soon as Revealed™! [[Press Ctrl + D to Bookmark]]</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default?start-index=26&amp;max-results=25'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>508</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-4038328116234762320</id><published>2023-11-04T07:07:00.001-07:00</published><updated>2023-11-04T07:07:47.715-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>Compare MacBook Prices Worldwide with Google Sheets</title><content type='html'>&lt;p&gt;Looking to buy the new Macbook Pro with M3 chips? Wondering if it would be cheaper to purchase a Macbook in your local Apple store, or ask a friend who is travelling from Singapore or Japan to bring one for you?&lt;/p&gt;
&lt;p&gt;Here’s a &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1olOLLSbJB2uqJ0YRTNrikoriP1NGv_can1ChTQewDlY/edit#gid=822182889&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Sheet&lt;/a&gt; that can help you compare prices of MacBooks in different countries. It takes the current prices of MacBooks from Apple online stores in different countries and converts them to a common currency (US Dollars). The exchange rates are fetched directly from Google Finance so the prices will update automatically when the exchange rates change.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/92fa36287e312f5d056bd7d622db5c65/379e7/2023-11-04-18-22-21.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Macbook Prices worldwide&quot; title=&quot;Macbook Prices worldwide&quot; src=&quot;/static/92fa36287e312f5d056bd7d622db5c65/16546/2023-11-04-18-22-21.png&quot; srcset=&quot;/static/92fa36287e312f5d056bd7d622db5c65/96042/2023-11-04-18-22-21.png 180w,/static/92fa36287e312f5d056bd7d622db5c65/7a322/2023-11-04-18-22-21.png 360w,/static/92fa36287e312f5d056bd7d622db5c65/16546/2023-11-04-18-22-21.png 720w,/static/92fa36287e312f5d056bd7d622db5c65/379e7/2023-11-04-18-22-21.png 842w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-the-macbook-price-comparison-sheet-works&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#how-the-macbook-price-comparison-sheet-works&quot; aria-label=&quot;how the macbook price comparison sheet works permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;How the Macbook Price Comparison Sheet Works&lt;/h2&gt;
&lt;p&gt;I have written a Node.js script that fetches the current prices of MacBooks from the Apple website and writes them to Google Sheets. Here’s the code that scrapes the Apple website and parses the HTML to extract the prices.&lt;/p&gt;
&lt;h3 id=&quot;get-macbook-prices-from-apple-website&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#get-macbook-prices-from-apple-website&quot; aria-label=&quot;get macbook prices from apple website permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Get Macbook Prices from Apple Website&lt;/h3&gt;
&lt;p&gt;Apple uses JSON-LD to embed structured pricing data in their web pages that can be easily parsed using &lt;code class=&quot;language-text&quot;&gt;cheerio&lt;/code&gt;. If the prices were not embedded in the wepage, an headless browser like &lt;a href=&quot;/puppeteer-firebase-scraping-220430&quot;&gt;Puppeteer&lt;/a&gt; would have been required to scrape the data.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;fs&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; cheerio &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;cheerio&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; regions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;us&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;in&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sg&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;uk&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ae&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;jp&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;scrapeAppleStore&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;region&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://www.apple.com/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;region&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/shop/buy-mac/macbook-pro&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; html &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; $ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cheerio&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;html&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; country &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;a.as-globalfooter-mini-locale-link&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;script[type=&quot;application/ld+json&quot;]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;i&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; elem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; json &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;@type&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Product&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;offers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;offer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; priceCurrency&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; price&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sku &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; offer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;country&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sku&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; price&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; priceCurrency&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; promises &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; regions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scrapeAppleStore&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Promise&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;promises&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; prices &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; values&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeFileSync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;prices.json&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prices&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;get-currency-exchange-rates-from-google-finance&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#get-currency-exchange-rates-from-google-finance&quot; aria-label=&quot;get currency exchange rates from google finance permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Get Currency Exchange Rates from Google Finance&lt;/h3&gt;
&lt;p&gt;The next step is to convert the prices of MacBooks in different currencies to a common currency (US Dollars). The exchange rates are fetched from Google Finance using the &lt;code class=&quot;language-text&quot;&gt;GOOGLEFINANCE&lt;/code&gt; function of Google Sheets.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;BYROW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;A1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;A27&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;LAMBDA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;USD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;GOOGLEFINANCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;CURRENCY:USD&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The function accepts the currency code of the source and target currencies and returns the exchange rate. For instance, the formula &lt;code class=&quot;language-text&quot;&gt;=GOOGLEFINANCE(&quot;CURRENCY:USDINR&quot;)&lt;/code&gt; will fetch the current exchange rate of US Dollars to &lt;a href=&quot;https://youtu.be/ydWTZ_4CUTs&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Indian Rupees&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/1635a2d1d7fd06d3f0b8a961e5836abb/f3b3a/2023-11-04-18-35-58.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Finance - Currency Exchange Rates&quot; title=&quot;Google Finance - Currency Exchange Rates&quot; src=&quot;/static/1635a2d1d7fd06d3f0b8a961e5836abb/16546/2023-11-04-18-35-58.png&quot; srcset=&quot;/static/1635a2d1d7fd06d3f0b8a961e5836abb/96042/2023-11-04-18-35-58.png 180w,/static/1635a2d1d7fd06d3f0b8a961e5836abb/7a322/2023-11-04-18-35-58.png 360w,/static/1635a2d1d7fd06d3f0b8a961e5836abb/16546/2023-11-04-18-35-58.png 720w,/static/1635a2d1d7fd06d3f0b8a961e5836abb/f3b3a/2023-11-04-18-35-58.png 747w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;build-the-macbook-price-comparison-sheet&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#build-the-macbook-price-comparison-sheet&quot; aria-label=&quot;build the macbook price comparison sheet permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Build the Macbook Price Comparison Sheet&lt;/h3&gt;
&lt;p&gt;Now that we have prices in a common current, we can build the price comparison table using the &lt;code class=&quot;language-text&quot;&gt;INDEX MATCH&lt;/code&gt; function of Google Sheets. The lookup criteria includes two columns - the SKU of the Macbook model and the country. The relevant formula is:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;INDEX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Data&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$&lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;$&lt;span class=&quot;token constant&quot;&gt;E&lt;/span&gt;$648&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;MATCH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$&lt;span class=&quot;token constant&quot;&gt;A3&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;B&lt;/span&gt;$1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;Data&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$&lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;$&lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;Data&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$&lt;span class=&quot;token constant&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;$&lt;span class=&quot;token constant&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Also see: &lt;a href=&quot;/internet/monitor-iphone-ipad-stock/28309/&quot;&gt;Monitor iPhone Stock with Google Sheets&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/UlCDsqe&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/4038328116234762320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/11/compare-macbook-prices-worldwide-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/4038328116234762320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/4038328116234762320'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/11/compare-macbook-prices-worldwide-with.html' title='Compare MacBook Prices Worldwide with Google Sheets'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-8234168112567579974</id><published>2023-11-04T01:07:00.001-07:00</published><updated>2023-11-04T01:07:33.997-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>Conditional Email Notifications with Google Forms - Route Responses to Different Email Addresses</title><content type='html'>&lt;p&gt;The &lt;a href=&quot;https://workspace.google.com/marketplace/app/email_notifications_for_google_forms/984866591130&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Forms Email Notifications&lt;/a&gt; add-on lets you send Google Form responses in an email message as soon as a respondent submits the form. The email template can be customized to include the form answers or the form edit link.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/d68838c1555a7d432acf7f6474e84a5e/95b20/conditional-email-notifications.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Conditional Email Notifications for Google Forms&quot; title=&quot;Conditional Email Notifications for Google Forms&quot; src=&quot;/static/d68838c1555a7d432acf7f6474e84a5e/16546/conditional-email-notifications.png&quot; srcset=&quot;/static/d68838c1555a7d432acf7f6474e84a5e/96042/conditional-email-notifications.png 180w,/static/d68838c1555a7d432acf7f6474e84a5e/7a322/conditional-email-notifications.png 360w,/static/d68838c1555a7d432acf7f6474e84a5e/16546/conditional-email-notifications.png 720w,/static/d68838c1555a7d432acf7f6474e84a5e/6d80e/conditional-email-notifications.png 1080w,/static/d68838c1555a7d432acf7f6474e84a5e/843f9/conditional-email-notifications.png 1440w,/static/d68838c1555a7d432acf7f6474e84a5e/95b20/conditional-email-notifications.png 1451w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You can also set up conditional email notifications for Google Forms where the form responses are sent to different email addresses based on the form answers filled-in by the respondent.&lt;/p&gt;
&lt;p&gt;In the above example, we have a Google Form that asks the respondent to select the sessions they are interested in attending for an AI workshop. It is a mulitple choice checkbox question as the respondent can select one or more sessions. The form responses are then sent to different email addresses based on the sessions selected by the respondent.&lt;/p&gt;
&lt;h2 id=&quot;set-up-conditional-email-notifications-for-google-forms&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#set-up-conditional-email-notifications-for-google-forms&quot; aria-label=&quot;set up conditional email notifications for google forms permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Set Up Conditional Email Notifications for Google Forms&lt;/h2&gt;
&lt;p&gt;Install the &lt;a href=&quot;https://workspace.google.com/marketplace/app/email_notifications_for_google_forms/984866591130&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Forms add-on&lt;/a&gt; and setup a &lt;a href=&quot;https://digitalinspiration.com/docs/form-notifications/tutorial&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;new rule&lt;/a&gt;. Enable the &lt;a href=&quot;https://digitalinspiration.com/docs/form-notifications/send-conditional-emails&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Conditional Notifications&lt;/a&gt; option and add a new condition as shown in the screenshot.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:689px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/bdf01b95c10ec63134a55446f287c172/e0d28/email-forms-logic.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Email Forms Logic&quot; title=&quot;Email Forms Logic&quot; src=&quot;/static/bdf01b95c10ec63134a55446f287c172/e0d28/email-forms-logic.png&quot; srcset=&quot;/static/bdf01b95c10ec63134a55446f287c172/96042/email-forms-logic.png 180w,/static/bdf01b95c10ec63134a55446f287c172/7a322/email-forms-logic.png 360w,/static/bdf01b95c10ec63134a55446f287c172/e0d28/email-forms-logic.png 689w&quot; sizes=&quot;(max-width: 689px) 100vw, 689px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The first rule says that if the respondent has selected either “Generative AI” or “Prompt Engineering” for the Sessions question, the email should be sent to &lt;code class=&quot;language-text&quot;&gt;peter@example.com&lt;/code&gt;. We thus choose “Any of” as the condition and add the two session options in the condition separated by a comma.&lt;/p&gt;
&lt;p&gt;Similarly, if the respondent has selected “The future of AI” as the session, the email should be sent to &lt;code class=&quot;language-text&quot;&gt;kiran@example&lt;/code&gt;. For all other sessions, the email should be sent to &lt;code class=&quot;language-text&quot;&gt;angus@example.com&lt;/code&gt; so we’ll put that email address in the “No Match Found” section.&lt;/p&gt;
&lt;p&gt;You can also customize the email message that is sent to the respondents. The email message can include individual form answers, images, &lt;a href=&quot;https://digitalinspiration.com/docs/form-notifications/barcode-qrcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;QR Codes&lt;/a&gt; and even files from &lt;a href=&quot;https://digitalinspiration.com/docs/form-notifications/send-file-attachments&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Drive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:683px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/c941311b4c918e4a46cd61479714a079/08552/2023-11-04-12-25-10.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Email Template&quot; title=&quot;Email Template&quot; src=&quot;/static/c941311b4c918e4a46cd61479714a079/08552/2023-11-04-12-25-10.png&quot; srcset=&quot;/static/c941311b4c918e4a46cd61479714a079/96042/2023-11-04-12-25-10.png 180w,/static/c941311b4c918e4a46cd61479714a079/7a322/2023-11-04-12-25-10.png 360w,/static/c941311b4c918e4a46cd61479714a079/08552/2023-11-04-12-25-10.png 683w&quot; sizes=&quot;(max-width: 683px) 100vw, 683px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:50%;position:relative;height:0;overflow:hidden;margin-bottom:1.0725rem&quot;&gt;
&lt;div class=&quot;embedVideo-container&quot;&gt;&lt;iframe title=&quot;&quot; src=&quot;https://www.youtube-nocookie.com/embed/5RFZ16ybdaI?rel=0&quot; class=&quot;embedVideo-iframe&quot; style=&quot;border:0;position:absolute;top:0;left:0;width:100%;height:100%&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;allowfullscreen&quot; sandbox=&quot;allow-same-origin allow-scripts allow-popups&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/xOJLngi&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/8234168112567579974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/11/conditional-email-notifications-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8234168112567579974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8234168112567579974'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/11/conditional-email-notifications-with.html' title='Conditional Email Notifications with Google Forms - Route Responses to Different Email Addresses'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-4023886175534101442</id><published>2023-11-02T04:09:00.001-07:00</published><updated>2023-11-02T04:09:14.977-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Save Password Protected PDF Attachments from Gmail to Google Drive</title><content type='html'>&lt;p&gt;Credit card companies and banks often send their financial statements in the form of password-protected PDF files. These PDF attachments may be encrypted with passwords derived from the last four digits of your Social Security number, your birthdate, or any unique combination.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/81017830f987f9ecbab0620d3dca3a80/05d3a/pdf-bank-statment.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Password protected PDF Attachment in Gmail&quot; title=&quot;Password protected PDF Attachment in Gmail&quot; src=&quot;/static/81017830f987f9ecbab0620d3dca3a80/16546/pdf-bank-statment.png&quot; srcset=&quot;/static/81017830f987f9ecbab0620d3dca3a80/96042/pdf-bank-statment.png 180w,/static/81017830f987f9ecbab0620d3dca3a80/7a322/pdf-bank-statment.png 360w,/static/81017830f987f9ecbab0620d3dca3a80/16546/pdf-bank-statment.png 720w,/static/81017830f987f9ecbab0620d3dca3a80/05d3a/pdf-bank-statment.png 1006w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you are to open these password-protected PDF files, you’ll have to enter the password every time. You can permanently &lt;a href=&quot;/software/remove-pdf-password/20017&quot;&gt;remove passwords from PDF files using Google Chrome&lt;/a&gt; but that’s a manual and time-consuming process especially if you have a large number of password-protected PDF attachments in your Gmail inbox.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important Note&lt;/strong&gt; - This tutorial will only help you decrypt password-protected PDF files for which you know the password. You cannot use this method to unlock PDF files where you don’t know the password.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Imagine the convenience of having an automated method to download all your password-protected PDF attachments from Gmail directly to Google Drive as unencrypted PDF documents. This would completely eliminate the need to enter passwords to view your PDF files. The other advantage is that your &lt;strong&gt;PDF files will become searchable&lt;/strong&gt; in Google Drive.&lt;/p&gt;
&lt;h2 id=&quot;save-password-protected-pdf-files-to-google-drive&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#save-password-protected-pdf-files-to-google-drive&quot; aria-label=&quot;save password protected pdf files to google drive permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Save Password Protected PDF Files to Google Drive&lt;/h2&gt;
&lt;p&gt;We’ll use the &lt;a href=&quot;https://workspace.google.com/marketplace/app/save_emails_and_attachments/513239564707&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Gmail to Google Drive&lt;/a&gt; add-on for Google Sheets to automatically download password-protected PDF attachments from Gmail to Google Drive.&lt;/p&gt;
&lt;h3 id=&quot;1-build-the-gmail-search-query&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#1-build-the-gmail-search-query&quot; aria-label=&quot;1 build the gmail search query permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;1. Build the Gmail Search Query&lt;/h3&gt;
&lt;p&gt;After the addon is installed, go your &lt;code class=&quot;language-text&quot;&gt;sheet.new&lt;/code&gt; in the browser and choose &lt;code class=&quot;language-text&quot;&gt;Extensions &amp;gt; Save Emails and Attachments &amp;gt; Open App&lt;/code&gt;. Create a new workflow and provide the Gmail search query that will help you find all the password-protected PDF files in your Gmail mailbox.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/06792f73a0a61b5ccf9658795ce3a81d/f778e/gmail-pdf-search.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Gmail Search for PDF attachments from Bank&quot; title=&quot;Gmail Search for PDF attachments from Bank&quot; src=&quot;/static/06792f73a0a61b5ccf9658795ce3a81d/16546/gmail-pdf-search.png&quot; srcset=&quot;/static/06792f73a0a61b5ccf9658795ce3a81d/96042/gmail-pdf-search.png 180w,/static/06792f73a0a61b5ccf9658795ce3a81d/7a322/gmail-pdf-search.png 360w,/static/06792f73a0a61b5ccf9658795ce3a81d/16546/gmail-pdf-search.png 720w,/static/06792f73a0a61b5ccf9658795ce3a81d/f778e/gmail-pdf-search.png 788w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;/gmail-search-4355&quot;&gt;search query&lt;/a&gt; can be of the form &lt;code class=&quot;language-text&quot;&gt;filename:pdf has:attachment from:bank.com&lt;/code&gt; where you can replace &lt;code class=&quot;language-text&quot;&gt;bank&lt;/code&gt; with the name of your bank or credit card company.&lt;/p&gt;
&lt;h3 id=&quot;2-choose-the-google-drive-folder&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#2-choose-the-google-drive-folder&quot; aria-label=&quot;2 choose the google drive folder permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;2. Choose the Google Drive Folder&lt;/h3&gt;
&lt;p&gt;On the next screen, select the &lt;a href=&quot;https://digitalinspiration.com/docs/save-emails/guide/google-drive-folders&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;folder in your Google Drive&lt;/a&gt; where you wish to save the decrypted PDF files. You can also choose to save the PDF files in a sub-folder of your Google Drive or even &lt;a href=&quot;https://digitalinspiration.com/docs/save-emails/download-in-shared-drives&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Shared Drives&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In our example, we have set the sub-folder for downloading emails as &lt;code class=&quot;language-text&quot;&gt;/ / /&lt;/code&gt; so the PDF files would be saved in a folder structure like &lt;code class=&quot;language-text&quot;&gt;bank.com/2024/01/15&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/77b109aaa11edc3304c00496c43091d6/f778e/gmail-save-in-drive.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Gmail Save folder&quot; title=&quot;Gmail Save folder&quot; src=&quot;/static/77b109aaa11edc3304c00496c43091d6/16546/gmail-save-in-drive.png&quot; srcset=&quot;/static/77b109aaa11edc3304c00496c43091d6/96042/gmail-save-in-drive.png 180w,/static/77b109aaa11edc3304c00496c43091d6/7a322/gmail-save-in-drive.png 360w,/static/77b109aaa11edc3304c00496c43091d6/16546/gmail-save-in-drive.png 720w,/static/77b109aaa11edc3304c00496c43091d6/f778e/gmail-save-in-drive.png 788w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-unencrypt-pdf-attachments&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#3-unencrypt-pdf-attachments&quot; aria-label=&quot;3 unencrypt pdf attachments permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;3. Unencrypt PDF Attachments&lt;/h3&gt;
&lt;p&gt;On the next screen, enable the option that says &lt;strong&gt;Save Attachments&lt;/strong&gt; and choose &lt;code class=&quot;language-text&quot;&gt;PDF&lt;/code&gt; for the Allow file extensions list. Thus, only PDF files will be saved to Google Drive and all other email attachments will be ignored.&lt;/p&gt;
&lt;p&gt;Next, enable the option that says &lt;strong&gt;Save PDF Attachments without password&lt;/strong&gt; and provide the password that you use to open the PDF files. This is the password that you would normally enter when opening the PDF files in Adobe Acrobat or Google Chrome.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/97c28d0159954e62a900c574547bca3d/f778e/decrypt-pdf-files.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Decrypt PDF files&quot; title=&quot;Decrypt PDF files&quot; src=&quot;/static/97c28d0159954e62a900c574547bca3d/16546/decrypt-pdf-files.png&quot; srcset=&quot;/static/97c28d0159954e62a900c574547bca3d/96042/decrypt-pdf-files.png 180w,/static/97c28d0159954e62a900c574547bca3d/7a322/decrypt-pdf-files.png 360w,/static/97c28d0159954e62a900c574547bca3d/16546/decrypt-pdf-files.png 720w,/static/97c28d0159954e62a900c574547bca3d/f778e/decrypt-pdf-files.png 788w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;That’s it. Click the &lt;strong&gt;Save&lt;/strong&gt; button to create the workflow and the add-on will now run in the background and save all your password-protected PDF attachments from Gmail to Google Drive as decrypted PDF files that can be opened without entering the password.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:50%;position:relative;height:0;overflow:hidden;margin-bottom:1.0725rem&quot;&gt;
&lt;div class=&quot;embedVideo-container&quot;&gt;&lt;iframe title=&quot;&quot; src=&quot;https://www.youtube-nocookie.com/embed/_iq-DFdR4r8?rel=0&quot; class=&quot;embedVideo-iframe&quot; style=&quot;border:0;position:absolute;top:0;left:0;width:100%;height:100%&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;allowfullscreen&quot; sandbox=&quot;allow-same-origin allow-scripts allow-popups&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/C5y4PjS&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/4023886175534101442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/11/how-to-save-password-protected-pdf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/4023886175534101442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/4023886175534101442'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/11/how-to-save-password-protected-pdf.html' title='How to Save Password Protected PDF Attachments from Gmail to Google Drive'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-1763251716988422851</id><published>2023-10-26T00:08:00.001-07:00</published><updated>2023-10-26T00:08:57.402-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Send Base64 Images in Email with Google Apps Script</title><content type='html'>&lt;p&gt;Base64-encoded images can be embedded directly inside HTML emails without having to host the image on a remote server. This offers several advantages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Avoids tracking - External images are often used by email marketers to &lt;a href=&quot;https://digitalinspiration.com/docs/mail-merge/email-open-tracking&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;track email opens&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Reduced spam potential - Some email servers may reject emails that contain external images.&lt;/li&gt;
&lt;li&gt;No broken images - If the image is hosted on a remote server, it may not load if the server is down.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Gmail, however, does not support base64 images in HTML emails. If you try to send an email with base64 images to a Gmail or Google Workspace account, the image will not be displayed in the email body but will be displayed as an attachment instead.&lt;/p&gt;
&lt;p&gt;The workaround is to convert the base64 image to a blob and then embed the blob in the email. We use a similar technique to embed base64 encoded images in emails sent from &lt;a href=&quot;https://digitalinspiration.com/docs/mail-merge&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Mail Merge&lt;/a&gt; and &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/google-sheets/automated-mail-merge&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Document Studio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following Google Apps Script function will convert all base64 images in an HTML email to blobs and then send the email using the Gmail service.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// The original HtmlMessage may contain base64 images in the &amp;lt;img&amp;gt; tags.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;img src=&quot;data:image/png;base64,R0lGODlhQABAAMQAAJSWl...&quot; /&amp;gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;sendEmailWithGmail&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; to&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subject&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; htmlMessage &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; htmlBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; htmlMessage&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; inlineImages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Find all base64 image tags in the html message.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; base64ImageTags &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; htmlBody&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&amp;lt;img src=&quot;data:image\/(png|jpeg|gif);base64,([^&quot;]+)&quot;[^&amp;gt;]*&amp;gt;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;gm&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  base64ImageTags&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;base64ImageTag&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Extract the base64-encoded image data from the tag.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; format&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; base64Data&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; base64ImageTag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;data:image\/(png|jpeg|gif);base64,([^&quot;]+)&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Convert the base64 data to binary.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; imageByte &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Utilities&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;base64Decode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;base64Data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Create a blob containing the image data.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; imageName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Utilities&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUuid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; imageBlob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Utilities&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newBlob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;imageByte&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;image/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;format&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; imageName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Replace the base64 image tag with cid: image tag.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; newImageTag &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; base64ImageTag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;src=&quot;[^&quot;]+&quot;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;src=&quot;cid:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;imageName&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    htmlBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; htmlBody&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;base64ImageTag&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newImageTag&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    inlineImages&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;imageName&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; imageBlob&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  MailApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; to&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; subject&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;htmlBody&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; htmlBody&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;inlineImages&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; inlineImages&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Also see: &lt;a href=&quot;/google-api-service-account-220405&quot;&gt;Send Emails with Gmail API&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/vgt0JoP&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/1763251716988422851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/10/how-to-send-base64-images-in-email-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1763251716988422851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1763251716988422851'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/10/how-to-send-base64-images-in-email-with.html' title='How to Send Base64 Images in Email with Google Apps Script'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-149929500538992926</id><published>2023-10-25T02:08:00.001-07:00</published><updated>2023-10-25T02:08:20.660-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>Monitor Your Stock Portfolio with Google Sheets and Receive Daily Email Reports</title><content type='html'>&lt;p&gt;I have a &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1htgOW97N85pcD0zFnlT7VdOS7sqH0yzz9b2I8nq1Gp4/edit#gid=1233054202&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Stock tracker spreadsheet&lt;/a&gt; built inside Google Sheets that keeps track of my fictional stock portfolio. The stock prices in the Google Sheet are updated automatically using the &lt;a href=&quot;https://support.google.com/docs/answer/3093281?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;GOOGLEFINANCE function&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/57ea05fc2b6209db9a1b403787406127/95ba4/2023-10-25-13-23-50.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Monitor Stocks in Google Sheets&quot; title=&quot;Monitor Stocks in Google Sheets&quot; src=&quot;/static/57ea05fc2b6209db9a1b403787406127/16546/2023-10-25-13-23-50.png&quot; srcset=&quot;/static/57ea05fc2b6209db9a1b403787406127/96042/2023-10-25-13-23-50.png 180w,/static/57ea05fc2b6209db9a1b403787406127/7a322/2023-10-25-13-23-50.png 360w,/static/57ea05fc2b6209db9a1b403787406127/16546/2023-10-25-13-23-50.png 720w,/static/57ea05fc2b6209db9a1b403787406127/95ba4/2023-10-25-13-23-50.png 1023w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I would like to set up a daily trigger that runs every day at, say 4pm, and sends me an email with the screenshot of the spreadsheet. This way I can keep track the performance of my stocks without having to open the spreadsheet every day. Let’s see how this process can be easily automated with the help of &lt;a href=&quot;https://workspace.google.com/marketplace/app/email_spreadsheets/431723916752&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Email Google Sheets&lt;/a&gt; add-on.&lt;/p&gt;
&lt;p&gt;Inside your Google Sheet, go to Extensions &amp;gt; Email Google Sheets &amp;gt; Open to launch the app. Click on the &lt;strong&gt;Create Workflow&lt;/strong&gt; button to create a new automation workflow that will send you an email with the screenshot of the spreadsheet.&lt;/p&gt;
&lt;p&gt;Go to the Email step of the workflow and put the email address of the recipients in the To, Cc and Bcc fields. You can then add a custom subject and message in the email to include values from the spreadsheet.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/4b61300acc3a91edd4447b874f2d6365/c5b3e/2023-10-25-13-41-20.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Email Spreadsheet&quot; title=&quot;Email Spreadsheet&quot; src=&quot;/static/4b61300acc3a91edd4447b874f2d6365/16546/2023-10-25-13-41-20.png&quot; srcset=&quot;/static/4b61300acc3a91edd4447b874f2d6365/96042/2023-10-25-13-41-20.png 180w,/static/4b61300acc3a91edd4447b874f2d6365/7a322/2023-10-25-13-41-20.png 360w,/static/4b61300acc3a91edd4447b874f2d6365/16546/2023-10-25-13-41-20.png 720w,/static/4b61300acc3a91edd4447b874f2d6365/c5b3e/2023-10-25-13-41-20.png 848w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For example, in our workflow, the subject line says &lt;code class=&quot;language-text&quot;&gt;The portfolio value on is&lt;/code&gt; which will be replaced by the current date and the value of the cell B5 in the Watchlist sheet.&lt;/p&gt;
&lt;p&gt;The message body of the email includes which will be replaced by the cell range B7:I16 in the Watchlist sheet. All the formatting of the cells will be preserved in the email. You can click the &lt;code class=&quot;language-text&quot;&gt;Markers&lt;/code&gt; button to see the list of all the &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/markers&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;available markers&lt;/a&gt; that you can use in the email.&lt;/p&gt;
&lt;p&gt;Once the message is ready, click the &lt;strong&gt;Preview&lt;/strong&gt; button to send a test email to yourself.&lt;/p&gt;
&lt;p&gt;Here’s what the email looks like in my Gmail inbox. All the formatting of the cells is preserved in the email. If you prefix the marker with &lt;code class=&quot;language-text&quot;&gt;Image:&lt;/code&gt;, the marker will be replaced by a high-resolution &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/screenshots&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;screenshot image of the cell range&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/5cf55cef3815b4de5ab442ed95f05e9b/e42cc/2023-10-25-13-47-16.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Embed Email in Google Sheets&quot; title=&quot;Embed Email in Google Sheets&quot; src=&quot;/static/5cf55cef3815b4de5ab442ed95f05e9b/16546/2023-10-25-13-47-16.png&quot; srcset=&quot;/static/5cf55cef3815b4de5ab442ed95f05e9b/96042/2023-10-25-13-47-16.png 180w,/static/5cf55cef3815b4de5ab442ed95f05e9b/7a322/2023-10-25-13-47-16.png 360w,/static/5cf55cef3815b4de5ab442ed95f05e9b/16546/2023-10-25-13-47-16.png 720w,/static/5cf55cef3815b4de5ab442ed95f05e9b/e42cc/2023-10-25-13-47-16.png 1043w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If everything looks good, click the &lt;strong&gt;Continue&lt;/strong&gt; button to move to the next step. Here you can choose the frequency of the workflow. You can set it to run daily, weekly, monthly or even on a custom schedule.&lt;/p&gt;
&lt;p&gt;That’s it. Your workflow is now set up and will run automatically around the time you have specified.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/d6b8b459f4716468623bacc684379e6c/c3665/2023-10-25-13-53-47.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Email Schedule Builder&quot; title=&quot;Email Schedule Builder&quot; src=&quot;/static/d6b8b459f4716468623bacc684379e6c/16546/2023-10-25-13-53-47.png&quot; srcset=&quot;/static/d6b8b459f4716468623bacc684379e6c/96042/2023-10-25-13-53-47.png 180w,/static/d6b8b459f4716468623bacc684379e6c/7a322/2023-10-25-13-53-47.png 360w,/static/d6b8b459f4716468623bacc684379e6c/16546/2023-10-25-13-53-47.png 720w,/static/d6b8b459f4716468623bacc684379e6c/c3665/2023-10-25-13-53-47.png 814w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Also see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://workspace.google.com/marketplace/app/email_spreadsheets/431723916752&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Install Email Google Spreadsheets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/embed-google-charts&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;How to Email Charts in Google Sheets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/timeline&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;How to Email Timelines in Google Sheets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:50%;position:relative;height:0;overflow:hidden;margin-bottom:1.0725rem&quot;&gt;
&lt;div class=&quot;embedVideo-container&quot;&gt;&lt;iframe title=&quot;&quot; src=&quot;https://www.youtube-nocookie.com/embed/VdltCyeyV1E?rel=0&quot; class=&quot;embedVideo-iframe&quot; style=&quot;border:0;position:absolute;top:0;left:0;width:100%;height:100%&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;allowfullscreen&quot; sandbox=&quot;allow-same-origin allow-scripts allow-popups&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/gLpSNlF&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/149929500538992926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/10/monitor-your-stock-portfolio-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/149929500538992926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/149929500538992926'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/10/monitor-your-stock-portfolio-with.html' title='Monitor Your Stock Portfolio with Google Sheets and Receive Daily Email Reports'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-1725213003704057763</id><published>2023-09-20T01:08:00.001-07:00</published><updated>2023-09-20T01:08:30.376-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Mail Merge with Outlook and Google Sheets</title><content type='html'>&lt;p&gt;The &lt;a href=&quot;https://workspace.google.com/marketplace/app/mail_merge_with_attachments/223404411203&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Mail merge&lt;/a&gt; add-on for Gmail lets you send personalized emails to your contacts in bulk. You can pull &lt;a href=&quot;https://digitalinspiration.com/docs/mail-merge/attachments&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;file attachments&lt;/a&gt; from Google Drive and include them in the outgoing emails. The emails can be sent immediately or &lt;a href=&quot;https://digitalinspiration.com/docs/mail-merge/schedule-emails&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;scheduled&lt;/a&gt; for sending at a later date and time.&lt;/p&gt;
&lt;p&gt;If you are an Outlook or Microsoft 365 user, you can still use Google Sheets to send personalized emails to multiple people at once with the help of Mail Merge. All you have to do is add your Outlook account to &lt;a href=&quot;https://digitalinspiration.com/docs/mail-merge/email-alias&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Gmail as an alias&lt;/a&gt; and the Mail Merge add-on will be able to send emails through your Outlook account.&lt;/p&gt;
&lt;h2 id=&quot;generate-an-app-password-for-outlook&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#generate-an-app-password-for-outlook&quot; aria-label=&quot;generate an app password for outlook permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Generate an App Password for Outlook&lt;/h2&gt;
&lt;p&gt;The first step is to generate an app password for your Outlook / Microsoft 365 account.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://account.microsoft.com/security&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;account.microsoft.com/security&lt;/a&gt;, sign-in with your Outlook account and choose &lt;strong&gt;Advanced security options&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;App passwords&lt;/strong&gt; section and click &lt;strong&gt;Create a new app password&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/93d4a8d41e74e8e7863ec8844647eba5/4427f/2023-09-19-11-41-45.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Outlook App Password&quot; title=&quot;Outlook App Password&quot; src=&quot;/static/93d4a8d41e74e8e7863ec8844647eba5/16546/2023-09-19-11-41-45.png&quot; srcset=&quot;/static/93d4a8d41e74e8e7863ec8844647eba5/96042/2023-09-19-11-41-45.png 180w,/static/93d4a8d41e74e8e7863ec8844647eba5/7a322/2023-09-19-11-41-45.png 360w,/static/93d4a8d41e74e8e7863ec8844647eba5/16546/2023-09-19-11-41-45.png 720w,/static/93d4a8d41e74e8e7863ec8844647eba5/4427f/2023-09-19-11-41-45.png 783w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;add-your-outlook-account-to-gmail&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#add-your-outlook-account-to-gmail&quot; aria-label=&quot;add your outlook account to gmail permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Add your Outlook Account to Gmail&lt;/h2&gt;
&lt;p&gt;Go to your Gmail account and choose &lt;strong&gt;Settings&lt;/strong&gt; from the gear icon. Switch to the &lt;strong&gt;Accounts&lt;/strong&gt; tab and choose &lt;strong&gt;Add another email address&lt;/strong&gt; under the &lt;strong&gt;Send mail as&lt;/strong&gt; section.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/985f726869f8e3c104797baf5df8d992/385f2/2023-09-19-11-46-06.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Add another email address&quot; title=&quot;Add another email address&quot; src=&quot;/static/985f726869f8e3c104797baf5df8d992/16546/2023-09-19-11-46-06.png&quot; srcset=&quot;/static/985f726869f8e3c104797baf5df8d992/96042/2023-09-19-11-46-06.png 180w,/static/985f726869f8e3c104797baf5df8d992/7a322/2023-09-19-11-46-06.png 360w,/static/985f726869f8e3c104797baf5df8d992/16546/2023-09-19-11-46-06.png 720w,/static/985f726869f8e3c104797baf5df8d992/385f2/2023-09-19-11-46-06.png 900w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You can now add your Outlook account as an alias in Gmail. Enter your name and Outlook email address and click &lt;strong&gt;Next Step&lt;/strong&gt;. Make sure you choose &lt;strong&gt;Treat as an alias&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;On the next screen, enter the following details:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token constant&quot;&gt;SMTP&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;Server&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; smtp&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;mail&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;outlook&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com
&lt;span class=&quot;token literal-property property&quot;&gt;Port&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;587&lt;/span&gt;
&lt;span class=&quot;token literal-property property&quot;&gt;Username&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Your Outlook email address
&lt;span class=&quot;token literal-property property&quot;&gt;Password&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; The app password you generated earlier&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/689fe8948ef35225ad3b8b13e595ab7a/06dbc/2023-09-19-11-49-55.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Add Outlook SMTP Server&quot; title=&quot;Add Outlook SMTP Server&quot; src=&quot;/static/689fe8948ef35225ad3b8b13e595ab7a/16546/2023-09-19-11-49-55.png&quot; srcset=&quot;/static/689fe8948ef35225ad3b8b13e595ab7a/96042/2023-09-19-11-49-55.png 180w,/static/689fe8948ef35225ad3b8b13e595ab7a/7a322/2023-09-19-11-49-55.png 360w,/static/689fe8948ef35225ad3b8b13e595ab7a/16546/2023-09-19-11-49-55.png 720w,/static/689fe8948ef35225ad3b8b13e595ab7a/06dbc/2023-09-19-11-49-55.png 885w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;strong&gt;Add Account&lt;/strong&gt; and Gmail will send a verification code to your Outlook email from &lt;code class=&quot;language-text&quot;&gt;noreply@google.com&lt;/code&gt;. Enter the code in Gmail and your Outlook account will be added as an alias in Gmail.&lt;/p&gt;
&lt;h2 id=&quot;sending-email-with-outlook-in-mail-merge&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#sending-email-with-outlook-in-mail-merge&quot; aria-label=&quot;sending email with outlook in mail merge permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Sending Email with Outlook in Mail merge&lt;/h2&gt;
&lt;p&gt;Now that you have added the Outlook email address as an alias in your Google account, go to &lt;code class=&quot;language-text&quot;&gt;sheets.new&lt;/code&gt; to open a new Google Spreadsheet and &lt;a href=&quot;https://www.youtube.com/watch?v=ChGBcFtYdVA&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;configure Mail merge&lt;/a&gt;. You will now be able to send emails from your Outlook account through the Mail Merge add-on.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/cbd1faa328cde1709c229ec62cb53a2b/e21f2/2023-09-19-12-14-51.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Mail merge with Outlook&quot; title=&quot;Mail merge with Outlook&quot; src=&quot;/static/cbd1faa328cde1709c229ec62cb53a2b/16546/2023-09-19-12-14-51.png&quot; srcset=&quot;/static/cbd1faa328cde1709c229ec62cb53a2b/96042/2023-09-19-12-14-51.png 180w,/static/cbd1faa328cde1709c229ec62cb53a2b/7a322/2023-09-19-12-14-51.png 360w,/static/cbd1faa328cde1709c229ec62cb53a2b/16546/2023-09-19-12-14-51.png 720w,/static/cbd1faa328cde1709c229ec62cb53a2b/6d80e/2023-09-19-12-14-51.png 1080w,/static/cbd1faa328cde1709c229ec62cb53a2b/e21f2/2023-09-19-12-14-51.png 1087w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/WNCa1RI&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/1725213003704057763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-mail-merge-with-outlook-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1725213003704057763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1725213003704057763'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-mail-merge-with-outlook-and.html' title='How to Mail Merge with Outlook and Google Sheets'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-8305094605119985322</id><published>2023-09-13T01:07:00.001-07:00</published><updated>2023-09-13T01:07:08.199-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Extract Images from Google Docs and Google Slides</title><content type='html'>&lt;p&gt;Imagine you’re working with a lengthy Google Document, or a Google Slides presentation, and you need to extract all the embedded images from the text and save them as individual files.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/b3635022d5a98dd0b2106e7a357c3977/95ba4/2023-09-13-12-48-34.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Extract Images in Google Docs&quot; title=&quot;Extract Images in Google Docs&quot; src=&quot;/static/b3635022d5a98dd0b2106e7a357c3977/16546/2023-09-13-12-48-34.png&quot; srcset=&quot;/static/b3635022d5a98dd0b2106e7a357c3977/96042/2023-09-13-12-48-34.png 180w,/static/b3635022d5a98dd0b2106e7a357c3977/7a322/2023-09-13-12-48-34.png 360w,/static/b3635022d5a98dd0b2106e7a357c3977/16546/2023-09-13-12-48-34.png 720w,/static/b3635022d5a98dd0b2106e7a357c3977/95ba4/2023-09-13-12-48-34.png 1023w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;extract-individual-images&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#extract-individual-images&quot; aria-label=&quot;extract individual images permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Extract Individual Images&lt;/h2&gt;
&lt;p&gt;A simple solution to address this issue is as follows: convert your Google Document or Google Slide into a web page. Here’s how you can do it:&lt;/p&gt;
&lt;p&gt;Go to the “File” menu. Select the “Share” submenu and then choose “Publish to Web.” It will generate a public web page that contains all the images from your document or slide. You can simply right-click an image on the page and select the “Save Image” option download it to your local disk.&lt;/p&gt;
&lt;p&gt;What we have just discussed is a manual process but we can easily automate this with the help of Google Apps Script.&lt;/p&gt;
&lt;h2 id=&quot;extract-all-images-from-a-google-document&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#extract-all-images-from-a-google-document&quot; aria-label=&quot;extract all images from a google document permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Extract all Images from a Google Document&lt;/h2&gt;
&lt;p&gt;Open your Google Document containing the images, go to the Extensions menu and choose Apps Script. Copy-paste the code below and run the &lt;code class=&quot;language-text&quot;&gt;saveGoogleDocsImages&lt;/code&gt; function to download all images to a specific folder in your Google Drive.&lt;/p&gt;
&lt;p&gt;The images are sequentially numbered and the file extension is the same as that of the embedded inline image.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;saveGoogleDocsImages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Define the folder name where the extracted images will be saved&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; folderName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Document Images&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Check if a folder with the specified name already exists&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; folders &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DriveApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFoldersByName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;folderName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// If the folder exists, use it; otherwise, create a new folder&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; folder &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; folders&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasNext&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; folders&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; DriveApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createFolder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;folderName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Get all the images in the document&#39;s body and loop through each image&lt;/span&gt;
  DocumentApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getActiveDocument&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getImages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;image&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// Get the image data as a Blob&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; blob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; image&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBlob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Extract the file extension from the Blob&#39;s content type (e.g., &#39;jpeg&#39;, &#39;png&#39;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fileExtension&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; blob&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContentType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Generate a unique file name for each image based on its position in the document&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fileName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Image #&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;index &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;fileExtension&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Set the Blob&#39;s name to the generated file name&lt;/span&gt;
      blob&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fileName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Create a new file in the specified folder with the image data&lt;/span&gt;
      folder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;blob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Log a message indicating that the image has been saved&lt;/span&gt;
      Logger&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Saved &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;fileName&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;extract-all-images-from-google-slides&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#extract-all-images-from-google-slides&quot; aria-label=&quot;extract all images from google slides permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Extract all Images from Google Slides&lt;/h2&gt;
&lt;p&gt;The Apps Script code to download images from a Google Slides presentation is similar. The function iterates over the slides in the presentation and then for each slide, the function iterates over the images in that slide.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;extractImagesFromSlides&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Define the folder name where the extracted images will be saved&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; folderName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Presentation Images&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Check if a folder with the specified name already exists&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; folders &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DriveApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFoldersByName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;folderName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// If the folder exists, use it; otherwise, create a new folder&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; folder &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; folders&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasNext&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; folders&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; DriveApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createFolder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;folderName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Iterate through each slide in the active presentation&lt;/span&gt;
  SlidesApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getActivePresentation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSlides&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;slide&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; slideNumber&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// Retrieve all images on the current slide&lt;/span&gt;
      slide&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getImages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;image&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Get the image data as a Blob&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; blob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; image&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBlob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// Extract the file extension from the Blob&#39;s content type (e.g., &#39;jpeg&#39;, &#39;png&#39;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fileExtension &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; blob&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContentType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fileName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Slide&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;slideNumber &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;_Image&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;index &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;fileExtension&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// Set the Blob&#39;s name to the generated file name&lt;/span&gt;
        blob&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fileName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// Create a new file in the specified folder with the image data&lt;/span&gt;
        folder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;blob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        Logger&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Saved &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;fileName&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/x9BfLmy&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/8305094605119985322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-extract-images-from-google-docs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8305094605119985322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8305094605119985322'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-extract-images-from-google-docs.html' title='How to Extract Images from Google Docs and Google Slides'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-5826927788948207793</id><published>2023-09-12T05:08:00.001-07:00</published><updated>2023-09-12T05:08:40.328-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Mention Someone in a Slack Message from Google Forms</title><content type='html'>&lt;p&gt;This video tutorial explains how you can automatically &lt;a href=&quot;https://www.youtube.com/watch?v=bNxYYeqxJWI&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;send Slack messages from Google Forms&lt;/a&gt; with the help of &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/google-forms/slack&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Document Studio&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:50%;position:relative;height:0;overflow:hidden;margin-bottom:1.0725rem&quot;&gt;
&lt;div class=&quot;embedVideo-container&quot;&gt;&lt;iframe title=&quot;&quot; src=&quot;https://www.youtube-nocookie.com/embed/bNxYYeqxJWI?rel=0&quot; class=&quot;embedVideo-iframe&quot; style=&quot;border:0;position:absolute;top:0;left:0;width:100%;height:100%&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;allowfullscreen&quot; sandbox=&quot;allow-same-origin allow-scripts allow-popups&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For this example, we have an event registration form created with Google Forms. When a participant completes the form and clicks the submit button, a message is instantly posted in the company’s Slack channel with details of the attendee like their name and email address.&lt;/p&gt;
&lt;p&gt;The Google Form has a “Preferred Location” question as well and based on this answer, a specific member of the team will be tagged or mentioned in the Slack message. For instance, if the attended selects New York as the location in the form, the internal Slack message will tag @Angus since they takes care of New York registrations.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:700px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/f7734660bcc30bc76cfbf19d05657cf6/f6cdf/2023-09-12-13-23-08.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Forms for Slack Message&quot; title=&quot;Google Forms for Slack Message&quot; src=&quot;/static/f7734660bcc30bc76cfbf19d05657cf6/f6cdf/2023-09-12-13-23-08.png&quot; srcset=&quot;/static/f7734660bcc30bc76cfbf19d05657cf6/96042/2023-09-12-13-23-08.png 180w,/static/f7734660bcc30bc76cfbf19d05657cf6/7a322/2023-09-12-13-23-08.png 360w,/static/f7734660bcc30bc76cfbf19d05657cf6/f6cdf/2023-09-12-13-23-08.png 700w&quot; sizes=&quot;(max-width: 700px) 100vw, 700px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;send-slack-messages-on-google-form-submit&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#send-slack-messages-on-google-form-submit&quot; aria-label=&quot;send slack messages on google form submit permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Send Slack Messages on Google Form Submit&lt;/h2&gt;
&lt;p&gt;Go to your Google Form and &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/launch&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;launch Document Studio&lt;/a&gt;. Create a new workflow and add a &lt;code class=&quot;language-text&quot;&gt;Slack&lt;/code&gt; task.&lt;/p&gt;
&lt;p&gt;Connect your Google Account to your Slack account and you’ll be presented with a list of #channels available in the Slack workspace that you have linked with your account.&lt;/p&gt;
&lt;p&gt;Select the relevant Slack channel where you wish to post messages and specify the message template that will be sent to Slack on new form submissions.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/dd51ce4f1477ea102d8772ca6656f35e/dcede/2023-09-12-16-02-27.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Slack Mentions Logic&quot; title=&quot;Slack Mentions Logic&quot; src=&quot;/static/dd51ce4f1477ea102d8772ca6656f35e/16546/2023-09-12-16-02-27.png&quot; srcset=&quot;/static/dd51ce4f1477ea102d8772ca6656f35e/96042/2023-09-12-16-02-27.png 180w,/static/dd51ce4f1477ea102d8772ca6656f35e/7a322/2023-09-12-16-02-27.png 360w,/static/dd51ce4f1477ea102d8772ca6656f35e/16546/2023-09-12-16-02-27.png 720w,/static/dd51ce4f1477ea102d8772ca6656f35e/dcede/2023-09-12-16-02-27.png 781w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The template message includes variables like which will be replaced with the values from the form submission. It also includes a &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/scriptlets&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;scriptlet&lt;/a&gt; to add conditional content in the Slack message.&lt;/p&gt;
&lt;p&gt;The Scriptlet looks at the &lt;code class=&quot;language-text&quot;&gt;Location&lt;/code&gt; entered in the Google Form and, based on the answer, a specific user gets tagged in the Slack message. You can learn more about the &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/scriptlets/template-language-basics&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;syntax of Scriptlets&lt;/a&gt; here.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;🎉 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Attendee Name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; would attend the event from &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Location&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; assign answer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; answer &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;New York&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;@&lt;span class=&quot;token constant&quot;&gt;U08N2HAQTF9&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; elsif answer &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Boston&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;@&lt;span class=&quot;token constant&quot;&gt;U05N6HAQZM1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;@&lt;span class=&quot;token constant&quot;&gt;U09PX8AQLJ1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; endif &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;how-to-mention-a-slack-user&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#how-to-mention-a-slack-user&quot; aria-label=&quot;how to mention a slack user permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;How to @Mention a Slack User&lt;/h3&gt;
&lt;p&gt;Slack assigns a unique ID to each account and we put this ID in the Slack message to mention / tag that user in the message.&lt;/p&gt;
&lt;p&gt;To obtain the User ID of a Slack account, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;code class=&quot;language-text&quot;&gt;slack.com&lt;/code&gt;, navigate to your Slack channel and find any @mention of the user you’re interested in.&lt;/li&gt;
&lt;li&gt;Right-click the @mention, and from the contextual menu, select “Copy link.”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The user link you’ve copied will have the following format:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;labnol.slack.com/team/U05N6HAQZM1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this link, the portion starting with U… represents the User ID of the Slack user.&lt;/p&gt;
&lt;p&gt;If you want to @mention this user in your Slack message, enclose the User ID inside angle brackets and prefix it with the @ symbol, like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;How are you &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;@&lt;span class=&quot;token constant&quot;&gt;UABC123&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; 🎉&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/301273557aa0efce5f5b92a89317597b/32f23/2023-09-12-16-50-28.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Find Slack User ID&quot; title=&quot;Find Slack User ID&quot; src=&quot;/static/301273557aa0efce5f5b92a89317597b/16546/2023-09-12-16-50-28.png&quot; srcset=&quot;/static/301273557aa0efce5f5b92a89317597b/96042/2023-09-12-16-50-28.png 180w,/static/301273557aa0efce5f5b92a89317597b/7a322/2023-09-12-16-50-28.png 360w,/static/301273557aa0efce5f5b92a89317597b/16546/2023-09-12-16-50-28.png 720w,/static/301273557aa0efce5f5b92a89317597b/32f23/2023-09-12-16-50-28.png 740w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/9aXewHc&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/5826927788948207793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-mention-someone-in-slack-message.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/5826927788948207793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/5826927788948207793'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-mention-someone-in-slack-message.html' title='How to Mention Someone in a Slack Message from Google Forms'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-8847290893238823826</id><published>2023-09-02T02:07:00.001-07:00</published><updated>2023-09-02T02:07:54.051-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Use Cron Expressions to Create Time Triggers in Apps Script</title><content type='html'>&lt;p&gt;Cron is a scheduling tool that helps you run tasks at recurring intervals. You use a cron expression to specify the exact timing for your scheduled task. For example, if you want a schedule to run every week day at 8:30 pm, the cron expression would look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt; * * &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-5&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;cron-expressions&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#cron-expressions&quot; aria-label=&quot;cron expressions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Cron Expressions&lt;/h2&gt;
&lt;p&gt;Here are some more practical examples to help you understand the cron expression.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cron Expression&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0 0 * * *&lt;/td&gt;
&lt;td&gt;every day at midnight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0 */2 * * *&lt;/td&gt;
&lt;td&gt;every 2 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0 10 * * FRI,SAT&lt;/td&gt;
&lt;td&gt;every Friday and Saturday at 10 am&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30 9 */15 * *&lt;/td&gt;
&lt;td&gt;at 9:30 am on every 15th day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0 0 1 */3 *&lt;/td&gt;
&lt;td&gt;first day of every quarter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;time-triggers-in-google-apps-script&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#time-triggers-in-google-apps-script&quot; aria-label=&quot;time triggers in google apps script permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Time Triggers in Google Apps Script&lt;/h2&gt;
&lt;p&gt;Google Apps Script supports time-driven triggers to help you run tasks in the background automatically. For instance, you can setup a time trigger in Apps Script to &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;email spreadsheets&lt;/a&gt; every weekday. Or a trigger to &lt;a href=&quot;https://digitalinspiration.com/docs/save-emails&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;download emails&lt;/a&gt; from Gmail to your Google Drive.&lt;/p&gt;
&lt;p&gt;Time-based triggers in Apps Script have certain limitations, particularly when it comes to setting up recurring schedules. For example, if you want to create a simple cron job that runs every weekend at around 3 PM, you’d need to set up two separate triggers like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createTimeTrigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newTrigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;functionName&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;timeBased&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;everyWeeks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onWeekDay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Weekday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SUNDAY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;atHour&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newTrigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;functionName&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;timeBased&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;everyWeeks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onWeekDay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Weekday&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SATURDAY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;atHour&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Managing more complex triggers, like one that runs at 10 PM on the 15th of every alternate month, becomes even more challenging. In contrast, writing a cron expression for this is quite straightforward: &lt;code class=&quot;language-text&quot;&gt;0 22 15 */2 *&lt;/code&gt;. Similarly, creating a time trigger that runs at 10:30 am on the last day of every month would involve much more code that writing a cron expression: &lt;code class=&quot;language-text&quot;&gt;30 10 L * *&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;google-script-meets-cron-expressions&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#google-script-meets-cron-expressions&quot; aria-label=&quot;google script meets cron expressions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Google Script meets Cron Expressions&lt;/h2&gt;
&lt;p&gt;The cron syntax is powerful and supports complicated recurring schedules but, unfortunately, it is not available inside Google Apps Script. But we now have a easy workaround.&lt;/p&gt;
&lt;p&gt;We can write our time trigger schedules in cron expressions directly inside Apps Script.&lt;/p&gt;
&lt;h3 id=&quot;load-the-cron-parser-library&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#load-the-cron-parser-library&quot; aria-label=&quot;load the cron parser library permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Load the Cron Parser Library&lt;/h3&gt;
&lt;p&gt;We will use the popular &lt;code class=&quot;language-text&quot;&gt;croner&lt;/code&gt; library in Apps Script to parse cron expressions and calculate the upcoming schedules.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;loadCronLibrary&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; key &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;croner@7&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://cdn.jsdelivr.net/npm/croner@7/dist/croner.umd.min.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; cache &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; CacheService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getScriptCache&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Check if the library content is already cached&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; cachedContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cache&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cachedContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; cachedContent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Fetch the library content from the specified URL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; libraryContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; UrlFetchApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;muteHttpExceptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContentText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Check if the fetched content contains the word &quot;Cron&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;Cron&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;libraryContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Cache the libary for 6 hours&lt;/span&gt;
    cache&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; libraryContent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; libraryContent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;The cron library is unavailable&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next, we’ll create a function that loads the Cron library and checks if a scheduled task is set to execute within the next 5 minutes. It uses the script’s timezone to compare the dates.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;scheduledFunction&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; cronExpression &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;*/10 * * * *&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;eval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;loadCronLibrary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; job &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Cron&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cronExpression&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; timeDifference &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;job&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nextRun&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timeDifference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    Logger&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Hello, I am running via the time trigger!&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;addTrigger&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newTrigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;scheduledFunction&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;timeBased&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;everyMinutes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;addTrigger&lt;/code&gt; function would create the time trigger that would invoke the &lt;code class=&quot;language-text&quot;&gt;scheduledFunction&lt;/code&gt; every 5 minutes. The cron schedule is checked every 5 minutes, and if it is scheduled to run, the &lt;code class=&quot;language-text&quot;&gt;Hello&lt;/code&gt; message would be logged to the console.&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/5i4KbFj&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/8847290893238823826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-use-cron-expressions-to-create.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8847290893238823826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8847290893238823826'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-use-cron-expressions-to-create.html' title='How to Use Cron Expressions to Create Time Triggers in Apps Script'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-1064267840235910898</id><published>2023-09-01T02:08:00.001-07:00</published><updated>2023-09-01T02:08:04.858-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Enable Duet AI in your Google Workspace</title><content type='html'>&lt;p&gt;Whether you are looking to write emails in Gmail, create tables with custom data in Google Sheets or design a presentation in Google Slides, &lt;a href=&quot;/files/google-duet-ai.pdf&quot;&gt;Duet AI&lt;/a&gt; for Google Workspace can do the work for you in few easy steps.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/7fbf8f34456184c2b38d3db28866530f/due-ai-workspace.gif&quot; alt=&quot;Duet AI - Google Workspace&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-to-enable-duet-ai&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#how-to-enable-duet-ai&quot; aria-label=&quot;how to enable duet ai permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;How to Enable Duet AI&lt;/h2&gt;
&lt;p&gt;Duet AI is now available for Google Workspace but you need to take the following steps to start using the AI capabilities of Duet AI in your Gmail and other Google apps.&lt;/p&gt;
&lt;h3 id=&quot;1-purchase-the-duet-ai-add-on&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#1-purchase-the-duet-ai-add-on&quot; aria-label=&quot;1 purchase the duet ai add on permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;1. Purchase the Duet AI add-on&lt;/h3&gt;
&lt;p&gt;Open &lt;a href=&quot;https://admin.google.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;admin.google.com&lt;/a&gt; and sign in to your Google Workspace account as an administrator. Inside the dashboard, navigate to Billing &amp;gt; Get more services &amp;gt; Google Workspace add-ons.&lt;/p&gt;
&lt;p&gt;Here, look for the &lt;code class=&quot;language-text&quot;&gt;Duet AI for Google Workspace Enterprise&lt;/code&gt; card and cick the &lt;code class=&quot;language-text&quot;&gt;Start Free Trial&lt;/code&gt; link to subscribe to the Duet AI service. You can use the Duet AI add-on without payment for a period of 14 days.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/442634aaecb7a31c0d98fa0c274db2d3/a48d4/2023-09-01-13-17-28.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Duet AI in Google Workspace Admin&quot; title=&quot;Duet AI in Google Workspace Admin&quot; src=&quot;/static/442634aaecb7a31c0d98fa0c274db2d3/16546/2023-09-01-13-17-28.png&quot; srcset=&quot;/static/442634aaecb7a31c0d98fa0c274db2d3/96042/2023-09-01-13-17-28.png 180w,/static/442634aaecb7a31c0d98fa0c274db2d3/7a322/2023-09-01-13-17-28.png 360w,/static/442634aaecb7a31c0d98fa0c274db2d3/16546/2023-09-01-13-17-28.png 720w,/static/442634aaecb7a31c0d98fa0c274db2d3/a48d4/2023-09-01-13-17-28.png 1060w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-assign-duet-ai-licenses&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#2-assign-duet-ai-licenses&quot; aria-label=&quot;2 assign duet ai licenses permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;2. Assign Duet AI licenses&lt;/h3&gt;
&lt;p&gt;Once you’ve successfully activated Duet AI, it’s time to share its benefits with your team. Go to Directory &amp;gt; Users and select one or more users and click &lt;code class=&quot;language-text&quot;&gt;Assign Licenses&lt;/code&gt;. Select &lt;code class=&quot;language-text&quot;&gt;Duet AI for Google Workspace&lt;/code&gt; from the list of available subscription and click &lt;code class=&quot;language-text&quot;&gt;Assign&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:584px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/28945f588e70a5a2b91ebf9518c504c9/0116f/2023-09-01-13-30-55.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Assign Licenses&quot; title=&quot;Assign Licenses&quot; src=&quot;/static/28945f588e70a5a2b91ebf9518c504c9/0116f/2023-09-01-13-30-55.png&quot; srcset=&quot;/static/28945f588e70a5a2b91ebf9518c504c9/96042/2023-09-01-13-30-55.png 180w,/static/28945f588e70a5a2b91ebf9518c504c9/7a322/2023-09-01-13-30-55.png 360w,/static/28945f588e70a5a2b91ebf9518c504c9/0116f/2023-09-01-13-30-55.png 584w&quot; sizes=&quot;(max-width: 584px) 100vw, 584px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Please note that Duet AI is not compatible with Google Workspace Business Starter edition. Additionally, it’s important to ensure that your Workspace users have English set as their preferred language in their Google account settings to access Duet AI.&lt;/p&gt;
&lt;p&gt;You may visit the &lt;a href=&quot;https://support.google.com/a/topic/13853688?hl=en&amp;amp;ref_topic=9197&amp;amp;sjid=5289823534883739421-AP&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Workspace help center&lt;/a&gt; to learn more about Duet AI.&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/d7lNRE1&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/1064267840235910898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-enable-duet-ai-in-your-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1064267840235910898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1064267840235910898'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/09/how-to-enable-duet-ai-in-your-google.html' title='How to Enable Duet AI in your Google Workspace'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-8409503546704558287</id><published>2023-08-28T11:07:00.001-07:00</published><updated>2023-08-28T11:07:39.471-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>Post Google Forms Responses to Discord Channels</title><content type='html'>&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:50%;position:relative;height:0;overflow:hidden;margin-bottom:1.0725rem&quot;&gt;
&lt;div class=&quot;embedVideo-container&quot;&gt;&lt;iframe title=&quot;&quot; src=&quot;https://www.youtube-nocookie.com/embed/jRdgh7uZbQI?rel=0&quot; class=&quot;embedVideo-iframe&quot; style=&quot;border:0;position:absolute;top:0;left:0;width:100%;height:100%&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;allowfullscreen&quot; sandbox=&quot;allow-same-origin allow-scripts allow-popups&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Discord is a popular instant messaging and group-chatting platform, used by millions of people. Notably, it has gained significant traction within colleges and gaming communities. This &lt;a href=&quot;https://www.youtube.com/watch?v=jRdgh7uZbQI&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;tutorial&lt;/a&gt; shows how you can automatically post Google Form responses to a specific Discord channel with the help of &lt;a href=&quot;https://workspace.google.com/marketplace/app/document_studio/429444628321&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Document Studio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/1a61b9b74deb731de07acfd0da2c3f5f/4a8ce/2023-08-28-19-25-37.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Forms to Discord Channel&quot; title=&quot;Google Forms to Discord Channel&quot; src=&quot;/static/1a61b9b74deb731de07acfd0da2c3f5f/16546/2023-08-28-19-25-37.png&quot; srcset=&quot;/static/1a61b9b74deb731de07acfd0da2c3f5f/96042/2023-08-28-19-25-37.png 180w,/static/1a61b9b74deb731de07acfd0da2c3f5f/7a322/2023-08-28-19-25-37.png 360w,/static/1a61b9b74deb731de07acfd0da2c3f5f/16546/2023-08-28-19-25-37.png 720w,/static/1a61b9b74deb731de07acfd0da2c3f5f/6d80e/2023-08-28-19-25-37.png 1080w,/static/1a61b9b74deb731de07acfd0da2c3f5f/843f9/2023-08-28-19-25-37.png 1440w,/static/1a61b9b74deb731de07acfd0da2c3f5f/4a8ce/2023-08-28-19-25-37.png 2832w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;send-google-form-responses-to-discord&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#send-google-form-responses-to-discord&quot; aria-label=&quot;send google form responses to discord permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Send Google Form Responses to Discord&lt;/h2&gt;
&lt;p&gt;Imagine a college Discord server with dedicated #tech and #science channels for different societies. Student volunteers can fill in a Google Form and indicate which society they would like be a part of. When the respondent submits the Google Form, an instant notification is sent to the respective Discord channel.&lt;/p&gt;
&lt;p&gt;To get started, go to the Discord channel where the Google Form notifications should be delivered and click the Settings icon to copy the webhook URL for that channel.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/a74272224bfcf812e0112ca3a6adffc9/c4dec/2023-08-28-19-36-32.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Discord Webhook URL&quot; title=&quot;Discord Webhook URL&quot; src=&quot;/static/a74272224bfcf812e0112ca3a6adffc9/16546/2023-08-28-19-36-32.png&quot; srcset=&quot;/static/a74272224bfcf812e0112ca3a6adffc9/96042/2023-08-28-19-36-32.png 180w,/static/a74272224bfcf812e0112ca3a6adffc9/7a322/2023-08-28-19-36-32.png 360w,/static/a74272224bfcf812e0112ca3a6adffc9/16546/2023-08-28-19-36-32.png 720w,/static/a74272224bfcf812e0112ca3a6adffc9/6d80e/2023-08-28-19-36-32.png 1080w,/static/a74272224bfcf812e0112ca3a6adffc9/843f9/2023-08-28-19-36-32.png 1440w,/static/a74272224bfcf812e0112ca3a6adffc9/c4dec/2023-08-28-19-36-32.png 2464w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Now that you have generated the Discord webhook URL, go to your Google Form and &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/tutorial/create-workflow&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;create a new workflow&lt;/a&gt; in Document Studio. On the Conditions tab, specify the condition &lt;code class=&quot;language-text&quot;&gt;Preferred Society Exactly Match Tech Society&lt;/code&gt; since we want to notify a different Discord channel for each society.&lt;/p&gt;
&lt;p&gt;On the Tasks tab, add the Discord task and add the webhook URL that you’ve generated in the previous step. For the message body, you can use any question title from the Google Form and these will be replaced with actual users submitted by the Google Form respondent.&lt;/p&gt;
&lt;p&gt;Save the workflow and you’ll automatically receive notifications in Discord when the form is submitted.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/a0dc6a3639b322331afce23d013a8e3d/90d6d/2023-08-28-20-36-50.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Forms to Discord Automation&quot; title=&quot;Google Forms to Discord Automation&quot; src=&quot;/static/a0dc6a3639b322331afce23d013a8e3d/16546/2023-08-28-20-36-50.png&quot; srcset=&quot;/static/a0dc6a3639b322331afce23d013a8e3d/96042/2023-08-28-20-36-50.png 180w,/static/a0dc6a3639b322331afce23d013a8e3d/7a322/2023-08-28-20-36-50.png 360w,/static/a0dc6a3639b322331afce23d013a8e3d/16546/2023-08-28-20-36-50.png 720w,/static/a0dc6a3639b322331afce23d013a8e3d/6d80e/2023-08-28-20-36-50.png 1080w,/static/a0dc6a3639b322331afce23d013a8e3d/843f9/2023-08-28-20-36-50.png 1440w,/static/a0dc6a3639b322331afce23d013a8e3d/90d6d/2023-08-28-20-36-50.png 2680w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;post-to-discord-with-apps-script&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#post-to-discord-with-apps-script&quot; aria-label=&quot;post to discord with apps script permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Post to Discord with Apps Script&lt;/h2&gt;
&lt;p&gt;If you are curious to know how these messages are posted to Discord from Google Forms, the answer is Google Apps Script.&lt;/p&gt;
&lt;p&gt;The script will transform the Google Form response into a JSON message and then make an HTTP POST request to the webhook URL to post a message to the Discord channel.&lt;/p&gt;
&lt;p&gt;Here’s a simplified snippet of the script:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;postMessageToDiscord&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;formData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; discordUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://discordapp.com/api/webhooks/labnol/123&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; params &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&#39;Content-Type&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;application/x-www-form-urlencoded&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;POST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; formData &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;muteHttpExceptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; UrlFetchApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;discordUrl&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  Logger&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContentText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Also see: &lt;a href=&quot;https://www.youtube.com/watch?v=bNxYYeqxJWI&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Send Google Forms to Slack&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/c7eS0dQ&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/8409503546704558287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/08/post-google-forms-responses-to-discord.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8409503546704558287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8409503546704558287'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/08/post-google-forms-responses-to-discord.html' title='Post Google Forms Responses to Discord Channels'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-8301055913617283177</id><published>2023-08-26T07:08:00.001-07:00</published><updated>2023-08-26T07:08:45.559-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Enable Push Notifications for File Changes in Google Drive with Apps Script</title><content type='html'>&lt;p&gt;Are you looking for a way to receive notifications in real-time when an important spreadsheet in your Google Drive get modified or is accidently deleted by sometimes? Well, Google Drive offers an API to help you set up a watch on any file in your Google Drive be it a document, presentation or even a PDF file. This means that you can receive instant notifications whenever the content or even &lt;a href=&quot;/internet/google-drive-access/28237/&quot;&gt;permissions&lt;/a&gt; of that file changes.&lt;/p&gt;
&lt;p&gt;This tutorial explains how you can setup watch notifications on any file in your Google Drive with the help of Google Apps Script.&lt;/p&gt;
&lt;h3 id=&quot;setup-a-file-watch-in-google-drive&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#setup-a-file-watch-in-google-drive&quot; aria-label=&quot;setup a file watch in google drive permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Setup a File Watch in Google Drive&lt;/h3&gt;
&lt;p&gt;To get started, type &lt;code class=&quot;language-text&quot;&gt;script.new&lt;/code&gt; in the browser to open the Apps Script editor and add the code below to create a watch. You’d need the unique ID of the Google Drive file and the &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/apps/webhooks&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;webhook URL&lt;/a&gt; where the notifications would be send when the file gets modified.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;API_BASE_URL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://www.googleapis.com/drive/v3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;SUBSCRIPTION_DURATION_MS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 24 hours in milliseconds&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * Starts a subscription for receiving notifications about changes to a Google Drive file.
 *
 * @param {string} fileId - The ID of the file to watch for changes.
 * @param {string} webhookUrl - The URL where notifications will be sent.
 * @returns {void}
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;startSubscription&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;fileId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; webhookUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Prepare the payload for the channel subscription&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; channelPayload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Utilities&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUuid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Generate a unique ID for the channel&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; webhookUrl&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;expiration&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;SUBSCRIPTION_DURATION_MS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;web_hook&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;fileId=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;fileId&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;amp;source=labnol.org&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Construct the API endpoint URL for starting the subscription&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; endPoint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Utilities&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;formatString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;API_BASE_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/files/%s/watch?supportsAllDrives=true&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fileId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Call the Drive API to start the subscription&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; UrlFetchApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;endPoint&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;POST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;contentType&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;application/json&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Bearer &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getOAuthToken&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;channelPayload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Convert payload to JSON string&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Parse the response to extract subscription information&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resourceId &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Store subscription information in script properties&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; subscriptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resourceId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fileId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; webhookUrl &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    PropertiesService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getScriptProperties&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;subscriptions&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscriptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Handle errors that might occur during subscription setup&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Error starting subscription: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;initialize-drive-watch-trigger&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#initialize-drive-watch-trigger&quot; aria-label=&quot;initialize drive watch trigger permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Initialize Drive Watch Trigger&lt;/h3&gt;
&lt;p&gt;By default, a file watch expires in an hour. To extend this duration to 24 hours, we’ll use the SUBSCRIPTION_DURATION_MS variable. Please note that there’s no way to set up an indefinite watch. We’ll thus setup a time-based trigger in Apps Script to automatically renew the watch every 24 hours.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;initializeWatchApp&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fileId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;&amp;lt;Drive File Id&amp;gt;&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; webhookUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://&amp;lt;&amp;lt;Webhook URL&amp;gt;&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;startSubscription&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fileId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; webhookUrl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getProjectTriggers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deleteTrigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;trigger&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newTrigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;triggerRenewSubscription&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;timeBased&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;everyHours&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Used to add the necessary Drive Scope&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; file &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DriveApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFileById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fileId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Push notifications activated for &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;renew-file-watch-automatically&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#renew-file-watch-automatically&quot; aria-label=&quot;renew file watch automatically permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Renew File Watch Automatically&lt;/h2&gt;
&lt;p&gt;The trigger functions manages the process of creating and renewing channel subscriptions for receiving notifications about changes to specific files in Google Drive. It leverages &lt;a href=&quot;/urlfetch/&quot;&gt;UrlFetchApp.fetch&lt;/a&gt; method instead of the &lt;code class=&quot;language-text&quot;&gt;Drive.Files.watch&lt;/code&gt; service since the latter uses the older version v2 of Google Drive API.&lt;/p&gt;
&lt;p&gt;Since we do not want multiple notifications for the same file, we manually stop any existing subscriptions for a file before adding a new watch.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;triggerRenewSubscription&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Retrieve subscription information from script properties&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; PropertiesService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getScriptProperties&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;subscriptions&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; subscriptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; resourceId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fileId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; webhookUrl &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; subscriptions&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Stop the current subscription&lt;/span&gt;
    UrlFetchApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;API_BASE_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/channels/stop&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;POST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;contentType&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;application/json&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Bearer &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;ScriptApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getOAuthToken&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resourceId &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Start a new subscription with the same details&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;startSubscription&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fileId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; webhookUrl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Channel subscription renewed successfully!&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Error renewing subscription: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;handline-watch-notfications&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#handline-watch-notfications&quot; aria-label=&quot;handline watch notfications permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Handline watch notfications&lt;/h3&gt;
&lt;p&gt;You may use a web service like &lt;code class=&quot;language-text&quot;&gt;webhook.site&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;requestbin.com&lt;/code&gt; to test webhook notifications for file changes.&lt;/p&gt;
&lt;p&gt;It is also possible to publish a Google Script as a web app to handle &lt;a href=&quot;/code/19871-get-post-requests-google-script&quot;&gt;POST notifications&lt;/a&gt; from the Drive API but there’s a limitation - Apps Script cannot read the header of an incoming web require and Drive notifications include the data in the &lt;code class=&quot;language-text&quot;&gt;X-Goog-Channel-ID&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;X-Goog-Channel-Token&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;X-Goog-Resource-State&lt;/code&gt; headers of the request.&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/9K3PeA5&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/8301055913617283177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/08/how-to-enable-push-notifications-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8301055913617283177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8301055913617283177'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/08/how-to-enable-push-notifications-for.html' title='How to Enable Push Notifications for File Changes in Google Drive with Apps Script'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-5782422655144680717</id><published>2023-08-07T08:07:00.001-07:00</published><updated>2023-08-07T08:07:55.087-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Create Personalized Images in Bulk with Google Sheets</title><content type='html'>&lt;p&gt;Yesterday marked Friendship Day, and to celebrate, I sent a personalized image to each of my friends via &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/apps/whatsapp&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;WhatsApp&lt;/a&gt;. The images were created in bulk, but each graphic had the person’s name, making the greetings unique and heartfelt.&lt;/p&gt;
&lt;p&gt;To achieve this, I did employ some automation. First, I gathered the names of my friends in a Google Sheet. Then, I designed a graphic template in Canva and &lt;a href=&quot;/import-canva-to-google-slides-220129&quot;&gt;imported the design&lt;/a&gt; in Google Slides. The template had a placeholder - - that would be replaced with actual values from the Google Sheet.&lt;/p&gt;
&lt;h3 id=&quot;the-source-template&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-source-template&quot; aria-label=&quot;the source template permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;The Source Template&lt;/h3&gt;
&lt;p&gt;Here’s the source data and the image template. The placeholder in a graphic was replaced with actual values from the Google Sheet.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/a9dae76831816255ce7b9ba6d0230000/9f465/2023-08-07-18-05-03.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Customer data and image template&quot; title=&quot;Customer data and image template&quot; src=&quot;/static/a9dae76831816255ce7b9ba6d0230000/16546/2023-08-07-18-05-03.png&quot; srcset=&quot;/static/a9dae76831816255ce7b9ba6d0230000/96042/2023-08-07-18-05-03.png 180w,/static/a9dae76831816255ce7b9ba6d0230000/7a322/2023-08-07-18-05-03.png 360w,/static/a9dae76831816255ce7b9ba6d0230000/16546/2023-08-07-18-05-03.png 720w,/static/a9dae76831816255ce7b9ba6d0230000/6d80e/2023-08-07-18-05-03.png 1080w,/static/a9dae76831816255ce7b9ba6d0230000/843f9/2023-08-07-18-05-03.png 1440w,/static/a9dae76831816255ce7b9ba6d0230000/9f465/2023-08-07-18-05-03.png 2168w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-generated-graphic&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-generated-graphic&quot; aria-label=&quot;the generated graphic permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;The Generated Graphic&lt;/h3&gt;
&lt;p&gt;And here is the completed deck in Google Slides, where each slide is generated from individual rows of the Google Sheet. You may notice that the names are distinct on every slide for personalization.&lt;/p&gt;
&lt;p&gt;The best part is that the customization options aren’t just limited to text - you can also add &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/embed/qrcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;unique QR Codes&lt;/a&gt;, &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/embed/images&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;profile pictures&lt;/a&gt; and more for more personalization.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/94a310fd1804d4af2b272284b9b87269/e918e/2023-08-07-18-43-09.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Personalized Graphic Designs&quot; title=&quot;Personalized Graphic Designs&quot; src=&quot;/static/94a310fd1804d4af2b272284b9b87269/16546/2023-08-07-18-43-09.png&quot; srcset=&quot;/static/94a310fd1804d4af2b272284b9b87269/96042/2023-08-07-18-43-09.png 180w,/static/94a310fd1804d4af2b272284b9b87269/7a322/2023-08-07-18-43-09.png 360w,/static/94a310fd1804d4af2b272284b9b87269/16546/2023-08-07-18-43-09.png 720w,/static/94a310fd1804d4af2b272284b9b87269/6d80e/2023-08-07-18-43-09.png 1080w,/static/94a310fd1804d4af2b272284b9b87269/843f9/2023-08-07-18-43-09.png 1440w,/static/94a310fd1804d4af2b272284b9b87269/e918e/2023-08-07-18-43-09.png 3558w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-to-auto-generate-images-in-bulk&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#how-to-auto-generate-images-in-bulk&quot; aria-label=&quot;how to auto generate images in bulk permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;How to Auto-Generate Images in Bulk&lt;/h2&gt;
&lt;p&gt;For those interested in creating personalized images, it’s a simple process.&lt;/p&gt;
&lt;p&gt;Start by creating a template with a single slide in Google Slides, adjusting the deck size to match your desired output image size. Then, populate a Google Sheet with the personalization data. Each row of the sheet will generate a unique image.&lt;/p&gt;
&lt;p&gt;Install the &lt;a href=&quot;https://workspace.google.com/marketplace/app/document_studio/429444628321&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Document Studio&lt;/a&gt; add-on and follow the &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/tutorial&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;getting started guide&lt;/a&gt; to create a new workflow. For this particular task, I selected the &lt;code class=&quot;language-text&quot;&gt;Append (Combine)&lt;/code&gt; task, as it allowed me to generate a combined deck containing all the personalized images.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/961193d3889788fc2cfcd2c5c9d1d265/8d5b7/2023-08-07-19-14-20.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Append Google Slides&quot; title=&quot;Append Google Slides&quot; src=&quot;/static/961193d3889788fc2cfcd2c5c9d1d265/16546/2023-08-07-19-14-20.png&quot; srcset=&quot;/static/961193d3889788fc2cfcd2c5c9d1d265/96042/2023-08-07-19-14-20.png 180w,/static/961193d3889788fc2cfcd2c5c9d1d265/7a322/2023-08-07-19-14-20.png 360w,/static/961193d3889788fc2cfcd2c5c9d1d265/16546/2023-08-07-19-14-20.png 720w,/static/961193d3889788fc2cfcd2c5c9d1d265/6d80e/2023-08-07-19-14-20.png 1080w,/static/961193d3889788fc2cfcd2c5c9d1d265/843f9/2023-08-07-19-14-20.png 1440w,/static/961193d3889788fc2cfcd2c5c9d1d265/8d5b7/2023-08-07-19-14-20.png 2526w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Next, select the Google Slides template from your Google Drive that contains your base design. Document Studio will automatically create a new deck to house your auto-generated designs but you can also pick an existing deck from the target presentation field.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/f21014299a33163a5181d360a6a44516/8d5b7/2023-08-07-19-16-52.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Slides Template&quot; title=&quot;Google Slides Template&quot; src=&quot;/static/f21014299a33163a5181d360a6a44516/16546/2023-08-07-19-16-52.png&quot; srcset=&quot;/static/f21014299a33163a5181d360a6a44516/96042/2023-08-07-19-16-52.png 180w,/static/f21014299a33163a5181d360a6a44516/7a322/2023-08-07-19-16-52.png 360w,/static/f21014299a33163a5181d360a6a44516/16546/2023-08-07-19-16-52.png 720w,/static/f21014299a33163a5181d360a6a44516/6d80e/2023-08-07-19-16-52.png 1080w,/static/f21014299a33163a5181d360a6a44516/843f9/2023-08-07-19-16-52.png 1440w,/static/f21014299a33163a5181d360a6a44516/8d5b7/2023-08-07-19-16-52.png 2526w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Save your workflow and choose the Run option to generate your personalized images. Document Studio will automatically generate images for each row of the spreadsheet, but you also have the option to select rows for which the images should be generated.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/5c144087fdf6eb891ce085ec2fad5af5/8d5b7/2023-08-07-19-20-15.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Create Images from Spreadsheet&quot; title=&quot;Create Images from Spreadsheet&quot; src=&quot;/static/5c144087fdf6eb891ce085ec2fad5af5/16546/2023-08-07-19-20-15.png&quot; srcset=&quot;/static/5c144087fdf6eb891ce085ec2fad5af5/96042/2023-08-07-19-20-15.png 180w,/static/5c144087fdf6eb891ce085ec2fad5af5/7a322/2023-08-07-19-20-15.png 360w,/static/5c144087fdf6eb891ce085ec2fad5af5/16546/2023-08-07-19-20-15.png 720w,/static/5c144087fdf6eb891ce085ec2fad5af5/6d80e/2023-08-07-19-20-15.png 1080w,/static/5c144087fdf6eb891ce085ec2fad5af5/843f9/2023-08-07-19-20-15.png 1440w,/static/5c144087fdf6eb891ce085ec2fad5af5/8d5b7/2023-08-07-19-20-15.png 2526w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Click the &lt;code class=&quot;language-text&quot;&gt;Run workflow&lt;/code&gt; button, and your personalized images will be ready in no time.&lt;/p&gt;
&lt;p&gt;The possibilities are endless. You may use Document Studio to &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/google-forms/certificate-slides&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;create quiz certificates&lt;/a&gt;, &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/google-sheets/create-presentations&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;business cards&lt;/a&gt;, &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/google-sheets/combine-google-slides&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;employee IDs&lt;/a&gt;, &lt;a href=&quot;/place-cards-with-names-220906&quot;&gt;wedding place cards&lt;/a&gt; and other designs that necessitate only minimal text changes.&lt;/p&gt;
&lt;p&gt;Give Document Studio a try and surprise your friends and family with personalized images for any occasion!&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/ti7eHp2&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/5782422655144680717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/08/how-to-create-personalized-images-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/5782422655144680717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/5782422655144680717'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/08/how-to-create-personalized-images-in.html' title='How to Create Personalized Images in Bulk with Google Sheets'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-1270793268737023168</id><published>2023-08-05T06:07:00.001-07:00</published><updated>2023-08-05T06:07:43.841-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>Emojis in Google Sheets</title><content type='html'>&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/aebd6cec83ede88687796b4e20d26fc7/efa52/emoji-google-sheets.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Emojis in Google Sheets&quot; title=&quot;Emojis in Google Sheets&quot; src=&quot;/static/aebd6cec83ede88687796b4e20d26fc7/16546/emoji-google-sheets.png&quot; srcset=&quot;/static/aebd6cec83ede88687796b4e20d26fc7/96042/emoji-google-sheets.png 180w,/static/aebd6cec83ede88687796b4e20d26fc7/7a322/emoji-google-sheets.png 360w,/static/aebd6cec83ede88687796b4e20d26fc7/16546/emoji-google-sheets.png 720w,/static/aebd6cec83ede88687796b4e20d26fc7/6d80e/emoji-google-sheets.png 1080w,/static/aebd6cec83ede88687796b4e20d26fc7/843f9/emoji-google-sheets.png 1440w,/static/aebd6cec83ede88687796b4e20d26fc7/efa52/emoji-google-sheets.png 2236w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Emojis can be a fun and effective way to add visual interest to your Google Sheets formulas. There are so many different ways to add emojis in Google Sheets but my favorite option is the built-in &lt;code class=&quot;language-text&quot;&gt;CHAR&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;You can copy the hex code of any emoji from &lt;a href=&quot;https://unicode.org/Public/emoji/15.0/emoji-sequences.txt&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;unicode.org&lt;/a&gt; and then use the &lt;code class=&quot;language-text&quot;&gt;HEX2DEC&lt;/code&gt; function to convert the hexadecimal value into its decimal equivalent. The CHAR function will take this decimal number as input and returns the corresponding emoji symbol.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Add the 😀 emoji to the active cell&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CHAR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;HEX2DEC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;1F600&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Get the hex value of 😀 emoji&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;DEC2HEX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;UNICODE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;😀&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Well the purpose of this guide is not to explain how to add emojis in Google Sheets but the problems that emojis may cause in your production workflows related to &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/google-sheets&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Sheets&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-problem-with-emojis-in-google-sheets&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-problem-with-emojis-in-google-sheets&quot; aria-label=&quot;the problem with emojis in google sheets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;The problem with Emojis in Google Sheets&lt;/h3&gt;
&lt;p&gt;If you are to convert any Google Sheet to a PDF file programmatically, &lt;a href=&quot;/code/19869-email-google-spreadsheets-pdf&quot;&gt;Apps Script&lt;/a&gt; can help. However, if your Google Sheet contains any emoji symbols, the PDF conversion engine will fail with a 500 error. This issue arises due to a known bug (see &lt;a href=&quot;https://issuetracker.google.com/issues?q=sheet%20emoji%20pdf&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;issue tracker&lt;/a&gt;) at Google’s end and there has not been any resolution so far.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/0d1cb54e867001408f3a2f3d0d1d178a/692a2/pdf-500-error.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Sheets PDF 500 error&quot; title=&quot;Google Sheets PDF 500 error&quot; src=&quot;/static/0d1cb54e867001408f3a2f3d0d1d178a/16546/pdf-500-error.png&quot; srcset=&quot;/static/0d1cb54e867001408f3a2f3d0d1d178a/96042/pdf-500-error.png 180w,/static/0d1cb54e867001408f3a2f3d0d1d178a/7a322/pdf-500-error.png 360w,/static/0d1cb54e867001408f3a2f3d0d1d178a/16546/pdf-500-error.png 720w,/static/0d1cb54e867001408f3a2f3d0d1d178a/6d80e/pdf-500-error.png 1080w,/static/0d1cb54e867001408f3a2f3d0d1d178a/843f9/pdf-500-error.png 1440w,/static/0d1cb54e867001408f3a2f3d0d1d178a/692a2/pdf-500-error.png 2171w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;replace-emojis-in-google-sheets&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#replace-emojis-in-google-sheets&quot; aria-label=&quot;replace emojis in google sheets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Replace Emojis in Google Sheets&lt;/h2&gt;
&lt;p&gt;Google Add-ons like &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/guide&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Email Google Sheets&lt;/a&gt; and &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Document Studio&lt;/a&gt; internally use Google Drive’s own conversion engine to convert spreadsheets into PDF files. the input sheet contains any emoji symbol, the PDF conversion would always fail owning to the bug.&lt;/p&gt;
&lt;p&gt;The only workaround to this problem is to check your spreadsheet file for any emoji symbols and remove them before performating the PDF conversion.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;
&lt;span class=&quot;token comment&quot;&gt;/* 
*  Replace Emoji Symbols in Google Spreadsheet 
*  Written by Amit Agarwal www.labnol.org
*/&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;replaceEmojisInGoogleSheet&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  SpreadsheetApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getActiveSpreadsheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSheets&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;sheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; sheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; SpreadsheetApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;SheetType&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;GRID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;sheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; sheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isSheetHidden&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;sheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      sheet
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDataRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;row&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; rowIndex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          row&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;cell&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; colIndex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; cell &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;\p{Emoji_Presentation}&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;u&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cell&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              sheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rowIndex &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; colIndex &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cell&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;\p{Emoji_Presentation}&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;gu&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  SpreadsheetApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;flush&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The Google Script will now scan your entire sheet, detect any cells containing emojis, and replace those emojis with spaces. After running the script, you can safely convert your sheet to a PDF file without encountering the 500 error caused by emoji symbols.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;\p{Emoji_Presentation}&lt;/code&gt; pattern in the &lt;a href=&quot;/internet/regular-expressions-forms/28380/&quot;&gt;regular expression&lt;/a&gt; matches emoji characters. The g flag is for a global search (to replace all occurrences) and the u flag is for Unicode mode (to properly handle emoji characters).&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/2d8127ce02ca39fe4504ae9f3e661748/816eb/sheet-emojis.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Sheet Emojis&quot; title=&quot;Google Sheet Emojis&quot; src=&quot;/static/2d8127ce02ca39fe4504ae9f3e661748/16546/sheet-emojis.png&quot; srcset=&quot;/static/2d8127ce02ca39fe4504ae9f3e661748/96042/sheet-emojis.png 180w,/static/2d8127ce02ca39fe4504ae9f3e661748/7a322/sheet-emojis.png 360w,/static/2d8127ce02ca39fe4504ae9f3e661748/16546/sheet-emojis.png 720w,/static/2d8127ce02ca39fe4504ae9f3e661748/6d80e/sheet-emojis.png 1080w,/static/2d8127ce02ca39fe4504ae9f3e661748/843f9/sheet-emojis.png 1440w,/static/2d8127ce02ca39fe4504ae9f3e661748/816eb/sheet-emojis.png 1788w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/W0i7gkR&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/1270793268737023168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/08/emojis-in-google-sheets.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1270793268737023168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1270793268737023168'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/08/emojis-in-google-sheets.html' title='Emojis in Google Sheets'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-179464763216287979</id><published>2023-07-12T08:07:00.001-07:00</published><updated>2023-07-12T08:07:30.019-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Email Google Sheets Automatically on a Recurring Schedule</title><content type='html'>&lt;p&gt;The &lt;a href=&quot;https://workspace.google.com/marketplace/app/email_spreadsheets/431723916752&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Email Spreadsheets&lt;/a&gt; add-on for Google Sheets can save office workers a ton of time by automating the reporting of spreadsheet data and dashboards by email. With this add-on, you can schedule reports to be sent automatically on a recurring schedule, so you don’t have to manually email spreadsheets to colleagues anymore.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:50%;position:relative;height:0;overflow:hidden;margin-bottom:1.0725rem&quot;&gt;
&lt;div class=&quot;embedVideo-container&quot;&gt;&lt;iframe title=&quot;&quot; src=&quot;https://www.youtube-nocookie.com/embed/VdltCyeyV1E?rel=0&quot; class=&quot;embedVideo-iframe&quot; style=&quot;border:0;position:absolute;top:0;left:0;width:100%;height:100%&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;allowfullscreen&quot; sandbox=&quot;allow-same-origin allow-scripts allow-popups&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;With Email Spreadsheets, you can schedule reports and it will automatically send them by email on a recurring schedule. You can email entire workbooks, specific sheets inside a workbook or even range of cells. Watch the &lt;a href=&quot;https://www.youtube.com/watch?v=VdltCyeyV1E&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;video&lt;/a&gt; to get started.&lt;/p&gt;
&lt;p&gt;And because the add-on runs on the Google Cloud, your spreadsheet reports will be delivered even while you are offline or on vacation.&lt;/p&gt;
&lt;h2 id=&quot;email-google-sheets-automatically&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#email-google-sheets-automatically&quot; aria-label=&quot;email google sheets automatically permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Email Google Sheets Automatically&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/8fede1c8934a664bf505b32f017ffe43/7f534/email-google-sheets.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Sheets with Data table and Chart Image&quot; title=&quot;Google Sheets with Data table and Chart Image&quot; src=&quot;/static/8fede1c8934a664bf505b32f017ffe43/16546/email-google-sheets.png&quot; srcset=&quot;/static/8fede1c8934a664bf505b32f017ffe43/96042/email-google-sheets.png 180w,/static/8fede1c8934a664bf505b32f017ffe43/7a322/email-google-sheets.png 360w,/static/8fede1c8934a664bf505b32f017ffe43/16546/email-google-sheets.png 720w,/static/8fede1c8934a664bf505b32f017ffe43/6d80e/email-google-sheets.png 1080w,/static/8fede1c8934a664bf505b32f017ffe43/843f9/email-google-sheets.png 1440w,/static/8fede1c8934a664bf505b32f017ffe43/7f534/email-google-sheets.png 2708w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For this example, our Google Spreadsheet has two sheets - the first sheet contains a data table and the second sheet contains an image chart with a neatly formatted table. We’ll build a scheduled workflow that will email the sheets data, including charts, on the first Monday of every week.&lt;/p&gt;
&lt;h3 id=&quot;step-1-select-sheets-to-export&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#step-1-select-sheets-to-export&quot; aria-label=&quot;step 1 select sheets to export permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Step 1: Select Sheets to Export&lt;/h3&gt;
&lt;p&gt;Install the &lt;a href=&quot;https://workspace.google.com/marketplace/app/email_spreadsheets/431723916752&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Email Google Sheets&lt;/a&gt; addon from Google marketplace. Next, open any Google Spreadsheet in your Google Drive, go to the Extensions menu inside the sheet, choose Email Spreadsheets from the dropdown. Click &lt;code class=&quot;language-text&quot;&gt;Open&lt;/code&gt; to launch the app and click the &lt;code class=&quot;language-text&quot;&gt;Create Workflow&lt;/code&gt; button to create your first scheduled email report.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/1a0a465c7d4d42da18d8b71fcbf8ba1a/3769f/export-google-sheets.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Sheet - Export Options&quot; title=&quot;Google Sheet - Export Options&quot; src=&quot;/static/1a0a465c7d4d42da18d8b71fcbf8ba1a/16546/export-google-sheets.png&quot; srcset=&quot;/static/1a0a465c7d4d42da18d8b71fcbf8ba1a/96042/export-google-sheets.png 180w,/static/1a0a465c7d4d42da18d8b71fcbf8ba1a/7a322/export-google-sheets.png 360w,/static/1a0a465c7d4d42da18d8b71fcbf8ba1a/16546/export-google-sheets.png 720w,/static/1a0a465c7d4d42da18d8b71fcbf8ba1a/6d80e/export-google-sheets.png 1080w,/static/1a0a465c7d4d42da18d8b71fcbf8ba1a/843f9/export-google-sheets.png 1440w,/static/1a0a465c7d4d42da18d8b71fcbf8ba1a/3769f/export-google-sheets.png 1556w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You’ll be presented with a list of sheets available in the current workbook. Select one or more sheets that you would like to send with the scheduled email. You may export sheets in PDF, Excel, CSV or a PNG image. Each sheet is attached as a separate file in the email but you can choose the “Entire Workbook” option to create a single file from all sheets in the workbook.&lt;/p&gt;
&lt;p&gt;You may also use dynamic markers to &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/markers&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;customize the file name&lt;/a&gt; of the exported files. For instance, the marker &lt;code class=&quot;language-text&quot;&gt;-&lt;/code&gt; will append the current date and month to the exported sheet name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If your Google Sheet table is large, you can specify the cell range in A1 notation (like A1:G14) and only the specified range would be exported.&lt;/p&gt;
&lt;h3 id=&quot;step-2-custom-pdf-export-settings&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#step-2-custom-pdf-export-settings&quot; aria-label=&quot;step 2 custom pdf export settings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Step 2: Custom PDF Export Settings&lt;/h3&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/6f94821d975d042bac27c1b70825219e/3769f/pdf-export-options.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Sheet - Export Options&quot; title=&quot;Google Sheet - Export Options&quot; src=&quot;/static/6f94821d975d042bac27c1b70825219e/16546/pdf-export-options.png&quot; srcset=&quot;/static/6f94821d975d042bac27c1b70825219e/96042/pdf-export-options.png 180w,/static/6f94821d975d042bac27c1b70825219e/7a322/pdf-export-options.png 360w,/static/6f94821d975d042bac27c1b70825219e/16546/pdf-export-options.png 720w,/static/6f94821d975d042bac27c1b70825219e/6d80e/pdf-export-options.png 1080w,/static/6f94821d975d042bac27c1b70825219e/843f9/pdf-export-options.png 1440w,/static/6f94821d975d042bac27c1b70825219e/3769f/pdf-export-options.png 1556w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The Email Google Sheets addon lets you &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/custom-pdf-settings&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;customize the PDF layout&lt;/a&gt; that is exported from Google Sheets. You can change the paper orientation (Portrait or Landscape), the paper size or alter the print margins to fit more content on a page. You can choose to show gridlines, notes, sheet names and page numbers in the exported file.&lt;/p&gt;
&lt;h3 id=&quot;step-3-write-the-email-template&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#step-3-write-the-email-template&quot; aria-label=&quot;step 3 write the email template permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Step 3: Write the Email Template&lt;/h3&gt;
&lt;p&gt;Next, we create an email template that will be sent with your reports. You can specify one or email recipients in the TO, CC, or BCC fields.&lt;/p&gt;
&lt;p&gt;You can also specify &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/dynamic-email-recipients&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;dynamic email recipients&lt;/a&gt; based on cell values in the spreadsheet. For instance, if the email address of the recipient is specified in cell B2 of a sheet titled “Employee Shifts”, you can put in the To field, and the add-on will pull the dynamic value from the cell at the time of sending the email report.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/4069bd1a6874ed91c87c4500486ff28c/3769f/google-sheets-email-editor.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Sheet - Export Options&quot; title=&quot;Google Sheet - Export Options&quot; src=&quot;/static/4069bd1a6874ed91c87c4500486ff28c/16546/google-sheets-email-editor.png&quot; srcset=&quot;/static/4069bd1a6874ed91c87c4500486ff28c/96042/google-sheets-email-editor.png 180w,/static/4069bd1a6874ed91c87c4500486ff28c/7a322/google-sheets-email-editor.png 360w,/static/4069bd1a6874ed91c87c4500486ff28c/16546/google-sheets-email-editor.png 720w,/static/4069bd1a6874ed91c87c4500486ff28c/6d80e/google-sheets-email-editor.png 1080w,/static/4069bd1a6874ed91c87c4500486ff28c/843f9/google-sheets-email-editor.png 1440w,/static/4069bd1a6874ed91c87c4500486ff28c/3769f/google-sheets-email-editor.png 1556w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;These dynamic cell values enclosed inside double curly braces can be used inside any of the email fields including subject, email body, and the sender’s name.&lt;/p&gt;
&lt;p&gt;The email body can include dynamic cell values as well as ranges that make it easy of you to send portions of the spreadsheet without sharing the full workbook. For instance, you can write&amp;nbsp; to include only the specific range (B2:F9) from the Wages sheet. Internally, the add-on converts the range to an HTML table, retaining all the display formatting with CSS, and embed it into the email.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/charts&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Charts&lt;/a&gt; and &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/timeline&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Timelines&lt;/a&gt; can be embedded into the email body using a special marker - you can find these markers inside the markers dropdown of the email editor. Business can also add their own &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/insert-logo-signature&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;logo and signature&lt;/a&gt; in the email body.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tip: Use the Test Email button to send an email with the exported files before setting up the schedule.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;step-4-setup-the-email-schedule&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#step-4-setup-the-email-schedule&quot; aria-label=&quot;step 4 setup the email schedule permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Step 4: Setup the Email Schedule&lt;/h3&gt;
&lt;p&gt;The Email Google Sheets add-on includes an &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/guide/schedule-email&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;email scheduler&lt;/a&gt; to help you set up recurring schedules visually.&lt;/p&gt;
&lt;p&gt;You can schedule and send emails hourly, daily, weekly, monthly or even on a yearly recurring basis. It is also possible to &lt;a href=&quot;https://digitalinspiration.com/docs/email-google-sheets/scheduler-date-exclusions&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;exclude dates&lt;/a&gt; and your spreadsheet won’t be emailed on the specified dates.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/919229580288a4e81638ff4be75eb12a/3769f/schedule-send-email.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Email Sheets Daily, Hourly, Weekly or Monthly&quot; title=&quot;Email Sheets Daily, Hourly, Weekly or Monthly&quot; src=&quot;/static/919229580288a4e81638ff4be75eb12a/16546/schedule-send-email.png&quot; srcset=&quot;/static/919229580288a4e81638ff4be75eb12a/96042/schedule-send-email.png 180w,/static/919229580288a4e81638ff4be75eb12a/7a322/schedule-send-email.png 360w,/static/919229580288a4e81638ff4be75eb12a/16546/schedule-send-email.png 720w,/static/919229580288a4e81638ff4be75eb12a/6d80e/schedule-send-email.png 1080w,/static/919229580288a4e81638ff4be75eb12a/843f9/schedule-send-email.png 1440w,/static/919229580288a4e81638ff4be75eb12a/3769f/schedule-send-email.png 1556w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;That’s it. Save the workflow and it will be activated instantly. You can also schedule multiple emails from the same Google Spreadsheet by adding more workflows.&lt;/p&gt;
&lt;p&gt;The Email Spreadsheets add-on is a powerful tool that can help you automate the reporting of spreadsheet data and dashboards by email. To learn more about the Email Spreadsheets add-on and to download it, please visit the &lt;a href=&quot;https://workspace.google.com/marketplace/app/email_spreadsheets/431723916752&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Workspace Marketplace&lt;/a&gt;.&lt;/p&gt;
&lt;div link=&quot;https://workspace.google.com/marketplace/app/email_spreadsheets/431723916752&quot;&gt;Download Email Sheets&lt;/div&gt;
&lt;h4 id=&quot;email-google-sheets---how-it-works&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#email-google-sheets---how-it-works&quot; aria-label=&quot;email google sheets how it works permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Email Google Sheets - How it works?&lt;/h4&gt;
&lt;p&gt;The add-on is written in &lt;a href=&quot;/internet/google-apps-script-developers/32305/&quot;&gt;Google Apps Script&lt;/a&gt;. It uses the Google Sheets API to &lt;a href=&quot;/code/19869-email-google-spreadsheets-pdf&quot;&gt;convert sheets to PDF files&lt;/a&gt; and uses the &lt;a href=&quot;/code/20132-gmail-api-send-mail-attachments&quot;&gt;Gmail API&lt;/a&gt; for sending the converted files as attachments.&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/LIqUFmb&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/179464763216287979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/07/how-to-email-google-sheets.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/179464763216287979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/179464763216287979'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/07/how-to-email-google-sheets.html' title='How to Email Google Sheets Automatically on a Recurring Schedule'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-3530458224285176484</id><published>2023-06-16T08:07:00.001-07:00</published><updated>2023-06-16T08:07:14.067-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>Create a BMI Calculator using Google Forms and Google Sheets</title><content type='html'>&lt;p&gt;This tutorial explains how you can build a BMI calculator app with Google Sheets and Google Forms. When a user submits the form, their BMI score is calculated in Google Sheets and a personalized report is generated in Google Docs. The user then receives an email with their BMI score and the PDF report.&lt;/p&gt;
&lt;p&gt;👋 Complete this quick &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLSf6HEW-3KeZ0cbs3J01rYcNX1OdGitaTbGebmju2vd8bLw5ow/viewform&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Form&lt;/a&gt; to calculate your BMI and receive a personalized report in your inbox.&lt;/p&gt;
&lt;h2 id=&quot;bmi-calculator-with-google-forms&quot;&gt;&lt;a href=&quot;#bmi-calculator-with-google-forms&quot; aria-label=&quot;bmi calculator with google forms permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;BMI Calculator with Google Forms&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;max-width:720px;&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/185ee94f4c34f1b5f80473904261079c/779c2/google-forms-bmi-report.png&quot; style=&quot;display:block;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Forms BMI Calculator&quot; title=&quot;Google Forms BMI Calculator&quot; src=&quot;/static/185ee94f4c34f1b5f80473904261079c/16546/google-forms-bmi-report.png&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We have a &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLSf6HEW-3KeZ0cbs3J01rYcNX1OdGitaTbGebmju2vd8bLw5ow/viewform&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Form&lt;/a&gt; that asks the user to enter their height and weight. The response is stored in a Google Sheet and the BMI score is calculated automatically using the BMI formula.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.scribd.com/document/653430581/Report-Builder-for-Google-Forms&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PDF report&lt;/a&gt; is personalized and includes the user’s BMI score, BMI category, and suggestions on how to improve their BMI score. The user’s photo is also embedded in the report as shown in the screenshot above.&lt;/p&gt;
&lt;h3 id=&quot;bmi-calculations-in-google-sheets&quot;&gt;&lt;a href=&quot;#bmi-calculations-in-google-sheets&quot; aria-label=&quot;bmi calculations in google sheets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;BMI Calculations in Google Sheets&lt;/h3&gt;
&lt;p&gt;We perform the following calculations in Google Sheets to calculate the user’s BMI score.&lt;/p&gt;
&lt;h4 id=&quot;age-of-the-respondent&quot;&gt;&lt;a href=&quot;#age-of-the-respondent&quot; aria-label=&quot;age of the respondent permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Age of the respondent&lt;/h4&gt;
&lt;p&gt;The form requires the user to enter their date of birth. We use the &lt;a href=&quot;/google-sheets-date-functions-210823&quot;&gt;DATEDIF function&lt;/a&gt; to calculate the age of the user in years.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;MAP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;LAMBDA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Age&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
   &lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ISDATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ROUND&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;DATEDIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;TODAY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Y&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;max-width:709px;&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/2208019659abc1a6222258aa1636355b/183d0/bmi-sheet-formulas.png&quot; style=&quot;display:block;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;BMI Calculations in Google Sheets&quot; title=&quot;BMI Calculations in Google Sheets&quot; src=&quot;/static/2208019659abc1a6222258aa1636355b/183d0/bmi-sheet-formulas.png&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;bmi-score-kgm&quot;&gt;&lt;a href=&quot;#bmi-score-kgm&quot; aria-label=&quot;bmi score kgm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;BMI Score (kg/m²)&lt;/h4&gt;
&lt;p&gt;The user enters their height and weight in the form. We use the &lt;a href=&quot;https://www.labnol.org/google-sheets-formula-deleted-220927&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;MAP function&lt;/a&gt; to calculate the BMI score for each form response in the sheet.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;MAP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;LAMBDA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ht&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; wt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;BMI&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
    &lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;AND&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ISNUMBER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ISNUMBER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ht&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
      &lt;span class=&quot;token constant&quot;&gt;ROUND&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wt&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ht&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;bmi-category&quot;&gt;&lt;a href=&quot;#bmi-category&quot; aria-label=&quot;bmi category permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;BMI Category&lt;/h4&gt;
&lt;p&gt;The BMI category is calculated using the &lt;a href=&quot;/internet/arrayformula-copy-formulas-in-entire-column/29711/&quot;&gt;array function&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ARRAYFORMULA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;BMI Category&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ISNUMBER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Underweight&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Normal weight&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;J&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Overweight&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Obese&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;prepare-bmi-report&quot;&gt;&lt;a href=&quot;#prepare-bmi-report&quot; aria-label=&quot;prepare bmi report permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Prepare BMI Report&lt;/h3&gt;
&lt;p&gt;We’ve created a &lt;a href=&quot;https://docs.google.com/document/d/1ssNCLWtd_rnbdkL-29FJ8eH_jkosfOGehuvivDWWles/edit&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;template in Google Docs&lt;/a&gt; that will be used to generate personalized BMI reports for each user with the help of &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Document Studio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;max-width:720px;&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/0855bfc81b3d1e5853508b2bc4d42cac/f7b72/google-docs-bmi-template.png&quot; style=&quot;display:block;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;BMI Report in Google Docs&quot; title=&quot;BMI Report in Google Docs&quot; src=&quot;/static/0855bfc81b3d1e5853508b2bc4d42cac/16546/google-docs-bmi-template.png&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The report uses &lt;a href=&quot;/conditional-logic-google-docs-230426&quot;&gt;conditional content&lt;/a&gt; to display suggestions based upon the BMI score of the user. For instance, if the BMI score is less than 18.5, the user is underweight and the report suggests that they should eat more calories.&lt;/p&gt;
&lt;p&gt;The image is inserted in the report using a special &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/embed/images&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Embed Image tag&lt;/a&gt; to add thethe photo uploaded by the user in the Google Form in the document.&lt;/p&gt;
&lt;h3 id=&quot;create-bmi-workflow&quot;&gt;&lt;a href=&quot;#create-bmi-workflow&quot; aria-label=&quot;create bmi workflow permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Create BMI Workflow&lt;/h3&gt;
&lt;p&gt;Launch Document Studio inside the form responses sheet and go to Extensions &amp;gt; Document Studio &amp;gt; Open to create a new BMI workflow.&lt;/p&gt;
&lt;p&gt;We’ll only process the form responses that have a valid email address, the age of the user is numeric, and the calculated BMI score is at least 10.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;max-width:720px;&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/1428d3289dd1727e10f5e6b61918a5fe/28eab/bmi-workflow-conditions.png&quot; style=&quot;display:block;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Workflow Conditions&quot; title=&quot;Workflow Conditions&quot; src=&quot;/static/1428d3289dd1727e10f5e6b61918a5fe/16546/bmi-workflow-conditions.png&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;On the next screen, add a &lt;code class=&quot;language-text&quot;&gt;Create File&lt;/code&gt; task and select the Google Docs template that we’ve created in the previous step. You may also want to change the name of the generated PDF file to include the name of the form respondent.&lt;/p&gt;
&lt;p&gt;Click the &lt;code class=&quot;language-text&quot;&gt;Add Another Task&lt;/code&gt; button to add the &lt;code class=&quot;language-text&quot;&gt;Send Email&lt;/code&gt; task. This will send the generated PDF report to the user via email.&lt;/p&gt;
&lt;p&gt;For the recipient’s email address, select the &lt;code class=&quot;language-text&quot;&gt;Email&lt;/code&gt; column from the Google Sheet. You can also customize the email subject and the body of the email.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;max-width:720px;&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/788c815deb3a0dde9b865b0363cf88a3/d6af2/email-bmi-report.png&quot; style=&quot;display:block;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Email BMI Report&quot; title=&quot;Email BMI Report&quot; src=&quot;/static/788c815deb3a0dde9b865b0363cf88a3/16546/email-bmi-report.png&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;Attach Merged Files&lt;/code&gt; option should be enabled so that the generated PDF report is attached to the email. That’s it. Click the &lt;code class=&quot;language-text&quot;&gt;Save Workflow&lt;/code&gt; button and your BMI calculator is ready for use.&lt;/p&gt;
&lt;p&gt;You can view the &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/tutorial&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;tutorial&lt;/a&gt; section for more ideas on &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/google-forms&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Forms automation&lt;/a&gt; with Document Studio.&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/d5gekGw&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/3530458224285176484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/06/create-bmi-calculator-using-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/3530458224285176484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/3530458224285176484'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/06/create-bmi-calculator-using-google.html' title='Create a BMI Calculator using Google Forms and Google Sheets'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-2601394316428718540</id><published>2023-06-14T05:07:00.001-07:00</published><updated>2023-06-14T05:07:39.475-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Transcribe Audio and Video Attachments in Gmail</title><content type='html'>&lt;p&gt;The &lt;a href=&quot;https://workspace.google.com/marketplace/app/save_emails_and_attachments/513239564707&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Save Gmail to Google Drive&lt;/a&gt; add-on lets you automatically download email messages and file attachments from Gmail to your Google Drive. You can save the email messages as PDF while the attachments are saved in their original format.&lt;/p&gt;
&lt;h2 id=&quot;transcribe-gmail-attachments&quot;&gt;&lt;a href=&quot;#transcribe-gmail-attachments&quot; aria-label=&quot;transcribe gmail attachments permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Transcribe Gmail Attachments&lt;/h2&gt;
&lt;p&gt;The latest version of the Gmail add-on adds support for transcribing audio and video attachments in Gmail messages. The transcription is done with the help of OpenAI’s &lt;a href=&quot;https://openai.com/research/whisper&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Whisper API&lt;/a&gt; and the transcript is saved as a new text file in your Google Drive.&lt;/p&gt;
&lt;p&gt;Here’s a step by step guide on how you can transcribe audio and video attachments in Gmail messages to text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1.&lt;/strong&gt; Install the &lt;a href=&quot;https://workspace.google.com/marketplace/app/save_emails_and_attachments/513239564707&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Save Gmail to Google Drive&lt;/a&gt; add-on from the Google Workspace marketplace. Open &lt;a href=&quot;https://sheets.new&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;sheets.new&lt;/a&gt; to create a new Google Sheet. Go to the Extension menu &amp;gt; Save Emails &amp;gt; Open App to launch the add-on.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;max-width:720px;&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/3119f53f47e2598261cbba4658fb7ab4/898e6/122502.png&quot; style=&quot;display:block;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Gmail Search Criteria&quot; title=&quot;Gmail Search Criteria&quot; src=&quot;/static/3119f53f47e2598261cbba4658fb7ab4/16546/122502.png&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2.&lt;/strong&gt; Create a new workflow and specify the Gmail search criteria. The add-on will scan the matching email message for any audio and video files.&lt;/p&gt;
&lt;p&gt;OpenAI’s speech-to-text API supports a wide range of audio and video formats including MP3, WAV, MP4, MPEG, and WEBM. The maximum file size is 25 MB and you’ll always be in the limit since Gmail doesn’t allow you to send or receive files larger than 25 MB.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;max-width:720px;&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/88301242e26f1467a39fd34258d5499b/4dd86/123039.png&quot; style=&quot;display:block;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Transcribe Gmail Message&quot; title=&quot;Transcribe Gmail Message&quot; src=&quot;/static/88301242e26f1467a39fd34258d5499b/16546/123039.png&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3.&lt;/strong&gt; On the next screen, check the option that says &lt;strong&gt;Save Audio and Video Attachments as text&lt;/strong&gt; and choose the file format, text or PDF, in which you would like to save the transcript.&lt;/p&gt;
&lt;p&gt;You can include markers in the file name. For instance, if you specify the file name as , the add-on will replace the markers with the actual sender’s email and the email subject.&lt;/p&gt;
&lt;p&gt;You would also need to specify the OpenAI API key that you can get from the &lt;a href=&quot;https://platform.openai.com/account/api-keys&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;OpenAI dashboard&lt;/a&gt;. OpenAI charges you $0.006 per minute of audio or video transcribed, rounded to the nearest second.&lt;/p&gt;
&lt;p&gt;Save the workflow and it will automatically run in the background, transcribing messages as they land in your inbox. You can check the status of the workflow in the Google Sheet itself.&lt;/p&gt;
&lt;p&gt;Also see: &lt;a href=&quot;https://dictation.io&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Speech to Text with Dictation.io&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;speech-to-text-with-google-apps-script&quot;&gt;&lt;a href=&quot;#speech-to-text-with-google-apps-script&quot; aria-label=&quot;speech to text with google apps script permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Speech to Text with Google Apps Script&lt;/h3&gt;
&lt;p&gt;Internally, the add-on uses the &lt;a href=&quot;https://developers.google.com/apps-script&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Apps Script&lt;/a&gt; to connect to the OpenAI API and transcribe the audio and video files. Here’s the source code of the Google Script that you can copy and use in your own projects.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Define the URL for the OpenAI audio transcription API&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;WHISPER_API_URL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://api.openai.com/v1/audio/transcriptions&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Define your OpenAI API key&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;OPENAI_API_KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sk-putyourownkeyhere&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Define a function that takes an audio file ID and language as parameters&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;transcribeAudio&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;fileId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; language&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Get the audio file as a blob using the Google Drive API&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; audioBlob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DriveApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFileById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fileId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBlob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Send a POST request to the OpenAI API with the audio file&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; UrlFetchApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;WHISPER_API_URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;POST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Bearer &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;whisper-1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; audioBlob&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;response_format&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;text&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; language&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Get the transcription from the API response and log it to the console&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContentText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  Logger&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Please replace the OPENAI_API_KEY value with your own OpenAI API key. Also, make sure that the audio or video file you want to transcribe is stored in your Google Drive and that you have at least view (read) permissions on the file.&lt;/p&gt;
&lt;h3 id=&quot;transcribe-large-audio-and-video-files&quot;&gt;&lt;a href=&quot;#transcribe-large-audio-and-video-files&quot; aria-label=&quot;transcribe large audio and video files permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Transcribe Large Audio and Video Files&lt;/h3&gt;
&lt;p&gt;The Whisper API only accepts audio files that are less than 25 MB in size. If you have a larger file, you can use the &lt;code class=&quot;language-text&quot;&gt;Pydub&lt;/code&gt; Python package to split the audio file into smaller chunks and then send them to the API for transcription.&lt;/p&gt;
&lt;p&gt;If the video file is large in size, you may extract the audio track from the video file using &lt;a href=&quot;/internet/useful-ffmpeg-commands/28490/&quot;&gt;FFmpeg&lt;/a&gt; and send that to the API for transcription.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Extract the audio from video&lt;/span&gt;
ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; video.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-vn&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-ab&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt; audio.mp3

&lt;span class=&quot;token comment&quot;&gt;## Split the audio file into smaller chunks&lt;/span&gt;
ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; large_audio.mp3 &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; segment &lt;span class=&quot;token parameter variable&quot;&gt;-segment_time&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; copy output_%03d.mp3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;FFmpeg will split the input audio file into multiple 60-second chunks, naming them as output_001.mp3, output_002.mp3, and so on, depending on the duration of the input file.&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/lKmUbwQ&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/2601394316428718540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/06/how-to-transcribe-audio-and-video.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/2601394316428718540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/2601394316428718540'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/06/how-to-transcribe-audio-and-video.html' title='How to Transcribe Audio and Video Attachments in Gmail'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-5478602061067203740</id><published>2023-06-07T05:07:00.001-07:00</published><updated>2023-06-07T05:07:40.212-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Send a Welcome Email to Google Form Respondents</title><content type='html'>&lt;p&gt;“Tech and AI” - that’s the theme of an upcoming event we are organizing in New York. We have created a Google Form to collect registrations and would like to send a welcome email automatically to each person as they fill the form.&lt;/p&gt;
&lt;p&gt;The email should be personalized and include the name of the attendee. We would like also attach a PDF file, with the speaker bios and other details about the event, to the email.&lt;/p&gt;
&lt;h3 id=&quot;google-form-for-event-registration&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#google-form-for-event-registration&quot; aria-label=&quot;google form for event registration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Google Form for Event Registration&lt;/h3&gt;
&lt;p&gt;Here’s a sample Google Form that we are using to collect registrations for the event. The form requires attendees to fill in their name, email address and their preferred date to attend the event.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/392998b8f496802b55121fbf69a198cc/524d8/143356.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Event Registrations - Google Form&quot; title=&quot;Event Registrations - Google Form&quot; src=&quot;/static/392998b8f496802b55121fbf69a198cc/16546/143356.png&quot; srcset=&quot;/static/392998b8f496802b55121fbf69a198cc/96042/143356.png 180w,/static/392998b8f496802b55121fbf69a198cc/7a322/143356.png 360w,/static/392998b8f496802b55121fbf69a198cc/16546/143356.png 720w,/static/392998b8f496802b55121fbf69a198cc/524d8/143356.png 722w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;personalized-welcome-email&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#personalized-welcome-email&quot; aria-label=&quot;personalized welcome email permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Personalized Welcome Email&lt;/h3&gt;
&lt;p&gt;Since we would like to send a personalized email to each attendee, we’ll use markers in the email template that will be replaced with the actual values from the Google Form. For instance, if we use the marker in the email template, it will be replaced with the actual name of the attendee that is filled in the Google Form.&lt;/p&gt;
&lt;p&gt;Here’s how the email template looks like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;md&quot;&gt;
&lt;pre class=&quot;language-md&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;Hi ,

Thank you for registering for the Tech and AI event. We are excited to have you join us on .

We&#39;ve attached a PDF file with speaker bios and other details about the event.

Your registration ID is . If you would like to make any changes to your registration, please visit 

We look forward to seeing you there!

Sincerely,
Digital Inspiration&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;Response ID&lt;/code&gt; is a &lt;a href=&quot;https://digitalinspiration.com/docs/form-notifications/unique-form-submission-id&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;unique identifier&lt;/a&gt; for each Google Form response and the &lt;code class=&quot;language-text&quot;&gt;Response URL&lt;/code&gt; is the link to the Google Form response that the attendee can use to edit their response anytime later.&lt;/p&gt;
&lt;h3 id=&quot;pdf-file-with-event-details&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#pdf-file-with-event-details&quot; aria-label=&quot;pdf file with event details permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;PDF File with Event Details&lt;/h3&gt;
&lt;p&gt;Upload the PDF file that you would like to attach to the email to Google Drive. Share the file with anyone who has the link and copy the link of the PDF file to the clipboard.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/e840e97f3395a10c74e4cad39b869da2/552d8/155353.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;PDF file in Google Drive&quot; title=&quot;PDF file in Google Drive&quot; src=&quot;/static/e840e97f3395a10c74e4cad39b869da2/16546/155353.png&quot; srcset=&quot;/static/e840e97f3395a10c74e4cad39b869da2/96042/155353.png 180w,/static/e840e97f3395a10c74e4cad39b869da2/7a322/155353.png 360w,/static/e840e97f3395a10c74e4cad39b869da2/16546/155353.png 720w,/static/e840e97f3395a10c74e4cad39b869da2/552d8/155353.png 917w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;send-automated-emails-from-google-forms&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#send-automated-emails-from-google-forms&quot; aria-label=&quot;send automated emails from google forms permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Send Automated Emails from Google Forms&lt;/h2&gt;
&lt;p&gt;Now that we have the Google Form and templates ready, we’ll be using the &lt;a href=&quot;https://workspace.google.com/marketplace/app/email_notifications_for_google_forms/984866591130&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Email Notifications for Google Forms&lt;/a&gt; add-on to send the welcome emails automatically to each attendee.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://digitalinspiration.com/docs/form-notifications/launch&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Launch&lt;/a&gt; the add-on inside Google Forms, and click the &lt;strong&gt;Create Email Notification&lt;/strong&gt; button to create a new rule for sending emails.&lt;/p&gt;
&lt;p&gt;Give your rule a name, say &lt;strong&gt;Welcome Email&lt;/strong&gt;, and paste the Google Drive File URL in the &lt;strong&gt;Attach Files&lt;/strong&gt; input box. Next, click the &lt;strong&gt;Visual Editor&lt;/strong&gt; button to open the email editor.&lt;/p&gt;
&lt;p&gt;Enter the subject line and the email body containing the markers. You can also add inline images (like your brand’s logo) to the email body.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/ccfba4f46c9b74b9bd3d963b0878f24f/5929e/162514.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Form Notifications Rule&quot; title=&quot;Google Form Notifications Rule&quot; src=&quot;/static/ccfba4f46c9b74b9bd3d963b0878f24f/16546/162514.png&quot; srcset=&quot;/static/ccfba4f46c9b74b9bd3d963b0878f24f/96042/162514.png 180w,/static/ccfba4f46c9b74b9bd3d963b0878f24f/7a322/162514.png 360w,/static/ccfba4f46c9b74b9bd3d963b0878f24f/16546/162514.png 720w,/static/ccfba4f46c9b74b9bd3d963b0878f24f/5929e/162514.png 935w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;send-email-to-the-form-respondent&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#send-email-to-the-form-respondent&quot; aria-label=&quot;send email to the form respondent permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Send Email to the Form Respondent&lt;/h3&gt;
&lt;p&gt;The last step is to specify the email address of the person who filled the Google Form. This is the email address that will receive the welcome email.&lt;/p&gt;
&lt;p&gt;There are two ways to specify the email address of the form respondent:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You can either check the &lt;strong&gt;Notify Form Submitter&lt;/strong&gt; option and select the &lt;strong&gt;Email Address&lt;/strong&gt; question from the drop-down. This will send the welcome email to the email address that the respondent has entered in the Google Form.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alternatively, you may put the question title of the email address field in the &lt;strong&gt;Email Addresses to Notify&lt;/strong&gt; input box. This is useful when you want to send the welcome email to a different email address that is not entered in the Google Form.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;barcode-and-qr-code-in-the-email&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#barcode-and-qr-code-in-the-email&quot; aria-label=&quot;barcode and qr code in the email permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Barcode and QR Code in the Email&lt;/h3&gt;
&lt;p&gt;Tip: If you are using the add-on to generate event passes, you can include the barcode or QR code of the registration ID in the email body. The barcode can be scanned at the event venue to verify the attendee’s identity. &lt;a href=&quot;https://digitalinspiration.com/docs/form-notifications/barcode-qrcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Learn more&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;test-the-email-notification-rule&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#test-the-email-notification-rule&quot; aria-label=&quot;test the email notification rule permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Test the Email Notification Rule&lt;/h3&gt;
&lt;p&gt;That’s it. Click the &lt;strong&gt;Save&lt;/strong&gt; button to enable the rule and it will send the welcome email to the form respondent as soon as they submit the Google Form.&lt;/p&gt;
&lt;p&gt;Here’s a sample email that we received after filling the Google Form.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/6dfe10da3e54e522f02facb002f92c18/785ee/163631.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Welcome Email for Google Forms&quot; title=&quot;Welcome Email for Google Forms&quot; src=&quot;/static/6dfe10da3e54e522f02facb002f92c18/16546/163631.png&quot; srcset=&quot;/static/6dfe10da3e54e522f02facb002f92c18/96042/163631.png 180w,/static/6dfe10da3e54e522f02facb002f92c18/7a322/163631.png 360w,/static/6dfe10da3e54e522f02facb002f92c18/16546/163631.png 720w,/static/6dfe10da3e54e522f02facb002f92c18/785ee/163631.png 830w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Also see: &lt;a href=&quot;https://digitalinspiration.com/docs/form-notifications/tutorial&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Getting Started with Google Form Notifications&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/vwZN3qf&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/5478602061067203740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/06/how-to-send-welcome-email-to-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/5478602061067203740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/5478602061067203740'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/06/how-to-send-welcome-email-to-google.html' title='How to Send a Welcome Email to Google Form Respondents'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-1149655139785192798</id><published>2023-05-12T03:08:00.001-07:00</published><updated>2023-05-12T03:08:06.308-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Sort Google Sheets Automatically with Apps Script</title><content type='html'>&lt;p&gt;This &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1KkfoKjgeem4vd3ylbktby0mdnWlui_6J0FO0vt9zwTw/edit#gid=0&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Spreadsheet&lt;/a&gt; on &lt;a href=&quot;/tech-courses-200403&quot;&gt;Udemy courses&lt;/a&gt; has about 50 sheets, one for each programming language, and the sheets are sorted in random order so it is difficult to find a specific sheet.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/e435c9592d042b81594a6d52c5ee4be4/990ff/144657.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Sort Google Sheets&quot; title=&quot;Sort Google Sheets&quot; src=&quot;/static/e435c9592d042b81594a6d52c5ee4be4/16546/144657.png&quot; srcset=&quot;/static/e435c9592d042b81594a6d52c5ee4be4/96042/144657.png 180w,/static/e435c9592d042b81594a6d52c5ee4be4/7a322/144657.png 360w,/static/e435c9592d042b81594a6d52c5ee4be4/16546/144657.png 720w,/static/e435c9592d042b81594a6d52c5ee4be4/6d80e/144657.png 1080w,/static/e435c9592d042b81594a6d52c5ee4be4/990ff/144657.png 1273w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It will take a while to sort the worksheets manually but we can easily automate the process with &lt;a href=&quot;/topic/google-apps-script&quot;&gt;Google Apps Script&lt;/a&gt; and easily navigate through large spreadsheets.&lt;/p&gt;
&lt;h2 id=&quot;automate-sheet-sorting-with-google-apps-script&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#automate-sheet-sorting-with-google-apps-script&quot; aria-label=&quot;automate sheet sorting with google apps script permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Automate Sheet Sorting with Google Apps Script&lt;/h2&gt;
&lt;p&gt;The following code snippet will automatically sort the worksheets in a Google Sheet alphanumerically. The script can arrange the sheets in either ascending or descending order based on the sheet names.&lt;/p&gt;
&lt;p&gt;To get started, go to Extensions &amp;gt; Apps Script to open the script editor. Then, copy and paste the following code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;sortGoogleSheets&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;ascending &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; options &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;sensitivity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;base&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;ignorePunctuation&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;numeric&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;compareFn&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;sheet1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sheet2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; ascending
      &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; sheet1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;localeCompare&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sheet2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; sheet2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;localeCompare&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sheet1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Get the active spreadsheet.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; SpreadsheetApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getActiveSpreadsheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  ss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSheets&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;compareFn&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;sheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      ss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setActiveSheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sheet&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      ss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;moveActiveSheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Flush the changes to the spreadsheet.&lt;/span&gt;
  SpreadsheetApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;flush&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;compareFn&lt;/code&gt; function compares two sheets and returns a value that indicates whether the first sheet should come before or after the second sheet. The function returns the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;-1&lt;/code&gt; if the first sheet should come before the second sheet.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;1&lt;/code&gt; if the first sheet should come after the second sheet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;advanced-sort-options&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#advanced-sort-options&quot; aria-label=&quot;advanced sort options permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Advanced Sort Options&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; options &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;sensitivity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;base&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;ignorePunctuation&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;numeric&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;options&lt;/code&gt; object specifies the options for the locale comparison. Here are some important things to know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The numeric property specifies whether numbers should be treated as numbers instead of strings. If this property is set to false, “Sheet1” and “Sheet10” will come before “Sheet2”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The ignorePunctuation property specifies whether spaces, brackets and other punctuation should be ignored during the comparison. If this property is set to false, “Sheet 1” and “Sheet1” will be treated as different sheets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The sensitivity property specifies if the comparison should be case-sensitive or case-insensitive. Set this property to “accent” to treat base letters and &lt;a href=&quot;/replace-accented-characters-210709&quot;&gt;accented characters&lt;/a&gt; differently (Sheet a and Sheet à will be treated as different sheets).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sort-google-sheets-by-date&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#sort-google-sheets-by-date&quot; aria-label=&quot;sort google sheets by date permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Sort Google Sheets by Date&lt;/h3&gt;
&lt;p&gt;If your sheet names contain dates, like “March 2023” or “01/03/23”, you’ll need to convert the dates to numbers before comparing them.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;compareFn&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;sheet1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sheet2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; ascending
    &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sheet1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sheet2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sheet2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sheet1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;references&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#references&quot; aria-label=&quot;references permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;localeCompare() method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Collator&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Intl.Collator API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/VGnvb1p&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/1149655139785192798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/05/how-to-sort-google-sheets-automatically.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1149655139785192798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1149655139785192798'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/05/how-to-sort-google-sheets-automatically.html' title='How to Sort Google Sheets Automatically with Apps Script'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-6532602482120312839</id><published>2023-05-06T01:07:00.001-07:00</published><updated>2023-05-06T01:07:20.098-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>Essential Mac Apps and Utilities - 2023 Edition</title><content type='html'>&lt;p&gt;Whether you’re new to using a Mac or an experienced Mac user looking to take your productivity to the next level, you’ll find something new and useful in our collection of the must-have Mac Apps of 2023. Most of these apps are free and cater to general Mac users, not just the geek crowd.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.labnol.org/images/2023/best-mac-apps.png&quot; alt=&quot;Best Mac Apps and Utilities&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-best--mac-apps--utilities&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-best--mac-apps--utilities&quot; aria-label=&quot;the best mac apps utilities permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;The Best  Mac Apps &amp;amp; Utilities&lt;/h2&gt;
&lt;p&gt;This collection of essential Mac Apps includes mostly lesser-known apps so the popular ones — like Evernote, 1Password, Dropbox, Skype, OneNote, or Google Drive — aren’t listed here. Also, all the apps here are compatible with Big Sur and Catalina, the current versions of macOS.&lt;/p&gt;
&lt;p&gt;Wherever possible, I have included the Mac App Store links because the store not only makes it easy for you to install apps on your Mac but, in the case of paid apps, you also have an option for &lt;a href=&quot;/software/mac-app-store-refund-purchase/28774/&quot;&gt;requesting refunds&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let’s get started.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.raycast.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Raycast&lt;/a&gt; - A powerful Spotlight replacement for your Mac that lets you quickly search and launch apps, search the web, and more. You can also create custom workflows with &lt;a href=&quot;/topic/javascript/&quot;&gt;JavaScript&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://affiliate.notion.so/9iihcpmrwppo&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Notion&lt;/a&gt; - Think of Notion as a note-taking app, a wiki, a to-do manager, a calendar, a spreadsheet and a project management tool, all rolled into one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://w2.outlook.com/getmac/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Outlook&lt;/a&gt; - Microsoft Outlook is the best email client for Mac and you no longer need a Microsoft 365 subscription or Office license to use Outlook. &lt;a href=&quot;https://sparkmailapp.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Spark&lt;/a&gt; is also a good alternative to Apple Mail.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://magnet.crowdcafe.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Magnet&lt;/a&gt; - A perfect windows management app for Mac that lets you move and &lt;a href=&quot;/software/resize-mac-windows-to-specific-size/28345/&quot;&gt;resize windows&lt;/a&gt; with configurable keyboard shortcuts. You can move windows between multiple displays too. Another alternative is &lt;a href=&quot;https://rectangleapp.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Rectangle&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://macpaw.audw.net/c/1302703/1028273/1733&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Setapp&lt;/a&gt; - A collection of premium Mac Apps and Utilities in a single package. Includes favorites like MindNode, Ulysses for writers, CleanshotX for screen capture and Capto for screen recording.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://shottr.cc/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Shottr&lt;/a&gt; - An innovate screenshot app for Mac that lets you capture and annotate screenshots with ease. You can perform OCR and also capture full web pages. I also use &lt;a href=&quot;https://cleanshot.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;CleanShot X&lt;/a&gt; and &lt;a href=&quot;https://xnapper.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Xnapper&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://imageoptim.com/mac&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;ImageOptim&lt;/a&gt; - Always run your images through ImageOptim before uploading them on to your website. The app will reduce the size of your&amp;nbsp;image files without affecting the visual quality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.warp.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Warp&lt;/a&gt; - A modern replacement for the Mac Terminal. It is fast, beautiful, and includes AI search to convert natural language into executable shell commands. Also see - &lt;a href=&quot;/internet/useful-tools-for-programmers/29227/&quot;&gt;Essential Tools for Programmers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://itunes.apple.com/in/app/sitesucker/id442168834?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Site Sucker&lt;/a&gt; - Download entire websites includes images, PDF files and mirror them on your local disk for offline browsing. Like &lt;a href=&quot;/software/wget-command-examples/28750/&quot;&gt;wget&lt;/a&gt; but with a visual interface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://freemacsoft.net/appcleaner/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;App Cleaner&lt;/a&gt; - The best uninstaller for your Mac that will automatically remove all the extra files that are left on the disk when you delete an app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maccy.app/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Maccy&lt;/a&gt; - A clipboard manager that stores all that you copy to the clipboard and lets you paste the copied snippets into other apps with a simple shortcut. [CopyClip] is a good alternative.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Kevin-De-Koninck/Clean-Me&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Clean Me&lt;/a&gt; - Recover space on your Mac by deleting all the system logs, cache and other temp files that your Mac can easily do away with.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Mortennn/Dozer&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Dozer&lt;/a&gt; - An excellent alternative to the popular &lt;a href=&quot;http://www.macbartender.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Bartender&lt;/a&gt; app. You can quickly re-order or even hide the app icons appearing in the Mac menu bar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://ranchero.com/netnewswire/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;NetNewsWire&lt;/a&gt; - A clean and fast RSS Reader for your MacOS. Checkout &lt;a href=&quot;https://apps.apple.com/app/id1529448980&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Reeder&lt;/a&gt; if you are looking for a more advanced RSS reader. We have an &lt;a href=&quot;https://www.labnol.org/rss.xml&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;RSS Feed&lt;/a&gt; too!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/in/app/rss-bot-news-notifier/id605732865?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;RSS Bot&lt;/a&gt; - Access your RSS from your Mac’s menu bar and get notifications when new items are available. You can also apply filters to only show articles that match certain keywords.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://www.labnol.org/images/2023/calculator.png&quot; alt=&quot;Numi.app - The Smart Mac Calculator&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://flotato.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Flotato&lt;/a&gt; - It turns any web page into a native Mac app that you can quickly open outside the web browser. Also see, &lt;a href=&quot;http://fluidapp.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Fluid&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://max.codes/latest/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Latest&lt;/a&gt; - It scans the Applications folder of your Mac and checks if all your installed apps are up to date. You can also update your outdated apps. &lt;a href=&quot;https://www.corecode.io/macupdater/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;MacUpdater&lt;/a&gt; is an even more powerful but paid alternative.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.titanium-software.fr/en/onyx.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Onyx&lt;/a&gt; - Perform system maintenance tasks to improve the performance of your Mac, verify disks and more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://www.bresink.com/osx/TinkerTool.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;TinkerTool&lt;/a&gt; - It provides access to several configuration settings that are otherwise hidden on the Mac. For instance, you can specify the default folder where Screenshots should be saved on the Mac.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/newmarcel/KeepingYouAwake&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;KeepingYouAwake&lt;/a&gt; - It keeps your Mac stay awake and also prevents your screen from going to sleep. If you need more features, use &lt;a href=&quot;https://apps.apple.com/app/amphetamine/id937984704?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Amphetamine&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://shifty.natethompson.io/en/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Shifty&lt;/a&gt; - Easily toggle between dark and light mode on your Mac. You can also decide which of your Apps or websites should stay light, while your system runs in Dark Mode. Also see, &lt;a href=&quot;https://nightowl.kramser.xyz/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;NightOwl&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://iina.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;IINA&lt;/a&gt; - A modern alternative to the VLC Media Player that includes support for gestures and the touch bar in newer Macs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://bahoom.com/hyperswitch&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;HyperSwitch&lt;/a&gt; - An improved window switching app for Mac that upgrades your default Command + Tab experience when cycling between open app windows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://richsomerfield.com/apps/textbar/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;TextBar&lt;/a&gt; - You can specify &lt;a href=&quot;/software/linux-commands/19028/&quot;&gt;system commands&lt;/a&gt; and the app will add the text output of those commands to the menu bar. For instance, &lt;code class=&quot;language-text&quot;&gt;ipconfig getifaddr en0&lt;/code&gt; will print your current IP address. You can also have these as desktop widgets with &lt;a href=&quot;http://tracesof.net/uebersicht/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Übersicht&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://tyke.app/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Tyke&lt;/a&gt; - A minimalistic notepad app that sits in the menu bar and lets you save quick notes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://www.labnol.org/images/2023/night-mode-mac.png&quot; alt=&quot;Control the Night mode on MacOS&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;21&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://pqrs.org/osx/karabiner/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Karabiner&lt;/a&gt; - Remap existing keys on the keyboard to perform a different command. For instance, the CAPS-lock key can be configured to work as an Escape key. Useful when using any non-Apple keyboard with Mac.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/in/app/dropzone-4/id1485052491?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Dropzone&lt;/a&gt; - It makes it easy to copy or move files to your favorite folders, open applications and you can also upload files to the Internet right from your menu bar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/us/app/clocker-menubar-world-clock/id1056643111?ls=1&amp;amp;mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Clocker&lt;/a&gt; - Show multiple clocks in your menu bar from different timezones.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.duetdisplay.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Duet Display&lt;/a&gt; - Use your iPad, iPhone or even an Android phone as an extra display for your Mac and PC.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://panic.com/transmit/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Transmit&lt;/a&gt; - The perfect FTP client for Mac OS X that just works. You can create droplets to instantly upload files to your favorite destinations from anywhere.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.airdroid.com/en/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;AirDroid&lt;/a&gt; - It connects your Android phone to the Mac. You can access messages, manage photos, &lt;a href=&quot;/software/airdroid-for-windows-mac/28734/&quot;&gt;transfer files&lt;/a&gt; and more, wirelessly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/app/the-unarchiver/id425424353?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Unarchiver&lt;/a&gt; - It’s like WinZip compression utility for Mac that can handle all the popular archive formats including RAR, TAR, GZIP, ISO, and more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://handbrake.fr/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Handbrake&lt;/a&gt; - Convert video files from one format to another. &lt;a href=&quot;/internet/useful-ffmpeg-commands/28490/&quot;&gt;FFmpeg&lt;/a&gt; is powerful too but works only from the command line. For audio files, the recommended converter is &lt;a href=&quot;https://www.freac.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;fre:ac&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://www.derlien.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Disk Inventory&lt;/a&gt; - If your MacBook is running low on space, use the Disk Inventory app to quickly discover large files and folders that are clogging the storage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://heliumfloats.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Helium&lt;/a&gt; - An &lt;a href=&quot;/software/tutorials/keep-window-always-on-top/5213/&quot;&gt;Always on Top&lt;/a&gt; like app but for your Mac. The browser window will float on top of other windows and you can also change the translucency level.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://www.labnol.org/images/2023/mac-volume-control.png&quot; alt=&quot;Better Volume Control for Mac&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;32&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/us/app/xmenu/id419332741?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;XMenu&lt;/a&gt; - It provides explorer-style access to your favorite folders and Mac apps from the menu bar. You can launch apps, browse files and folders right from the menu bar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://justgetflux.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Flux&lt;/a&gt; - It automatically dims the brightness of your screen based on the time of the day - warm at night, bright during the day - so your eyes feel less strain. Also see the &lt;a href=&quot;/software/computer-eye-exercise/14069/&quot;&gt;20 20 20 rule&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://textexpander.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Text Expander&lt;/a&gt; - The app accelerates your &lt;a href=&quot;/internet/teach-yourself-touch-typing-with-free-tools/28849/&quot;&gt;touch typing&lt;/a&gt; by replacing pre-defined abbreviations with corresponding phrases. For instance, say &lt;code class=&quot;language-text&quot;&gt;;sig&lt;/code&gt; to add your &lt;a href=&quot;/internet/gmail-html-signatures/13727/&quot;&gt;rich signature&lt;/a&gt; in the Gmail window.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.mediaatelier.com/CheatSheet/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;CheatSheet&lt;/a&gt; - Use this app to memorize keyboard shortcuts for any Mac app. Just hold the Command Key a bit longer to get a list of all shortcuts available in that app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mattingalls/Soundflower&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Soundflower&lt;/a&gt; - If you are to &lt;a href=&quot;/software/record-mac-audio/1743/&quot;&gt;record the Mac audio&lt;/a&gt;, like the sound coming out of the speakers, you would need SoundFlower to route that sound to the recording app instead of the speakers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jumpshare.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;JumpShare&lt;/a&gt; - Quickly upload files, record screencasts, capture screenshots and share them instantly, all from the convenience of your menu bar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/in/app/gif-brewery-3-by-gfycat/id1081413713?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;GIF Brewery&lt;/a&gt; - It can convert video files and &lt;a href=&quot;/software/video-demo-with-animated-gif/28095/&quot;&gt;screencasts into animated GIFs&lt;/a&gt; and offers tons of options to fine-tune your GIF images. Also see, &lt;a href=&quot;https://apps.apple.com/us/app/giphy-capture-the-gif-maker/id668208984?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Giphy Capture&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://hocusfoc.us&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Hocus Focus&lt;/a&gt; - It helps keep your Mac desktop clean by automatically hiding windows that are inactive or haven’t been used for a while. You can even choose to hide windows as soon as they lose focus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/in/app/bandwidth/id490461369?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Bandwidth+&lt;/a&gt; - Monitor your Internet bandwidth usage in realtime. Especially handy when you are connected to a metered Wi-Fi hotspot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kyleneideck/BackgroundMusic&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Background Music&lt;/a&gt; - An audio utility that provides per-application volume control for your Mac. It automatically pauses your music player when a second audio source is playing and unpauses the player when the second source has stopped.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://www.labnol.org/images/2023/file-transfer.gif&quot; alt=&quot;Simple File Transfer for Mac&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;42&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/in/app/download-shuttle-fast-file/id847809913?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Download Shuttle&lt;/a&gt; - A fast download manager for Mac that will split the files into multiple chunks and downloads them in parallel. Can pause and resume downloads too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/app/wetransfer/id1114922065?ls=1&amp;amp;mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;WeTransfer&lt;/a&gt;- Send big files to anyone by simply drag and drop. You get a download link that automatically becomes inactive after 7 days.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cockos.com/licecap/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;LICEcap&lt;/a&gt; - A light-weight screencast app for capturing any area of your Mac desktop as a small GIF file. Also see, &lt;a href=&quot;https://getkap.co/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Kap&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.noodlesoft.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Hazel&lt;/a&gt; - A folder monitoring app that lets you specify rules per watched folder and any files added to these folders are automatically organized. Supports AppleScript and Automator actions too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zoho.com/accounts/oneauth.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Zoho OneAuth&lt;/a&gt; - The only 2-factor authentication (2FA) app you need to secure your Gmail, Facebook and all other online accounts. OneAuth is available on iOS, Android, Mac and Windows devices and you can even import accounts from Google Authenticator. Another good alternative is &lt;a href=&quot;https://authy.com/download/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Authy&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://selfcontrolapp.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Self Control&lt;/a&gt; - To help you stop procrastinating, this Mac app that can temporarily block access to time-wasting websites, emails and everything else that you find distracting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://folivora.ai/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Better Touch Tool&lt;/a&gt; - The app lets you modify the gestures of your Magic Mouse and the &lt;a href=&quot;/software/apple-magic-trackpad-with-windows/14158/&quot;&gt;Magic Trackpad&lt;/a&gt;. You can configure Touch Bar settings and actions too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://obsproject.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;OBS&lt;/a&gt; - If you ever plan to set up a live stream on Twitch or YouTube, OBS is the only streaming software you’d need.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://zoom.us/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Zoom&lt;/a&gt; - My favorite app for video conferencing on Mac. You can do screen sharing, the meetings are automatically recorded and you can remotely control the attendee’s computer for tech support.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/app/apple-store/id1274495053&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;To Do&lt;/a&gt; - A perfect todo and task management app for your Mac from Microsoft. Also see, &lt;a href=&quot;/internet/trello-basics-getting-started/29044/&quot;&gt;Trello&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://handmirror.app/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Hand Mirror&lt;/a&gt; - It lives in the menu bar of your Mac and quickly gives you a view from your webcam. Handy to know how you look before you join that Skype or Zoom video call.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://reincubate.com/camo/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Camo&lt;/a&gt; - Use your iPhone or Android phone as a webcam for your Mac. The app works with Zoom, Skype, Meet and other video conferencing apps. Also see &lt;a href=&quot;https://iriun.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Irium&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://getkap.co/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Kap&lt;/a&gt; - Record quick screencasts as GIFs and MP4 videos and upload them to GIPHY, Dropbox, Vercel (Now) or Amazon S3 directly from the app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jgraph/drawio-desktop/releases&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Diagrams.net&lt;/a&gt; - The best tool for creating diagrams and flowcharts. It’s like Microsoft Visio but completely free.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/in/app/hiddenme-hide-desktop-icons/id467040476?mt=12&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;HiddenMe&lt;/a&gt; - If your Mac desktop is cluttered with folders and files, you can hide all the icons with a single click or with a keyboard shortcut.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/de/app/meeter-fast-call-initiation/id1510445899&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Meeter&lt;/a&gt; - Keep track of your upcoming online meetings from Zoom, Google Meet, Microsoft Teams and other virtual conference services and join the meeting directly from your Mac’s menubar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/in/app/keypad-bluetooth-keyboard/id1491684442&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;KeyPad&lt;/a&gt; - Use the connected physical keyboard of your Mac to type on your iPhone, iPad and Android phone.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Also see: &lt;a href=&quot;/internet/101-useful-websites/18078/&quot;&gt;The 101 Most Useful Websites&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/74wnvSI&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/6532602482120312839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/05/essential-mac-apps-and-utilities-2023.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/6532602482120312839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/6532602482120312839'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/05/essential-mac-apps-and-utilities-2023.html' title='Essential Mac Apps and Utilities - 2023 Edition'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-4470156848924426943</id><published>2023-05-03T08:07:00.001-07:00</published><updated>2023-05-03T08:07:30.189-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>Find Free Udemy Courses with Google Sheets and the Udemy API</title><content type='html'>&lt;p&gt;Whether you are looking to &lt;a href=&quot;/internet/learn-coding-online/28537/&quot;&gt;learn a programming language&lt;/a&gt;, enhance your Microsoft Excel skills, or acquire knowledge in Machine Learning, Udemy probably has a video course for you. &lt;a href=&quot;/internet/buying-udemy-courses/31851/&quot;&gt;Udemy courses&lt;/a&gt; are usually affordable, there are no subscription fee and you can learn at your own pace.&lt;/p&gt;
&lt;h2 id=&quot;free-udemy-courses-on-programming&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#free-udemy-courses-on-programming&quot; aria-label=&quot;free udemy courses on programming permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Free Udemy Courses on Programming&lt;/h2&gt;
&lt;p&gt;While most video tutorials on Udemy require payment, the website also offers some of their highly-rated courses for free. I’ve prepared a &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1KkfoKjgeem4vd3ylbktby0mdnWlui_6J0FO0vt9zwTw/edit&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Sheet&lt;/a&gt; that lists all the free programming courses currently available on Udemy. The spreadsheet is updated automatically every few hours. You can also access the &lt;a href=&quot;https://docs.google.com/spreadsheets/d/e/2PACX-1vQSDlgFIyy8JSEqDI_mB6i6x3Ed_OvxHpbSjyjnYsJzNvJU6abiqhM4iYMh0xlwWklg3TKa-iTgsn9C/pubhtml&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;web version&lt;/a&gt; for easy browsing.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1KkfoKjgeem4vd3ylbktby0mdnWlui_6J0FO0vt9zwTw/edit&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Free Udemy Courses&quot; title=&quot;Free Udemy Courses&quot; src=&quot;/static/c7f885f9d25913a51bf6871a26383699/16546/191645.png&quot; srcset=&quot;/static/c7f885f9d25913a51bf6871a26383699/96042/191645.png 180w,/static/c7f885f9d25913a51bf6871a26383699/7a322/191645.png 360w,/static/c7f885f9d25913a51bf6871a26383699/16546/191645.png 720w,/static/c7f885f9d25913a51bf6871a26383699/6d80e/191645.png 1080w,/static/c7f885f9d25913a51bf6871a26383699/064e6/191645.png 1117w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/span&gt;&lt;/a&gt; ✨ You may use the search function of the browser (Ctrl + F) to find courses for a specific programming language or topic. The courses are sorted by popularity.&lt;/p&gt;
&lt;p&gt;There’s no secret sauce. Udemy has an &lt;a href=&quot;https://www.udemy.com/developers/affiliate/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;developer API&lt;/a&gt; that provides access to all the course data available on the website, including user ratings, number of students who have taken the course, duration, preview video lectures, and more.&lt;/p&gt;
&lt;h2 id=&quot;use-the-udemy-api-with-google-sheets&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#use-the-udemy-api-with-google-sheets&quot; aria-label=&quot;use the udemy api with google sheets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Use the Udemy API with Google Sheets&lt;/h2&gt;
&lt;p&gt;The Udemy API is free to use but requires authentication. You can &lt;a href=&quot;https://www.udemy.com/user/edit-api-clients/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;generate the credentials&lt;/a&gt; for your Udemy account and then use the &lt;code class=&quot;language-text&quot;&gt;/courses&lt;/code&gt; endpoint to fetch the list of free courses.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;parseCourseData_&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;courses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt;
  courses
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; is_paid&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; primary_category &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt;
        is_paid &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Development&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;IT &amp;amp; Software&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;primary_category&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// We are primarily interested in programming courses on Udemy&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;=IMAGE(&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;image_240x135&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;)&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;=HYPERLINK(&quot;https://www.udemy.com&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;;&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;)&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;visible_instructors&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; display_name &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; display_name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;, &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;num_subscribers&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;avg_rating &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;num_reviews&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content_info_short&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;num_lectures&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_update_date&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;listUdemyCoursesGoneFree&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Put your Udemy credentials here&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CLIENT_ID&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CLIENT_SECRET&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; params &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;page&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;page_size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;is_paid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&#39;fields[course]&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@all&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; query &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;entries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;key&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;amp;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; apiUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://www.udemy.com/api-2.0/courses/?&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;query&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; bearer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Utilities&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;base64Encode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CLIENT_ID&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CLIENT_SECRET&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; options &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;muteHttpExceptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Basic &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;bearer&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; courses &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; UrlFetchApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;apiUrl&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; results &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; next &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    courses&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parseCourseData_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;results&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; next&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; courses&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; SpreadsheetApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getActiveSpreadsheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sheet&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSheets&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  sheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getLastRow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getLastColumn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearContent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  sheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; courses&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; courses&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;courses&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We use the &lt;a href=&quot;/urlfetch/&quot;&gt;UrlFetch service&lt;/a&gt; of Google Scripts to fetch the data from the Udemy API and the data is then parsed and inserted into the Google Sheet. The course thumbnail image is rendered using the &lt;a href=&quot;/internet/images-in-google-spreadsheet/18167/&quot;&gt;IMAGE formula&lt;/a&gt; and the course title is linked to the Udemy website using the &lt;a href=&quot;/code/google-sheets-hyperlinks-2006232&quot;&gt;HYPERLINK formula&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;related-reading&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#related-reading&quot; aria-label=&quot;related reading permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Related reading:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/internet/learn-coding-online/28537/&quot;&gt;The Best Websites to Learn to Coding Online&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/internet/learn-web-development/31945/&quot;&gt;The Best Online Teachers for Learning Web Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/internet/buying-udemy-courses/31851/&quot;&gt;Read this before buying a Udemy Course&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/idKo3yZ&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/4470156848924426943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/05/find-free-udemy-courses-with-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/4470156848924426943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/4470156848924426943'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/05/find-free-udemy-courses-with-google.html' title='Find Free Udemy Courses with Google Sheets and the Udemy API'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-6489855753754629737</id><published>2023-04-27T01:07:00.001-07:00</published><updated>2023-04-27T01:07:53.218-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>New MX Records for Using Gmail with Google Workspace</title><content type='html'>&lt;p&gt;Mail Exchange (MX) records, in simple English, tell the internet where to deliver your emails. These records enable email servers to know which mail servers are responsible for accepting incoming messages for a given domain.&lt;/p&gt;
&lt;p&gt;When you are using Gmail with your Google Workspace domain, Google provides you with a set of MX records in the format &lt;code class=&quot;language-text&quot;&gt;ASPMX.L.GOOGLE.COM&lt;/code&gt; and you need to add five such records to your domain. These MX records point incoming emails to Google’s mail servers, which then deliver the emails to your Gmail inbox.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Host / Mail Server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;ASPMX.L.GOOGLE.COM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;ALT1.ASPMX.L.GOOGLE.COM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;ALT2.ASPMX.L.GOOGLE.COM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;ALT3.ASPMX.L.GOOGLE.COM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;ALT4.ASPMX.L.GOOGLE.COM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These MX records specify the priority and destination of email messages. The priority numbers indicate the order in which the email servers should be tried.&lt;/p&gt;
&lt;p&gt;When a sender sends an email to your domain, their email server will look up your domain’s MX records to determine where to deliver the email. The server will try the first mail server listed (priority 1), and if that server is unavailable or unreachable, it will try the next one listed (priority 5), until the email message is successfully delivered.&lt;/p&gt;
&lt;h2 id=&quot;new-mx-records-for-google-workspace&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#new-mx-records-for-google-workspace&quot; aria-label=&quot;new mx records for google workspace permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;New MX Records for Google Workspace&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/e38ddb3da0cc041d7e2b9123a1c6d1c1/f51ab/google-workspace-mx-records.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Google Workspace MX Records for Gmail&quot; title=&quot;Google Workspace MX Records for Gmail&quot; src=&quot;/static/e38ddb3da0cc041d7e2b9123a1c6d1c1/16546/google-workspace-mx-records.png&quot; srcset=&quot;/static/e38ddb3da0cc041d7e2b9123a1c6d1c1/96042/google-workspace-mx-records.png 180w,/static/e38ddb3da0cc041d7e2b9123a1c6d1c1/7a322/google-workspace-mx-records.png 360w,/static/e38ddb3da0cc041d7e2b9123a1c6d1c1/16546/google-workspace-mx-records.png 720w,/static/e38ddb3da0cc041d7e2b9123a1c6d1c1/f51ab/google-workspace-mx-records.png 955w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Google has simplified the MX records for new Google Workspace accounts that are created after April 2023. You now only need to add one MX record to your domain. The priority value is always 1 and the destination is &lt;code class=&quot;language-text&quot;&gt;SMTP.GOOGLE.COM&lt;/code&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Host / Mail Server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;SMTP.GOOGLE.COM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You may find the updated MX records &lt;a href=&quot;https://support.google.com/a/answer/174125&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;. Google Workspace evangelist &lt;a href=&quot;https://www.linkedin.com/in/mbrenzel/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Michael Brenzel&lt;/a&gt; suggest that the new MX records should be used for only new Google Workspace accounts, and that there’s no need to change the DNS records for existing Workspace domains.&lt;/p&gt;
&lt;h3 id=&quot;mx-records-references&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#mx-records-references&quot; aria-label=&quot;mx records references permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;MX Records References:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/a/answer/140034&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Setup MX Records for Google Workspace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://toolbox.googleapps.com/apps/dig/#MX/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Check MX Records of your domain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/a/answer/140038&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Troubleshoot MX Records for Gmail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/EysHuoW&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/6489855753754629737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/04/new-mx-records-for-using-gmail-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/6489855753754629737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/6489855753754629737'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/04/new-mx-records-for-using-gmail-with.html' title='New MX Records for Using Gmail with Google Workspace'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-8813333379117145127</id><published>2023-04-26T06:10:00.001-07:00</published><updated>2023-04-26T06:10:07.537-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Use Conditional Logic in Google Documents</title><content type='html'>&lt;p&gt;Conditional content allows you to customize your Google Docs template and generate different versions of the same document based on the user’s answers. In this tutorial, I’ll show you how to use &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/conditional-content/google-docs&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;conditional content&lt;/a&gt; in Google Docs using &lt;a href=&quot;https://workspace.google.com/marketplace/app/document_studio/429444628321&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Document Studio&lt;/a&gt;, a Google add-on that automates document creation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you are new here, please follow this &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/tutorial&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;step-by-step guide&lt;/a&gt; on how to generate documents from data in Google Sheets and Google Forms responses.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;conditionally-display-content&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#conditionally-display-content&quot; aria-label=&quot;conditionally display content permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Conditionally Display Content&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/b5e301e9e017fcbbd0746f8df80c1c82/beb51/job-offer-letters.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Job Candidates in Google Sheets&quot; title=&quot;Job Candidates in Google Sheets&quot; src=&quot;/static/b5e301e9e017fcbbd0746f8df80c1c82/16546/job-offer-letters.png&quot; srcset=&quot;/static/b5e301e9e017fcbbd0746f8df80c1c82/96042/job-offer-letters.png 180w,/static/b5e301e9e017fcbbd0746f8df80c1c82/7a322/job-offer-letters.png 360w,/static/b5e301e9e017fcbbd0746f8df80c1c82/16546/job-offer-letters.png 720w,/static/b5e301e9e017fcbbd0746f8df80c1c82/beb51/job-offer-letters.png 853w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Let’s say you are a recruiter who wants to use a Google Docs template to send out job offer letters to candidates. You want to include specific information in the offer letter based on the candidate’s job title and location.&lt;/p&gt;
&lt;p&gt;The conditional statements that we would like to include in the document template are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Your office is located in San Francisco. Your offer letter should include a paragraph offering relocation benefits only to candidates who are located outside SF.&lt;/li&gt;
&lt;li&gt;If the candidate is offered an Associate position, they are eligible for basic benefits.&lt;/li&gt;
&lt;li&gt;If the candidate is hired for a senior position, like Manager or Director, they are entitled to additional benefits like 401(k) retirement plan.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;define-the-conditional-sections&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#define-the-conditional-sections&quot; aria-label=&quot;define the conditional sections permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Define the conditional sections&lt;/h3&gt;
&lt;p&gt;Create a new Google Docs document and create a job offer letter template. Include sections for the candidate’s name, job title, location, salary, and benefits package.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/88aca6ac94f2e0d60bc80d2bf3fc68e3/05d3a/conditional-content.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Conditional Logic in Google Docs&quot; title=&quot;Conditional Logic in Google Docs&quot; src=&quot;/static/88aca6ac94f2e0d60bc80d2bf3fc68e3/16546/conditional-content.png&quot; srcset=&quot;/static/88aca6ac94f2e0d60bc80d2bf3fc68e3/96042/conditional-content.png 180w,/static/88aca6ac94f2e0d60bc80d2bf3fc68e3/7a322/conditional-content.png 360w,/static/88aca6ac94f2e0d60bc80d2bf3fc68e3/16546/conditional-content.png 720w,/static/88aca6ac94f2e0d60bc80d2bf3fc68e3/05d3a/conditional-content.png 1006w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Use the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;&amp;lt;if&amp;gt;&amp;gt;&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;&amp;lt;&amp;lt;endif&amp;gt;&amp;gt;&lt;/code&gt; expressions to define the conditional sections in your template. For example, you might use the following expressions to show or hide the relocation package section based on the candidate’s location:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;If&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Location&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;San Francisco&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;
We are pleased to offer you a relocation &lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; to assist &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; your move from &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Location&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; to our main office&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;EndIf&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Similarly, you can wrap the benefits paragraph with the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;&amp;lt;if&amp;gt;&amp;gt;&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;&amp;lt;&amp;lt;endif&amp;gt;&amp;gt;&lt;/code&gt; expressions to show or hide the benefits package section based on the candidate’s job title:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;If&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;OR&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Job Title&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Manager&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Job Title&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Director&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;
As &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Job Title&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; you will be eligible &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; our comprehensive benefits &lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; which includes health&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dental&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; and vision insurance&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; a &lt;span class=&quot;token number&quot;&gt;401&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;k&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; retirement plan&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; and more&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;EndIf&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;You may also use the &lt;code class=&quot;language-text&quot;&gt;~&lt;/code&gt; contains operator in place of &lt;code class=&quot;language-text&quot;&gt;==&lt;/code&gt; equals operator for partial matches. For instance, &lt;code class=&quot;language-text&quot;&gt;~ &#39;Manager&#39;&lt;/code&gt; will match &lt;code class=&quot;language-text&quot;&gt;Sales Manager&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Senior Manager&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Manager&lt;/code&gt; and so on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here’s how the final &lt;a href=&quot;https://docs.google.com/document/d/19Tn5GOqiyAWneyFnVVMn8BnqSY_ebUIHmT3FdGHWKuw/edit?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;job offer letter template&lt;/a&gt; looks like.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=UbMlmckpZDg&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=UbMlmckpZDg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In addition to document templates, you can also add conditional text in email templates with the help of &lt;a href=&quot;https://digitalinspiration.com/docs/document-studio/scriptlets&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;scriptlets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Things to know:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You may not nest IF statements inside each other.&lt;/li&gt;
&lt;li&gt;You can use the &lt;code class=&quot;language-text&quot;&gt;OR&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;AND&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;NOR&lt;/code&gt; operator to combine multiple conditions.&lt;/li&gt;
&lt;li&gt;If you have a table in your document that should be displayed conditionally, you should put the wrapping &lt;code class=&quot;language-text&quot;&gt;&amp;lt;&amp;lt;if&amp;gt;&amp;gt;&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;&amp;lt;&amp;lt;endif&amp;gt;&amp;gt;&lt;/code&gt; tags outside the table.&lt;/li&gt;
&lt;li&gt;It is currently not possible to hide or show specific rows or columns of a table based on the user’s answers.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/UcSwmLv&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/8813333379117145127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/04/how-to-use-conditional-logic-in-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8813333379117145127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/8813333379117145127'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/04/how-to-use-conditional-logic-in-google.html' title='How to Use Conditional Logic in Google Documents'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-5816011932957409219</id><published>2023-04-05T05:08:00.001-07:00</published><updated>2023-04-05T05:08:03.184-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>How to Make Phone Numbers Callable in Google Sheets and Docs</title><content type='html'>&lt;p&gt;This tutorial explains how to make phone numbers clickable within Google Sheets, Slides and Google Docs. When someone clicks on the phone number link in your spreadsheet or this document, it will open the dialer on their mobile phone and initiate dialing of the specified phone number.&lt;/p&gt;
&lt;h3 id=&quot;how-to-insert-clickable-phone-numbers-in-web-pages&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#how-to-insert-clickable-phone-numbers-in-web-pages&quot; aria-label=&quot;how to insert clickable phone numbers in web pages permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;How to Insert Clickable Phone Numbers in Web Pages&lt;/h3&gt;
&lt;p&gt;Let’s start with the basics.&lt;/p&gt;
&lt;p&gt;If you click an &lt;a href=&quot;/internet/email/learn-mailto-syntax/6748/&quot;&gt;email link&lt;/a&gt; on a webpage, it opens your default mail program. Similarly, you can make phone numbers on your website “callable” meaning when someone clicks on the phone number link, it will automatically launch the dialer on their mobile phone with the phone number filled in.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/83f1f415c8b57e047f5fe6664df505c6/a331c/html-telephone-links.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;html-telephone-links.png&quot; title=&quot;html-telephone-links.png&quot; src=&quot;/static/83f1f415c8b57e047f5fe6664df505c6/16546/html-telephone-links.png&quot; srcset=&quot;/static/83f1f415c8b57e047f5fe6664df505c6/96042/html-telephone-links.png 180w,/static/83f1f415c8b57e047f5fe6664df505c6/7a322/html-telephone-links.png 360w,/static/83f1f415c8b57e047f5fe6664df505c6/16546/html-telephone-links.png 720w,/static/83f1f415c8b57e047f5fe6664df505c6/a331c/html-telephone-links.png 800w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You can use the &lt;code class=&quot;language-text&quot;&gt;tel&lt;/code&gt; protocol to convert a plain text phone number on a web page into a clickable telephone link.&lt;/p&gt;
&lt;p&gt;For instance, if you click &lt;a href=&quot;tel:12024561111&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;this link&lt;/a&gt; on a mobile phone, it will open the phone dialer prefilled with the specified number. There’s no need to copy-paste numbers.&lt;/p&gt;
&lt;h3 id=&quot;how-to-type-phone-numbers-in-google-sheets&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#how-to-type-phone-numbers-in-google-sheets&quot; aria-label=&quot;how to type phone numbers in google sheets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;How to Type Phone Numbers in Google Sheets&lt;/h3&gt;
&lt;p&gt;It is a bit tricky to type phone numbers inside Google Spreadsheets. Here’s why:&lt;/p&gt;
&lt;p&gt;Phone numbers typically consist of digits preceded by the plus (+) symbol. However, a common issue is that when you include the plus sign in a cell, the spreadsheet assumes you are entering a math formula and attempts to calculate the value.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/32d43ca889f3951325a8398760ed7020/43a06/phone-number-formatting.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;phone-number-formatting.png&quot; title=&quot;phone-number-formatting.png&quot; src=&quot;/static/32d43ca889f3951325a8398760ed7020/16546/phone-number-formatting.png&quot; srcset=&quot;/static/32d43ca889f3951325a8398760ed7020/96042/phone-number-formatting.png 180w,/static/32d43ca889f3951325a8398760ed7020/7a322/phone-number-formatting.png 360w,/static/32d43ca889f3951325a8398760ed7020/16546/phone-number-formatting.png 720w,/static/32d43ca889f3951325a8398760ed7020/43a06/phone-number-formatting.png 820w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you encounter this problem, there are two easy ways to resolve it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workaround A&lt;/strong&gt; You can surround the phone number with double quotes (”) and precede it with an equal sign (=).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workaround B&lt;/strong&gt; You can add a single quote (’) before the phone number. This tells Google Sheets to treat the cell’s contents as text, preserving the formatting of the phone number.&lt;/p&gt;
&lt;h3 id=&quot;how-to-make-phone-numbers-clickable-in-google-sheets&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#how-to-make-phone-numbers-clickable-in-google-sheets&quot; aria-label=&quot;how to make phone numbers clickable in google sheets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;How to Make Phone Numbers Clickable in Google Sheets&lt;/h3&gt;
&lt;p&gt;Coming to the main problem, how do you make phone numbers inside a Google Sheet clickable?&lt;/p&gt;
&lt;p&gt;The obvious choice would be to use the &lt;a href=&quot;/code/google-sheets-hyperlinks-2006232&quot;&gt;HYPERLINK formula&lt;/a&gt; with the tel protocol but it is not supported inside Google Sheets. So a formula like&amp;nbsp;&lt;code class=&quot;language-text&quot;&gt;=HYPERLINK(&quot;tel:12345&quot;, &quot;Call Me&quot;)&lt;/code&gt; would not work but there’s a simple workaround to this issue.&lt;/p&gt;
&lt;p&gt;Append the phone number with the &lt;code class=&quot;language-text&quot;&gt;call.ctrlq.org&lt;/code&gt; domain name and it will automatically convert the phone number into a clickable link. For example, if you want to create a clickable phone link for the number &lt;code class=&quot;language-text&quot;&gt;+1 650-253-0000&lt;/code&gt;, you can use the following formula.&lt;/p&gt;
&lt;p&gt;You&amp;nbsp;can create a regular hyperlink in the cell pointing to a website which in turn redirects to the actual telephone link. To see this in action, add &lt;code class=&quot;language-text&quot;&gt;https://call.ctrlq.org/&lt;/code&gt; before any phone number in the Google Sheet and it will turn into a callable phone link.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;HYPERLINK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://call.ctrlq.org/+16502530000&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Call Google Support&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1tzOgGqwiaMtPhOqKJ86ToXcNTUadeti7J8aJihxAIQs/edit?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:544px&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;google-sheet-phone-links.png&quot; title=&quot;google-sheet-phone-links.png&quot; src=&quot;/static/3875fcc358b6f40a3f19dd5c1640c0c6/a3216/google-sheet-phone-links.png&quot; srcset=&quot;/static/3875fcc358b6f40a3f19dd5c1640c0c6/96042/google-sheet-phone-links.png 180w,/static/3875fcc358b6f40a3f19dd5c1640c0c6/7a322/google-sheet-phone-links.png 360w,/static/3875fcc358b6f40a3f19dd5c1640c0c6/a3216/google-sheet-phone-links.png 544w&quot; sizes=&quot;(max-width: 544px) 100vw, 544px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the above example, the phone numbers are listed in column B while the names are in column A. You can add the following formula in column C to have clickable phone links.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;HYPERLINK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://call.ctrlq.org/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;B2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You may open this&amp;nbsp;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1tzOgGqwiaMtPhOqKJ86ToXcNTUadeti7J8aJihxAIQs/edit?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Phone Number Google Sheet&lt;/a&gt; on your Android or iPhone and click on any of the phone links to see it in action. You can even &lt;a href=&quot;https://docs.google.com/spreadsheets/d/e/2PACX-1vSD2Uws4uzR2JOL4EMGLEPegDWcin78jwcV19FHnOtdfY8pLmLn3x63WxqTactmAaQJQTbOAfJ9QSV7/pubhtml?gid=0&amp;amp;single=true&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;publish the sheet&lt;/a&gt; as a web page and the numbers will be clickable on the web too.&lt;/p&gt;
&lt;h3 id=&quot;clickable-phone-numbers-in-google-docs-and-slides&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#clickable-phone-numbers-in-google-docs-and-slides&quot; aria-label=&quot;clickable phone numbers in google docs and slides permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Clickable Phone Numbers in Google Docs and Slides&lt;/h3&gt;
&lt;p&gt;You can also create clickable phone numbers in Google Docs and Google Slides. The process is similar to Google Sheets but we’ll use the &lt;code class=&quot;language-text&quot;&gt;Insert Link&lt;/code&gt; option instead of the &lt;code class=&quot;language-text&quot;&gt;HYPERLINK&lt;/code&gt; formula.&lt;/p&gt;
&lt;p&gt;Write the phone number inside the document and select it. Then click on the &lt;code class=&quot;language-text&quot;&gt;Insert&lt;/code&gt; menu and select &lt;code class=&quot;language-text&quot;&gt;Link&lt;/code&gt; from the dropdown. Or you can use the keyboard shortcut &lt;code class=&quot;language-text&quot;&gt;Ctrl+K&lt;/code&gt; to open the link dialog.&lt;/p&gt;
&lt;p&gt;Enter the phone number preceded by the &lt;code class=&quot;language-text&quot;&gt;call.ctrlq.org&lt;/code&gt; domain name and click on the &lt;code class=&quot;language-text&quot;&gt;OK&lt;/code&gt; button. The phone number will be converted into a clickable link.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/6b5b989479b9cadee19566269b8f3bce/7ebd0/163645.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Phone numbers in Google Docs&quot; title=&quot;Phone numbers in Google Docs&quot; src=&quot;/static/6b5b989479b9cadee19566269b8f3bce/16546/163645.png&quot; srcset=&quot;/static/6b5b989479b9cadee19566269b8f3bce/96042/163645.png 180w,/static/6b5b989479b9cadee19566269b8f3bce/7a322/163645.png 360w,/static/6b5b989479b9cadee19566269b8f3bce/16546/163645.png 720w,/static/6b5b989479b9cadee19566269b8f3bce/7ebd0/163645.png 782w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Also see: &lt;a href=&quot;/internet/images-in-google-spreadsheet/18167/&quot;&gt;Add Images in Google Spreadsheets&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;the-technical-details&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-technical-details&quot; aria-label=&quot;the technical details permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;The Technical Details&lt;/h4&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;call.ctrlq.org&lt;/code&gt; service is a simple Node.js app running on Google Cloud Run that merely redirects to the &lt;code class=&quot;language-text&quot;&gt;tel&lt;/code&gt; protocol. Here’s the entire app code should you want to run it on your own server.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; express &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;express&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;express&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;/:number&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; number &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; phone &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; number&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[^0-9]&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;tel:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;phone&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PORT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;App is running&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/tQWkOMC&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/5816011932957409219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/04/how-to-make-phone-numbers-callable-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/5816011932957409219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/5816011932957409219'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/04/how-to-make-phone-numbers-callable-in.html' title='How to Make Phone Numbers Callable in Google Sheets and Docs'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8912422413468109862.post-1398010788946721945</id><published>2023-03-31T03:07:00.001-07:00</published><updated>2023-03-31T03:07:16.967-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Digital Inspiration"/><title type='text'>Useful NPM Tips and Tricks for Developers to Boost Productivity</title><content type='html'>&lt;p&gt;NPM, short for Node Package Manager, is a widely-used tool for managing JavaScript packages in a project. It allows developers to install and update packages, as well as manage dependencies and scripts. NPM comes bundled with Node.js, so if you have Node installed on your machine, you automatically have access to NPM as well.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;&lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/888870ed1a83c35c0375afc71a49b914/41913/npm-tricks.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;NPM Tips and Tricks&quot; title=&quot;NPM Tips and Tricks&quot; src=&quot;/static/888870ed1a83c35c0375afc71a49b914/16546/npm-tricks.png&quot; srcset=&quot;/static/888870ed1a83c35c0375afc71a49b914/96042/npm-tricks.png 180w,/static/888870ed1a83c35c0375afc71a49b914/7a322/npm-tricks.png 360w,/static/888870ed1a83c35c0375afc71a49b914/16546/npm-tricks.png 720w,/static/888870ed1a83c35c0375afc71a49b914/6d80e/npm-tricks.png 1080w,/static/888870ed1a83c35c0375afc71a49b914/843f9/npm-tricks.png 1440w,/static/888870ed1a83c35c0375afc71a49b914/41913/npm-tricks.png 2048w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;npm-commands-you-should-know&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#npm-commands-you-should-know&quot; aria-label=&quot;npm commands you should know permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;npm Commands You Should Know&lt;/h2&gt;
&lt;p&gt;This is not a tutorial for learning npm, the &lt;a href=&quot;https://docs.npmjs.com/about-npm&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;official docs&lt;/a&gt; are a good place to get started, but a collection of tips and tricks that will help you do more with the &lt;code class=&quot;language-text&quot;&gt;npm&lt;/code&gt; utility. Whether you’re a seasoned developer or just starting out, these tips can help you be more efficient and productive in your work with npm.&lt;/p&gt;
&lt;h3 id=&quot;instantly-run-packages-without-installing&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#instantly-run-packages-without-installing&quot; aria-label=&quot;instantly run packages without installing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Instantly run packages without installing&lt;/h3&gt;
&lt;p&gt;The NPM registry is a treasure trove for finding packages that do useful stuff and they aren’t just for &lt;a href=&quot;/internet/useful-tools-for-programmers/29227/&quot;&gt;programmers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For instance, the &lt;code class=&quot;language-text&quot;&gt;speed-test&lt;/code&gt; package shows the speed of your internet connection. The &lt;code class=&quot;language-text&quot;&gt;emoj&lt;/code&gt; package helps you search for emojis from the terminal. And the &lt;code class=&quot;language-text&quot;&gt;wifi-passwords&lt;/code&gt; package can help you &lt;a href=&quot;/software/find-wi-fi-network-password/28949/&quot;&gt;find the password&lt;/a&gt; of your current WiFi network.&lt;/p&gt;
&lt;p&gt;You can run these utility packages directly from the command line using the &lt;a href=&quot;https://www.npmjs.com/package/npx&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;npx&lt;/a&gt; command.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;npx speed-test
npx emoj unicorn
npx public-ip-cli
npx wifi-password-cli&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;get-package-details&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#get-package-details&quot; aria-label=&quot;get package details permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Get package details&lt;/h3&gt;
&lt;p&gt;Use the &lt;code class=&quot;language-text&quot;&gt;npm view&lt;/code&gt; command to get details of any npm package, including the repository URL, the dependencies and the date when the package was last updated.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; view eslint&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;install-npm-packages-faster&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#install-npm-packages-faster&quot; aria-label=&quot;install npm packages faster permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Install npm packages faster&lt;/h3&gt;
&lt;p&gt;You’ve probably used &lt;code class=&quot;language-text&quot;&gt;npm install&lt;/code&gt; to install packages, and dependencies, in the local &lt;code class=&quot;language-text&quot;&gt;node_modules&lt;/code&gt; folder of a project. Replace this command with &lt;a href=&quot;https://docs.npmjs.com/cli/v7/commands/npm-ci&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;npm-ci&lt;/a&gt; and you’ll be able to install packages significantly faster.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; ci&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If a node_modules folder is already present, it will be automatically removed before &lt;code class=&quot;language-text&quot;&gt;npm ci&lt;/code&gt; begins to install packages.&lt;/p&gt;
&lt;h3 id=&quot;recover-space&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#recover-space&quot; aria-label=&quot;recover space permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Recover space&lt;/h3&gt;
&lt;p&gt;If you have been working with npm packages for some time, the various &lt;code class=&quot;language-text&quot;&gt;node_modules&lt;/code&gt; folders on the disks could be consuming several gigabytes of space. The very useful &lt;a href=&quot;https://github.com/voidcosmos/npkill&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;npkill&lt;/a&gt; finds all node_modules folders on your system and lets you delete them interactively.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;npx npkill&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;quickly-download-a-git-repository&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#quickly-download-a-git-repository&quot; aria-label=&quot;quickly download a git repository permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Quickly download a Git repository&lt;/h3&gt;
&lt;p&gt;Most developers use the &lt;code class=&quot;language-text&quot;&gt;git clone&lt;/code&gt; command to download a Git repository. However, this also downloads the entire git history making the process slower. The &lt;a href=&quot;https://www.npmjs.com/package/degit&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;degit&lt;/a&gt; package can download the latest commit to the master branch locally and you need not specify the full Github URL.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;npx degit username/repo
npx degit labnol/apps-script-starter&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;list-installed-packages&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#list-installed-packages&quot; aria-label=&quot;list installed packages permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;List installed packages&lt;/h3&gt;
&lt;p&gt;Generate a list of all npm packages that are installed on the system with global scope. Remove the &lt;code class=&quot;language-text&quot;&gt;-g&lt;/code&gt; flag to list only packages installed in the current project directory.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--depth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;find-unused-dependencies&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#find-unused-dependencies&quot; aria-label=&quot;find unused dependencies permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Find unused dependencies&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/depcheck/depcheck&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;depcheck&lt;/a&gt; command will list all the npm packages that are not used in the project based on the dependencies in &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;npx depcheck&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Use the command &lt;code class=&quot;language-text&quot;&gt;npm uninstall &amp;lt;package-name&amp;gt;&lt;/code&gt; to uninstall any unused package.&lt;/p&gt;
&lt;h3 id=&quot;find-unused-source-files&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#find-unused-source-files&quot; aria-label=&quot;find unused source files permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Find unused source files&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/smeijer/unimported&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;unimported&lt;/a&gt; package will find all the unused files and dependencies in your JavaScript / TypeScript projects.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;npx unimported&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;find-outdated-dependencies&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#find-outdated-dependencies&quot; aria-label=&quot;find outdated dependencies permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Find outdated dependencies&lt;/h3&gt;
&lt;p&gt;Get a list of all outdated packages in your current project. This command checks every single module listed in the &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; file and compares it with the latest version available in the NPM registry.&lt;/p&gt;
&lt;p&gt;Add the &lt;code class=&quot;language-text&quot;&gt;-g&lt;/code&gt; flag to get all outdated packages that are installed globally on the system.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; outdated
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; outdated &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;update-the-package-versions&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#update-the-package-versions&quot; aria-label=&quot;update the package versions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Update the package versions&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;npm outdated&lt;/code&gt; command will list all packages in your current project that are outdated and a newer version is available. Add the &lt;code class=&quot;language-text&quot;&gt;-g&lt;/code&gt; flag to list outdated packages that are installed in the global scope.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/raineorshine/npm-check-updates&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;ncu&lt;/a&gt; command will update the &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; file with the latest version of the packages listed in the &lt;code class=&quot;language-text&quot;&gt;dependencies&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;devDependencies&lt;/code&gt; sections.&lt;/p&gt;
&lt;p&gt;Or use the &lt;code class=&quot;language-text&quot;&gt;npm-check -u&lt;/code&gt; command to update packages to their latest version in interactive mode.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; outdated
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; outdated &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;
npm-check
npm-check &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt;
ncu &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;remove-extra-packages&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#remove-extra-packages&quot; aria-label=&quot;remove extra packages permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Remove extra packages&lt;/h3&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://docs.npmjs.com/cli/v7/commands/npm-prune&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;prune&lt;/a&gt; command to remove all packages that are installed locally but not listed in the &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; file. If the —dry-run flag is used then no changes will be made.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; prune&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, you can remove the &lt;code class=&quot;language-text&quot;&gt;node_modules&lt;/code&gt; folder and run &lt;code class=&quot;language-text&quot;&gt;npm ci&lt;/code&gt; again.&lt;/p&gt;
&lt;h3 id=&quot;find-vulnerable-packages&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#find-vulnerable-packages&quot; aria-label=&quot;find vulnerable packages permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Find vulnerable packages&lt;/h3&gt;
&lt;p&gt;Run the &lt;code class=&quot;language-text&quot;&gt;audit&lt;/code&gt; command to check for vulnerabilities in the packages listed in the &lt;code class=&quot;language-text&quot;&gt;dependencies&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;devDependencies&lt;/code&gt; sections. Add the &lt;code class=&quot;language-text&quot;&gt;fix&lt;/code&gt; flag to automatically apply the fixes, if any.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; audit
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; audit fix&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;useful-npm-package-websites&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#useful-npm-package-websites&quot; aria-label=&quot;useful npm package websites permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;
&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;Useful NPM Package Websites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bundlephobia.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;bundlephobia.com&lt;/a&gt; - Upload your &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; file and get an idea of how much it would cost (size-wise) to install the dependencies.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://diff.intrinsic.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;diff.intrinsic.com&lt;/a&gt; - Compare any two versions of a npm package and know which files have changed in the update.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmtrends.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;npmtrends.com&lt;/a&gt; - Compare the relative popularity of packages across the npm registry based on the number of downloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
source:https://ift.tt/JXOonvZ&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://urtrix.blogspot.com/feeds/1398010788946721945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://urtrix.blogspot.com/2023/03/useful-npm-tips-and-tricks-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1398010788946721945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8912422413468109862/posts/default/1398010788946721945'/><link rel='alternate' type='text/html' href='http://urtrix.blogspot.com/2023/03/useful-npm-tips-and-tricks-for.html' title='Useful NPM Tips and Tricks for Developers to Boost Productivity'/><author><name>sean</name><uri>http://www.blogger.com/profile/12216360484555865803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>