<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Aryan Irani</title>
    <description>The latest articles on Forem by Aryan Irani (@aryanirani123).</description>
    <link>https://forem.com/aryanirani123</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F754479%2F1d1fdf42-b44b-4b4b-beba-7125aa2a60e7.jpeg</url>
      <title>Forem: Aryan Irani</title>
      <link>https://forem.com/aryanirani123</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aryanirani123"/>
    <language>en</language>
    <item>
      <title>Google Workspace Studio Tutorial: Turn Google Forms into a Full CRM - Auto Lead Capture, Personalized Emails &amp; Team Notifications</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Tue, 07 Apr 2026 16:53:56 +0000</pubDate>
      <link>https://forem.com/gde/google-workspace-studio-tutorial-turn-google-forms-into-a-full-crm-auto-lead-capture-2og6</link>
      <guid>https://forem.com/gde/google-workspace-studio-tutorial-turn-google-forms-into-a-full-crm-auto-lead-capture-2og6</guid>
      <description>&lt;p&gt;As a consultant, I've learned one universal truth, &lt;strong&gt;The speed of your response determines the quality of your client relationships.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a potential lead fills out a Get in Touch form on your website, they are at their peak level of interest. If you wait 24 hours to email them back, that interest cools down. If you don't log their details in a CRM immediately, they become a lost lead in your inbox.&lt;/p&gt;

&lt;p&gt;In this tutorial, we are going to build a &lt;strong&gt;Lead Capture CRM Workflow&lt;/strong&gt; in Google Workspace Studio. This agent doesn't just collect data - it manages the relationship, logs the lead, drafts the perfect welcome email, and alerts your team, all while you're doing something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workflow Logic: The Lead-to-Call Pipeline
&lt;/h2&gt;

&lt;p&gt;Using &lt;strong&gt;Google Workspace Studio&lt;/strong&gt;, the agent that we will build will do the following: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically adds every new form submission to a professional Google Sheet&lt;/li&gt;
&lt;li&gt;Uses Gemini to write a warm, personalized welcome email&lt;/li&gt;
&lt;li&gt;Draft a personalized welcome email&lt;/li&gt;
&lt;li&gt;Send you an instant alert in Google Chat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you missed the previous &lt;a href="https://dev.to/gde/google-workspace-studio-tutorial-auto-organize-your-inbox-with-smart-labels-priority-3493"&gt;AI Email Labeller tutorial&lt;/a&gt;, start there for the basics. Prefer video? Click &lt;a href="https://youtu.be/YLFYu_9dkw4?si=D2rzi_jmbO0NTn61" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Prefer to watch instead of read? Check out the video version of the guide here.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/CzqVP3Bj0UI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Google Workspace Business, Enterprise, or Education plan with Gemini enabled&lt;/li&gt;
&lt;li&gt;A Google Form ready (I used Consulting Business Inquiry Form)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forhsjn14crp1ogyqzuta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forhsjn14crp1ogyqzuta.png" alt=" " width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Google Sheet set up as your CRM (we'll map it live)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Create the Flow &amp;amp; Add the Starter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://studio.workspace.google.com/" rel="noopener noreferrer"&gt;studio.workspace.google.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click + New flow and name it Lead Capture Agent: Forms to CRM, Email, and Chat&lt;/li&gt;
&lt;li&gt;Click Choose a starter → Select When a form response comes in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fua9h0e5azdifi6hyj9tu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fua9h0e5azdifi6hyj9tu.png" alt=" " width="800" height="462"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose your form (in my case: Consulting Business Inquiry Form)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hllp8ohmthveirujhss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hllp8ohmthveirujhss.png" alt=" " width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Building the Ledger (Add a Row)
&lt;/h2&gt;

&lt;p&gt;We need a single source of truth for our leads. Use the Add a row action to point to your Lead CRM Google Sheet.&lt;/p&gt;

&lt;p&gt;Set Add row to After last data row. This instantly turns every submission into a clean, searchable CRM row. Map every form field to the correct column:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timestamp → Step 1: Response time&lt;/li&gt;
&lt;li&gt;Full Name → Step 1: Full Name&lt;/li&gt;
&lt;li&gt;Work Email → Step 1: Work Email&lt;/li&gt;
&lt;li&gt;Company → Step 1: Company (and so on for all fields)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Ask Gemini to Write the Personalized Welcome Email
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Click + Add step → Ask Gemini&lt;/li&gt;
&lt;li&gt;Use this prompt:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Write a warm, professional, and personalized welcome email for a new lead based on the following form response. Make it friendly and mention that we've received their message and will get back to them soon. Use any available details like their name or company to make it feel unique.&lt;br&gt;
Form Response: {{Step 1: Form response}}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;strong&gt;+ Variables&lt;/strong&gt; button to insert the specific Form response chip into your prompt. This is what grounds Gemini in your lead's actual data. This is where we go beyond simple data entry. Gemini turns raw form data into a human-sounding email.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjywloh0e7bc13ygiscw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjywloh0e7bc13ygiscw1.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: The Handoff (Gmail &amp;amp; Google Chat)
&lt;/h2&gt;

&lt;p&gt;Finally, we put the agent to work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Draft an Email:&lt;/strong&gt; Use the Draft an email action to create a Gmail draft using the content Gemini just generated in Step 3.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8o4pywvjjt0j1b4xchh8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8o4pywvjjt0j1b4xchh8.png" alt=" " width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update Rows:&lt;/strong&gt; Use the Update rows action to change the Lead Status to Draft Created and Welcome Email Sent to Yes. This gives you a bird's-eye view of your sales pipeline right inside your Sheet.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Pro-Tip: Ensure these columns exist in your Sheet first&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhfpk8azbr5yvm6qo5er4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhfpk8azbr5yvm6qo5er4.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Notify in Chat:&lt;/strong&gt; Use the &lt;strong&gt;Notify me in Chat&lt;/strong&gt; action to send an instant alert:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6uiu9v5kw3mt86inncm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6uiu9v5kw3mt86inncm.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚀 New Lead Captured:&lt;br&gt;
Details: [Step 1: Form Response] &lt;br&gt;
Email Draft: [Step 4: Email Body] &lt;br&gt;
ID: [Step 4: Email ID]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Testing &amp;amp; Activation
&lt;/h2&gt;

&lt;p&gt;Before you hand the keys of your lead intake over to an AI agent, you need to verify that it's connecting all the dots. Workspace Studio's &lt;strong&gt;Test Run&lt;/strong&gt; feature is your best friend here. I tested with real leads (including the &lt;strong&gt;Project Quantum&lt;/strong&gt; style inquiry and a general business inquiry). Once selected, go ahead and click on &lt;strong&gt;Start&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1gmplnpmam01tom3zkr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1gmplnpmam01tom3zkr.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added the row instantly to the Sheet&lt;/li&gt;
&lt;li&gt;Drafted a natural, personalized welcome email&lt;/li&gt;
&lt;li&gt;Sent the email&lt;/li&gt;
&lt;li&gt;Updated the status&lt;/li&gt;
&lt;li&gt;Posted a clean notification in Chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once your test confirms that every step is green and the data is flowing correctly, it's time to go live. Go ahead and click the blue &lt;strong&gt;Turn on&lt;/strong&gt; button. The agent is now live and will run on every new form submission.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this changes everything
&lt;/h3&gt;

&lt;p&gt;By the time you open your laptop, your new lead is already in your CRM, a personalized email is drafted and waiting for your review, and your team is already celebrating the new opportunity in Google Chat.&lt;/p&gt;

&lt;p&gt;You haven't just saved time - you've created a scalable sales process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By the time you open your laptop, your new lead is already logged in your CRM, a personalized welcome email is drafted and waiting in Gmail, and your team has been notified in Chat.&lt;/p&gt;

&lt;p&gt;You haven't just saved time - you've created a scalable, professional first-impression system that makes every potential client feel valued from the very first second.&lt;/p&gt;

&lt;p&gt;This is the true power of Google Workspace Studio: turning simple forms into intelligent business processes that run 24/7 while you focus on what you do best.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Next?
&lt;/h3&gt;

&lt;p&gt;This is the fourth tutorial of the Google Workspace Studio tutorial series. We've built Meeting Assistants, Inbox Gatekeepers, and now CRM Agents. But the possibilities are endless.&lt;/p&gt;

&lt;p&gt;📺 &lt;strong&gt;Watch the full build:&lt;/strong&gt; If you want to see exactly how I configured the logic gates for the CRM updates, check out the video in my &lt;strong&gt;&lt;a href="https://youtube.com/playlist?list=PL_MCVBMm-9spp6kmOPkrJEgDVSyhmPWm7&amp;amp;si=VJ26877rRN11dy5v" rel="noopener noreferrer"&gt;Google Workspace Studio YouTube Playlist&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🚀 Join the Journey: Subscribe to my &lt;a href="https://www.youtube.com/@AryanIrani123" rel="noopener noreferrer"&gt;&lt;strong&gt;channel&lt;/strong&gt;&lt;/a&gt; to see how we build more agents to solve real-world business problems.&lt;/p&gt;

&lt;p&gt;💼 Consultation: Looking to deploy these AI agents across your entire team? Reach out via my &lt;strong&gt;&lt;a href="https://www.aryanirani123.com/" rel="noopener noreferrer"&gt;website&lt;/a&gt;&lt;/strong&gt; for a custom consultation.&lt;/p&gt;

&lt;p&gt;Feel free to reach out if you have any issues/feedback at &lt;a href="mailto:aryanirani123@gmail.com"&gt;aryanirani123@gmail.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>googleworkspace</category>
      <category>workspacestudio</category>
      <category>automation</category>
      <category>crm</category>
    </item>
    <item>
      <title>Google Workspace Studio Tutorial: Auto-Organize Your Inbox with Smart Labels &amp; Priority Notifications</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Thu, 02 Apr 2026 13:42:40 +0000</pubDate>
      <link>https://forem.com/gde/google-workspace-studio-tutorial-auto-organize-your-inbox-with-smart-labels-priority-3493</link>
      <guid>https://forem.com/gde/google-workspace-studio-tutorial-auto-organize-your-inbox-with-smart-labels-priority-3493</guid>
      <description>&lt;p&gt;The average professional spends 28% of their workday reading and answering emails. But here's the problem, not all emails are created equal. A Pizza Discount doesn't deserve the same mental space as a Project Delay notification from a CEO.&lt;/p&gt;

&lt;p&gt;So, I decided to fix it. I used &lt;a href="https://studio.workspace.google.com/" rel="noopener noreferrer"&gt;Google Workspace Studio&lt;/a&gt; to build what I call an Email Organiser. It's an AI agent that actually reads my mail, labels it correctly, and - most importantly - only pings my Google Chat when something is actually on fire.&lt;/p&gt;

&lt;p&gt;Here is how I built it (and how you can too, without writing a single line of code).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you missed my previous tutorial on the Meeting Prep Agent, start there for the &lt;a href="https://medium.com/google-cloud/google-workspace-studio-tutorial-building-an-ai-meeting-prep-agent-6f27dcbcbdb5" rel="noopener noreferrer"&gt;basics&lt;/a&gt;. Prefer to watch instead of read? Check out the video version of that guide &lt;a href="https://www.youtube.com/watch?si=jJqteoifcJRjJfFr&amp;amp;v=onNH6yJNtMs&amp;amp;feature=youtu.be" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Prefer to watch instead of read? Check out the video version of the guide here.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/YLFYu_9dkw4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;What Is Google Workspace Studio? (Quick Recap)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Workspace Studio&lt;/strong&gt; is Google's no-code AI agent builder (launched December 2025). It lets anyone describe a workflow in natural language, and Gemini builds the entire automation using your Gmail, Drive, Chat, Sheets, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features Used Here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New email starter&lt;/li&gt;
&lt;li&gt;Gemini-powered classification&lt;/li&gt;
&lt;li&gt;Conditional actions (Decide step)&lt;/li&gt;
&lt;li&gt;Add labels + Send Chat message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Workspace Business, Enterprise, or Education plan with Gemini enabled&lt;/li&gt;
&lt;li&gt;Access to studio.workspace.google.com&lt;/li&gt;
&lt;li&gt;(Optional) Pre-create these Gmail labels: Urgent, Client, Internal, Marketing/Promo, Low Priority, Spam&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Add the Starter (Trigger)
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;studio.workspace.google.com&lt;/strong&gt; and start a new flow. Name it something like &lt;strong&gt;AI Email Labeller + Priority Sorter&lt;/strong&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Starter:&lt;/strong&gt; Select When I get an email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settings:&lt;/strong&gt; Keep it on All emails. We want this agent to act as our first line of defense for every message.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnn9z2588mt7um9ybxkn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnn9z2588mt7um9ybxkn.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: The Logic Breakdown (The Extract Action)
&lt;/h2&gt;

&lt;p&gt;After adding the When I get an email starter, the next crucial step is to let Gemini analyze the incoming email. In Workspace Studio, we use the &lt;strong&gt;Extract step (powered by Gemini)&lt;/strong&gt; to intelligently process the email content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13myo901ljtmew4754mp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13myo901ljtmew4754mp.png" alt=" " width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this step, we aren't just asking Gemini a question; we are using the &lt;strong&gt;Extract&lt;/strong&gt; tool to pull specific &lt;strong&gt;metadata&lt;/strong&gt; out of the raw email body. To make this reliable, we need to provide a &lt;strong&gt;rubric&lt;/strong&gt; so the AI knows exactly how to judge your mail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvylukf7ob0v8u1pol25m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvylukf7ob0v8u1pol25m.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've pointed it at the &lt;strong&gt;Email Body&lt;/strong&gt; from Step 1 and created two custom fields. Think of this as giving Gemini a Rubric to follow. Instead of guessing, the AI is now acting as a professional assistant following a strict set of rules.&lt;/p&gt;

&lt;p&gt;Here is how I configured the two custom content fields to make them Production-Ready:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Custom Field: Is High Priority&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Goal:&lt;/strong&gt; A simple true/false result that we can use later to trigger a notification.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description for Gemini:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Analyze the sentiment and urgency. Return 'true' ONLY if the email indicates a project-blocking issue, an immediate deadline (today/tomorrow), or a direct request for a deliverable from a known client. If it is a general update, a newsletter, or a 'thank you' note, return 'false'. Do not add any punctuation or extra text.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;2. Custom Field: Classification&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Goal:&lt;/strong&gt; This will be used to apply actual labels in your Gmail sidebar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description for Gemini:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Classify the email into exactly one of these categories: urgent, client, internal, marketing, newsletter or other.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faheu3n14435ctd2m5fec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faheu3n14435ctd2m5fec.png" alt=" " width="800" height="952"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: The Organization (Physical Labelling)
&lt;/h2&gt;

&lt;p&gt;Now that Gemini has categorized our email in its mind, we need it to physically label the email in our Gmail inbox. This is where Step 3 comes in: the Add labels action.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mapping the ID:&lt;/strong&gt; First, we point the agent to the right email. In the &lt;strong&gt;Email to label&lt;/strong&gt; field, use the &lt;strong&gt;+ Variables **button to insert the&lt;/strong&gt;[Step 1: Email ID]**. This ensures the agent is acting on the exact message that triggered the flow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The AI-Powered Toggle:&lt;/strong&gt; Notice the &lt;strong&gt;AI-powered labels&lt;/strong&gt; switch. When you turn this on, you aren't just picking a static folder; you are giving Gemini permission to apply labels based on a description.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvu6eysqe3x7fp80h8xdd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvu6eysqe3x7fp80h8xdd.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While Google provides great templates like Receipts or Meeting updates, the real power lies in the &lt;strong&gt;New AI-powered label&lt;/strong&gt; button. This is where you can create a label that perfectly matches your workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11j6b5dn98ap78mm2h14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11j6b5dn98ap78mm2h14.png" alt=" " width="800" height="1050"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, I created a custom label called To Respond. Instead of a simple keyword search, I gave it this description:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prioritize emails that require my direct action. This includes messages that ask a question, request a deliverable, need my review or approval, or are pending my response.&lt;br&gt;
Crucially, exclude the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All automated notifications and system-generated emails (e.g., Drive file access requests, comment threads, or changes to shared documents).&lt;/li&gt;
&lt;li&gt;All Google Calendar updates (accepted, declined, rescheduled, canceled) and meeting confirmations.&lt;/li&gt;
&lt;li&gt;Broad announcements, newsletters, marketing, or promotional emails.&lt;/li&gt;
&lt;li&gt;Informational notes that do not require a response, such as "thank you" messages.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhed9196j8wl2vnqig1zr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhed9196j8wl2vnqig1zr.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By using custom descriptions, your labels become much more accurate than traditional Gmail filters. You aren't just looking for "Meeting" - you're looking for the intent to meet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Add the Decide Step (High Priority Check)
&lt;/h2&gt;

&lt;p&gt;After classifying the email and applying the label, we need to decide whether this email is important enough to notify us in Google Chat.&lt;/p&gt;

&lt;p&gt;This is where the Decide step comes in.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click + Add step → Select Decide.&lt;/li&gt;
&lt;li&gt;In the prompt field, paste the following: Is this email high priority?&lt;/li&gt;
&lt;li&gt;Click the + Variables button and insert Step 2: Is High Priority.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The full prompt should now read something like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0l8tgdmaeulw1olys39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0l8tgdmaeulw1olys39.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Check if the Decision is True
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Decide&lt;/strong&gt; step only makes a decision - it doesn't automatically route the flow. We need a &lt;strong&gt;Check if&lt;/strong&gt; step to act on that decision.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on Step 5: Check if&lt;/li&gt;
&lt;li&gt;Set the condition as follows:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If&lt;/strong&gt; → Select &lt;strong&gt;Step 4: Decision&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;is&lt;/strong&gt; → &lt;strong&gt;true&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmiwiloesewptxzttzeaq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmiwiloesewptxzttzeaq.png" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This creates two paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;True branch:&lt;/strong&gt; High-priority emails (Urgent or Client) → We will send a Chat notification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;False branch:&lt;/strong&gt; Normal emails → No notification (they only get labeled).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This branching logic is what makes the agent smart - it only bothers you for important emails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Add Notify Me in Chat
&lt;/h2&gt;

&lt;p&gt;Now we add the final action that only runs for high-priority emails.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Configure Step 6:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Make sure you are on Check if step (Step 5).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add substep&lt;/strong&gt; → Select &lt;strong&gt;Notify me in Chat&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Message&lt;/strong&gt; field, create a clean and useful notification using variables. You can add or remove variables as needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvy3l6i0rmhl1t3mjtq2s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvy3l6i0rmhl1t3mjtq2s.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing and Activation
&lt;/h2&gt;

&lt;p&gt;Now that the full flow is built, it's time to test it with real emails. I sent two very different emails to my inbox. I wanted to see if Gemini could distinguish between an important email and a casual request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 1: High Priority
&lt;/h3&gt;

&lt;p&gt;I sent an email regarding &lt;strong&gt;Project Quantum - Final Contract Feedback &amp;amp; Signature Required&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefsxid2ratlxzcckhsmb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefsxid2ratlxzcckhsmb.png" alt=" " width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back in the studio, go ahead and click on &lt;strong&gt;Test run&lt;/strong&gt; and select the email you would like to work on, which in this case is the &lt;strong&gt;Project Quantum&lt;/strong&gt; email. Once selected, click on &lt;strong&gt;Start&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwddr4i6aimxpd0kpgwt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwddr4i6aimxpd0kpgwt.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Content:&lt;/strong&gt; It mentioned a London hub deployment and a deadline of today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Result:&lt;/strong&gt; Gemini nailed it. In the &lt;strong&gt;Test Run&lt;/strong&gt;, it identified that a signature was needed (Step 2 extraction: true) and classified it as a client request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd88vdd2fh6p6k51nf9e2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd88vdd2fh6p6k51nf9e2.png" alt=" " width="800" height="1123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Action:&lt;/strong&gt; Because the priority was true, the &lt;strong&gt;Check if&lt;/strong&gt; logic passed. My phone immediately pinged with a Google Chat notification: 🚨 High Priority Email Received.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fym7j210yp8xfofkmuy1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fym7j210yp8xfofkmuy1e.png" alt=" " width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 2: The Important but Quiet (Low Priority)
&lt;/h3&gt;

&lt;p&gt;Next, I sent a follow-up: &lt;strong&gt;Question regarding the API Documentation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18zmtkuerdywla9h23xb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18zmtkuerdywla9h23xb.png" alt=" " width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back in the studio, follow the same steps as we did previously to test the second email.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Content:&lt;/strong&gt; Sarah had a few questions but explicitly said, &lt;strong&gt;No rush at all.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Result:&lt;/strong&gt; Gemini recognized that Sarah was asking a question, so it applied the &lt;strong&gt;To respond and Support&lt;/strong&gt; label in my Gmail sidebar . However, it also read the No rush sentiment and set priority to false.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2noeown6uvykuikjpbm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2noeown6uvykuikjpbm.png" alt=" " width="800" height="1127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Action:&lt;/strong&gt; The &lt;strong&gt;Check if&lt;/strong&gt; logic stopped the flow. No Chat notification. My focus remained unbroken, but the email was waiting for me in the right folder when I was ready for it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l1pqbf6nufnicz3r8n3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l1pqbf6nufnicz3r8n3.png" alt=" " width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Going Live (Turn On)&lt;/strong&gt;&lt;br&gt;
Once you are happy with the test results, click the blue Turn on button. Within a few seconds, you'll see a confirmation snackbar at the bottom left:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your flow is on and ready to work!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From this point forward, the AI agent is my primary filter. It organizes the chaos in the background and only interrupts me when the work truly demands it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The agent only acts on new emails received after it is turned on. Existing emails in your inbox will not be processed retroactively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You now have a fully functional &lt;strong&gt;AI Email Labeler + Priority Sorter&lt;/strong&gt; running in your Gmail.&lt;/p&gt;

&lt;p&gt;It intelligently classifies every incoming email, applies the right label, and only notifies you when something genuinely requires your attention - giving you back hours of focus every week.&lt;/p&gt;

&lt;p&gt;This is the real power of Google Workspace Studio: turning repetitive manual work into intelligent, automatic systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Next?
&lt;/h3&gt;

&lt;p&gt;This is only the beginning of our journey with Google Workspace Studio. I have a full roadmap of content coming your way to help you master every corner of this platform:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;More Workflows:&lt;/strong&gt; Stay tuned as we build dedicated AI agents for &lt;strong&gt;HR Onboarding&lt;/strong&gt;, &lt;strong&gt;Sales Lead Management&lt;/strong&gt;, and &lt;strong&gt;Automated Expense Tracking&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Deep-Dive Tutorials:&lt;/strong&gt; I'll be releasing specific guides on mastering Variables, optimizing your &lt;strong&gt;Starter triggers&lt;/strong&gt;, and advanced &lt;strong&gt;Prompt Engineering&lt;/strong&gt; to make Gemini even smarter.&lt;/li&gt;
&lt;li&gt;📺 &lt;strong&gt;Follow the Youtube Playlist:&lt;/strong&gt; You can catch every click-by-click build and all upcoming tutorials in my &lt;a href="https://youtube.com/playlist?list=PL_MCVBMm-9spp6kmOPkrJEgDVSyhmPWm7&amp;amp;si=D2aX8uev7pHyYe-C" rel="noopener noreferrer"&gt;Google Workspace Studio Tutorial Series Playlist&lt;/a&gt; on YouTube.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to reach out if you have any issues/feedback at &lt;a href="mailto:aryanirani123@gmail.com"&gt;aryanirani123@gmail.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>workspacestudio</category>
      <category>googleworkspace</category>
      <category>aiemailograniser</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Google Workspace Studio Tutorial: Building an AI Meeting Prep Agent</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Mon, 30 Mar 2026 08:48:00 +0000</pubDate>
      <link>https://forem.com/gde/google-workspace-studio-tutorial-building-an-ai-meeting-prep-agent-43ij</link>
      <guid>https://forem.com/gde/google-workspace-studio-tutorial-building-an-ai-meeting-prep-agent-43ij</guid>
      <description>&lt;p&gt;We've all been there, where you have 60 seconds before your next meeting starts. You're searching your inbox for that one PDF a client sent three days ago, or trying to remember what was discussed in last week's thread.&lt;/p&gt;

&lt;p&gt;In the past, you needed a human Chief of Staff or a complex web of Python scripts to solve this. Today, you just need &lt;strong&gt;Google Workspace Studio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial, we are going to build a &lt;strong&gt;Meeting Prep Agent&lt;/strong&gt;. This AI agent will automatically wake up 15 minutes before any meeting on your calendar, scan your recent emails and documents for context, and send a concise Google Doc directly to your Google Chat.&lt;/p&gt;

&lt;p&gt;If you haven't read my previous tutorial on building your first AI agent in Workspace Studio, start there for the &lt;a href="https://www.datacamp.com/tutorial/google-workspace-studio-tutorial" rel="noopener noreferrer"&gt;basics&lt;/a&gt;. Prefer to watch instead of read? Check out the video version of that guide &lt;a href="https://youtu.be/7yw9hVYbsGc?si=bC-DQYbdFdE49YUO" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Prefer to watch instead of read? Check out the video version of the guide here.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/onNH6yJNtMs"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Google Workspace Studio? (Quick Recap)
&lt;/h2&gt;

&lt;p&gt;Google Workspace Studio is a no-code AI agent builder launched in December 2025. It lets anyone describe a workflow in plain English, and Gemini builds the automation flow for you.&lt;/p&gt;

&lt;p&gt;Agents run securely inside your Google Workspace, respecting all your organization's permissions and data policies. No Apps Script, no third-party tools - just natural language and seamless integration with Calendar, Gmail, Drive, and Chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features Relevant Here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Based on a meeting starter - triggers relative to calendar events (e.g., 15 minutes before)&lt;/li&gt;
&lt;li&gt;Powerful Gemini AI steps for summarization and reasoning&lt;/li&gt;
&lt;li&gt;Variables that automatically pull meeting title, attendees, description, and more&lt;/li&gt;
&lt;li&gt;Actions like creating Docs, sharing files, and sending Chat messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Google Workspace Business, Enterprise, or Education plan with Gemini enabled&lt;/li&gt;
&lt;li&gt;Access to Google Workspace Studio at studio.workspace.google.com&lt;/li&gt;
&lt;li&gt;Make sure your admin has turned on the necessary features if you don't see Studio&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Workflow Logic
&lt;/h2&gt;

&lt;p&gt;To build this, we'll use a specific four-part logic within the Workspace Studio editor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Starter:&lt;/strong&gt; Triggered by a Calendar event (15 minutes before start).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Research:&lt;/strong&gt; Gemini scans your Workspace (Emails/Docs) for the meeting's participants and topic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Synthesis:&lt;/strong&gt; Gemini summarizes the Latest State of Play.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Delivery:&lt;/strong&gt; The briefing is sent to you via Google Chat and saved as a Google Doc for your notes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wssis81zkm4rym236ka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wssis81zkm4rym236ka.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Setting the Meeting Starter
&lt;/h2&gt;

&lt;p&gt;Navigate to &lt;a href="https://studio.workspace.google.com/" rel="noopener noreferrer"&gt;studio.workspace.google.com&lt;/a&gt; and create a new flow. Instead of using the Describe to Design box, we'll build this manually to ensure precision.&lt;/p&gt;

&lt;p&gt;Click on Choose a &lt;strong&gt;Starter&lt;/strong&gt; and select &lt;strong&gt;Based on a meeting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7sqwq5myp84yg6swa77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7sqwq5myp84yg6swa77.png" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can always select a specific meeting, but for this case go ahead and select &lt;strong&gt;Every meeting&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Timing: Set this to &lt;strong&gt;15 minutes before&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Start: You have the option to select Before and After meeting. Since the user needs to prepare for an upcoming meeting we are selecting &lt;strong&gt;Before meeting&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0ratvgwrulzklu81xl4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0ratvgwrulzklu81xl4.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once done, go ahead and click on Choose a step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Adding the Research Step
&lt;/h2&gt;

&lt;p&gt;Now we need the agent to find the context. Add a new step and select &lt;strong&gt;Ask Gemini&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08cg0stswurzbih3p7sn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08cg0stswurzbih3p7sn.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This opens the configuration window where you can talk to the AI in natural language. This is where you tell Gemini exactly what to look for. Because this agent is grounded in your Workspace, it can read your history to prepare you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhpqx3w95vf85fj23n50.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhpqx3w95vf85fj23n50.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Enter a prompt box&lt;/strong&gt;, copy and paste this structure:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I have an upcoming meeting. Here are the details:&lt;br&gt;
Title: &lt;strong&gt;[Step 1: Meeting title]&lt;/strong&gt;&lt;br&gt;
Description: &lt;strong&gt;[Step 1: Event description]&lt;/strong&gt;&lt;br&gt;
Attendees: &lt;strong&gt;[Step 1: All guest full names]&lt;/strong&gt;&lt;br&gt;
Please search my recent emails with these attendees and any related Drive files to create a concise meeting briefing. Include key objectives, recent discussion points, and any action items I should be aware of.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't just type the bracketed text! Click the &lt;strong&gt;+ Variables&lt;/strong&gt; button in the bottom right of the prompt box. This allows you to select the Blue Chips from Step 1.&lt;/p&gt;

&lt;p&gt;By mapping the &lt;strong&gt;Meeting Title&lt;/strong&gt;, &lt;strong&gt;Description&lt;/strong&gt;, and &lt;strong&gt;Attendee Names&lt;/strong&gt;, you are giving Gemini the specific search terms it needs to scan your history.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3w906ibfqmhveqrs5mv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3w906ibfqmhveqrs5mv.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Look at the bottom of the Ask Gemini panel. Under &lt;strong&gt;Sources Gemini can use&lt;/strong&gt;, ensure &lt;strong&gt;All sources&lt;/strong&gt; is selected.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Web Search:&lt;/strong&gt; This allows Gemini to look up recent public news about the attendees or their companies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Workspace:&lt;/strong&gt; This is the magic part - it allows Gemini to securely read your internal emails and Drive files to find those specific action items mentioned in the prompt.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3wvy3hcj300kg2iwsq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3wvy3hcj300kg2iwsq5.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Generating the Permanent Record (Create a Doc)
&lt;/h2&gt;

&lt;p&gt;Once Gemini has finished its research, we want that information saved somewhere accessible. We'll use the &lt;strong&gt;Create a doc&lt;/strong&gt; action to generate a dedicated briefing file in Google Drive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fak1kpq8ciylvn1l6qcsh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fak1kpq8ciylvn1l6qcsh.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Naming:&lt;/strong&gt; In the New doc name field, type Meeting Brief: and then use the &lt;strong&gt;+ Variables&lt;/strong&gt; button to insert the &lt;strong&gt;[Step 1: Meeting title]&lt;/strong&gt; chip. This ensures every doc is perfectly organized and searchable in your Drive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Populating Content:&lt;/strong&gt; In the &lt;strong&gt;Content to add field&lt;/strong&gt;, we don't want the raw meeting description; we want the intelligence Gemini just gathered. Insert the variable &lt;strong&gt;[Step 2: Content created by Gemini]&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Location: : By default, your file will be saved in your &lt;strong&gt;My Drive&lt;/strong&gt; root folder. However, if you want to choose a custom location, you can click on the &lt;strong&gt;Drive button&lt;/strong&gt; to launch the &lt;strong&gt;Drive Picker&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvw3ed5ebr8p9pjfz906n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvw3ed5ebr8p9pjfz906n.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: The Final Push (Notify me in Chat)
&lt;/h2&gt;

&lt;p&gt;The last step is the delivery. Since you're likely on the move or prepping between calls, a Google Chat notification is the fastest way to get your briefing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6lzaxysg7sc3ta76redv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6lzaxysg7sc3ta76redv.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Message&lt;/strong&gt; box, we are going to combine text with variables from &lt;strong&gt;all three previous steps&lt;/strong&gt; to create a high-value notification:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Header:&lt;/strong&gt; Type Ready for your meeting: and insert [Step 1: Meeting title].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Summary:&lt;/strong&gt; Add a header for Briefing Summary: and insert &lt;strong&gt;[Step 2: Content created by Gemini]&lt;/strong&gt;. This gives you the TL;DR right inside the chat app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Deep Dive:&lt;/strong&gt; Add &lt;strong&gt;Full Briefing Doc:&lt;/strong&gt; and insert &lt;strong&gt;[Step 3: Link to doc]&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By including the link from Step 3, you can jump from your Chat app directly into the formatted Google Doc if you need more details during the meeting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3yii9ajcofsians7n7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3yii9ajcofsians7n7h.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Testing and Activation
&lt;/h2&gt;

&lt;p&gt;With your logic built, it's time to move from Design to Deployment. Google Workspace Studio offers a powerful way to verify your agent before it goes live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Test Run (Verification)&lt;/strong&gt;&lt;br&gt;
Before you commit to the automation, click the &lt;strong&gt;Test run&lt;/strong&gt; button at the bottom of the editor. This opens a configuration panel on the right.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Select a Meeting:&lt;/strong&gt; In the Meeting dropdown, select an actual upcoming event from your calendar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute:&lt;/strong&gt; Click &lt;strong&gt;Start&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important Note:&lt;/strong&gt; A test run takes real actions. It will actually create the Google Doc in your Drive and send the message to your Google Chat. Use this to verify that the Gemini summary looks exactly how you want it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0zdkssd5jnu7xxzpv2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0zdkssd5jnu7xxzpv2z.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Workspace Studio provides real-time feedback. As the agent runs, you'll see green checkmarks appear next to each step.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 1 &amp;amp; 2:&lt;/strong&gt; Gemini immediately identifies the attendees, extracts the key objectives (server migration, budget gaps, GDPR compliance), and - most impressively - performs a &lt;strong&gt;Related File Search&lt;/strong&gt;. It finds training scripts and meeting note folders related to Project Quantum inside your Drive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr2dsdu2vj19m7n54whm8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr2dsdu2vj19m7n54whm8.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Completion:&lt;/strong&gt; Once you see the green Run Completed banner, the flow has successfully traversed from your calendar to your inbox, through Gemini's brain, and out to your productivity tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjme1colry318kgtl1z68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjme1colry318kgtl1z68.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Going Live (Turn On)&lt;br&gt;
Once you are happy with the test results, click the blue &lt;strong&gt;Turn on&lt;/strong&gt; button. Within a few seconds, you'll see a confirmation snackbar at the bottom left:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your flow is on and ready to work!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your AI Meeting Assistant is now officially on duty. It will sit silently in the background and trigger automatically 15 minutes before every meeting on your calendar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hwpb4ae82qa8m4j9ibb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hwpb4ae82qa8m4j9ibb.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The true power of this agent is visible in the output it creates for you. Within seconds of the trigger, two things happen:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Google Chat Briefing
&lt;/h3&gt;

&lt;p&gt;You receive a notification from the &lt;strong&gt;AI Meeting Assistant&lt;/strong&gt; app. It's not just a reminder; it's a full executive summary. It lists the date, time, attendees with their email links, and the core purpose of the meeting. It even includes a Note on Action Items - even if none were found, it gives you the peace of mind that it actually checked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgin60qz1x4gaw0pkgja7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgin60qz1x4gaw0pkgja7.png" alt=" " width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Professional Briefing Doc
&lt;/h3&gt;

&lt;p&gt;Simultaneously, a new document titled &lt;strong&gt;Meeting Brief: Project Quantum - EMEA Infrastructure Pivot Review&lt;/strong&gt; is created in your Drive. This is a perfectly formatted document containing all the context Gemini gathered. You can open this doc during your call to take notes, knowing your background research is already done and documented.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifkqhdt2qdmpy0mr9kbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifkqhdt2qdmpy0mr9kbv.png" alt=" " width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By building this Meeting Prep Agent, you've done more than just automate a few clicks; you've fundamentally changed your relationship with your calendar. Instead of spending your day &lt;strong&gt;searching&lt;/strong&gt; for context, you are now spending your day &lt;strong&gt;acting&lt;/strong&gt; on it.&lt;/p&gt;

&lt;p&gt;This workflow is a Force Multiplier. While you are focused on your current task, your AI agent is already working 15 minutes into the future, ensuring you walk into your next conversation with total confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  What will you build next?
&lt;/h3&gt;

&lt;p&gt;The "Meeting Prep" agent is just the beginning. You can now take these same principles - Starters, Variables, and Actions - and apply them to every corner of your work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ready to dive deeper?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📺 Watch the Video: If you prefer a click-by-click walkthrough of this build, check out the video version in my &lt;a href="https://youtube.com/playlist?list=PL_MCVBMm-9spp6kmOPkrJEgDVSyhmPWm7&amp;amp;si=R_2S9RAEl2s7K3EF" rel="noopener noreferrer"&gt;Google Workspace Studio YouTube Playlist&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;🚀 Master the Basics: If you're just starting out, read my previous deep-dive on &lt;a href="https://www.datacamp.com/tutorial/google-workspace-studio-tutorial" rel="noopener noreferrer"&gt;Datcamp's&lt;/a&gt; Blog, to learn about different starters and logic flows.&lt;/li&gt;
&lt;li&gt;💼 Custom Solutions: Looking to deploy these AI agents across your entire organization? Feel free to reach out via my &lt;a href="https://www.aryanirani123.com/" rel="noopener noreferrer"&gt;website&lt;/a&gt; for a custom consultation.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>googleworkspace</category>
      <category>workspacestudio</category>
      <category>gemini</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Reflections on my Trainings: Gemini for Google Workspace</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Sat, 28 Mar 2026 02:42:46 +0000</pubDate>
      <link>https://forem.com/gde/reflections-on-my-trainings-gemini-for-google-workspace-4fj3</link>
      <guid>https://forem.com/gde/reflections-on-my-trainings-gemini-for-google-workspace-4fj3</guid>
      <description>&lt;p&gt;It's always an incredibly rewarding experience to engage with professionals eager to embrace new technology, and my recent live training sessions on Gemini for Google Workspace were no exception. &lt;br&gt;
I recently conducted live trainings on Gemini for Google Workspace with O'Reilly Media Inc. - and one thing became very clear very quickly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most people aren't struggling with AI tools.&lt;br&gt;
They're struggling with how to think with them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These weren't passive sessions. Over the course of 4 hours, professionals jumped in, experimented live, built prompts, refined outputs, and saw immediate results. The turnout and energy were incredible - but what stood out more than anything was how differently people approached the exact same tool. Some were instantly building workflows. Others were still testing one-off prompts.&lt;/p&gt;

&lt;p&gt;That gap - that difference in approach - is what this post is really about.&lt;/p&gt;
&lt;h2&gt;
  
  
  The "Why": More Than Just a Tool, It's a New Way of Working
&lt;/h2&gt;

&lt;p&gt;In today's world, efficiency isn't just a nice-to-have; it's essential. From my years working with businesses and developers using Google Workspace, I've seen the daily grind firsthand. The hours spent wrestling with spreadsheet formulas, agonizing over the perfect email tone, or just facing that daunting blank page to start a new document. Gemini isn't just another feature; it's a fundamental shift. It's about augmenting our human capabilities, not replacing them.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Secret Sauce: Mastering Prompts with the CRISP Method (My Personal Take)
&lt;/h2&gt;

&lt;p&gt;When I first started playing around with Gemini, I quickly realized that the real magic wasn't just in the AI itself, but in how we talk to it. This is where prompt engineering comes in. My personal journey into mastering prompts using the CRISP method, really came from a place of wanting consistent, high-quality results. I found that by consciously applying Context, Role, Instruction, Specifics, and Purpose, I could transform those vague requests into exactly what I needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lxm4at3kbciyvf5qqxq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lxm4at3kbciyvf5qqxq.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was only when I started to improve my prompts that I saw Gemini truly perform as a powerful analyst, writer, or assistant. Sharing that learning curve and giving others a shortcut to getting those great results was what I was looking at.&lt;/p&gt;
&lt;h2&gt;
  
  
  Gemini in Action across Google Workspace
&lt;/h2&gt;

&lt;p&gt;We explored Gemini's capabilities across the core Google Workspace apps, and I loved seeing the immediate impact.&lt;/p&gt;
&lt;h3&gt;
  
  
  Google Docs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hxu2mhwwum4rodbhf8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hxu2mhwwum4rodbhf8e.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What We Did:&lt;/strong&gt; Overcame writer's block, drafted content from outlines, summarized long documents, and even refined text for different tones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;My Observation:&lt;/strong&gt; Seeing participants go from a blank page to a draft proposal summary in minutes was incredible. The &lt;strong&gt;Content Multiplier demo&lt;/strong&gt;, where we took one piece of content and transformed it into a LinkedIn post, a YouTube script, and a senior executive email, always gets the biggest reaction. It highlights how Gemini can truly adapt to our communication needs and save hours of manual work.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Google Sheets
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zd8ejymvg0075j7cxji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zd8ejymvg0075j7cxji.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What We Did:&lt;/strong&gt; Cleaned messy data with natural language, generated formulas without syntax, analyzed data, created pivot tables, and visualized insights with charts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;My Observation:&lt;/strong&gt; The "aha!" moments here are always around data analysis and formula generation. Watching someone who admitted to dreading VLOOKUPs confidently ask Gemini to find the email for Employee ID 105 and get it instantly, or seeing them create a complex pivot table just by describing it - that's incredibly powerful. It democratizes data insight, making analysis accessible to everyone.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Google Slides
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fluslma1e2s1nzfcooonb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fluslma1e2s1nzfcooonb.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What We Did:&lt;/strong&gt; Generated slides individually, created custom AI images, refined text, and produced speaker notes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;My Observation:&lt;/strong&gt; The AI image generation is always a showstopper! It's amazing to see participants realize they don't need to be graphic designers to create stunning, unique visuals for their presentations. The Micro Pitch Deck exercise really showed how quickly you can build a professional presentation and speaker notes, making the process much more efficient.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Gmail
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnrzsbxsk1xkbdnl7zzat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnrzsbxsk1xkbdnl7zzat.png" alt=" " width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What We Did:&lt;/strong&gt; Summarized long threads, used conversational search, drafted and refined emails.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;My Observation:&lt;/strong&gt; Taming the inbox is a universal challenge. The immediate relief participants feel when they see how quickly Gemini can summarize long threads or draft professional emails with the right tone is palpable. It's about giving back valuable time and boosting confidence in communication.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Automation (Apps Script)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frk4d2cj115965iulsa9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frk4d2cj115965iulsa9c.png" alt=" " width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've covered Gemini's power within Docs, Sheets, Slides, and Gmail, focusing on immediate productivity gains. Now, let's look ahead to the next frontier: &lt;strong&gt;AI-Powered Automation&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;While Gemini offers incredible built-in features, its true potential is unlocked when we integrate its intelligence into custom workflows. This is where Google Apps Script becomes invaluable. It's the bridge that allows us to automate repetitive tasks and build intelligent agents that can work for us in the background.&lt;/p&gt;

&lt;p&gt;During the training, I had the opportunity to showcase some of the tools I've been developing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment AI: Your AI Commenting Assistant for Google Docs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; I demonstrated a prototype Apps Script add-on called Comment AI. This tool leverages Gemini to analyze the text of a Google Doc and then suggest relevant, context-aware comments or feedback directly within the document. It can help users identify areas for improvement, suggest alternative phrasing, or even flag potential compliance issues, all based on intelligent AI analysis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Potential:&lt;/strong&gt; Imagine the time saved in review cycles! Instead of manually adding notes, Gemini can pre-analyze and suggest improvements, allowing reviewers to focus on strategic feedback.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find a step-by-step guide for this project here:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/UpjXl3F67KM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini-Powered Google Drive File Labelling &amp;amp; Filling:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; I also showcased another Apps Script project focused on Google Drive. This tool uses Gemini to understand the content of files stored in Drive. Based on that understanding, it can automatically apply consistent labels, extract key metadata, and even auto-fill relevant properties.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Potential:&lt;/strong&gt; Think about organizing your entire Drive! Gemini can help tag documents by project, client, or topic, making file retrieval exponentially faster and more efficient. This is a game-changer for knowledge management and team collaboration.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These projects are early-stage, but they exemplify the power of combining &lt;strong&gt;Google Apps Script with Gemini's AI&lt;/strong&gt;. It's about creating custom solutions for specific business needs, turning logic and intent into automated, intelligent workflows. While we didn't build these live, seeing them in action provides a tangible glimpse into what's possible when you integrate AI into your specific operational processes.&lt;/p&gt;

&lt;p&gt;You can learn more about this project and how to set it up in my tutorial here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aryanirani123.medium.com/automating-google-drive-labels-with-google-apps-script-a-step-by-step-guide-f5dd1a5b20d8" rel="noopener noreferrer"&gt;https://aryanirani123.medium.com/automating-google-drive-labels-with-google-apps-script-a-step-by-step-guide-f5dd1a5b20d8&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/automating-google-drive-labels-with-gemini-and-apps-script-9acb7beab6f8" rel="noopener noreferrer"&gt;https://medium.com/google-cloud/automating-google-drive-labels-with-gemini-and-apps-script-9acb7beab6f8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Key Takeaway:&lt;/strong&gt; The future isn't just about using AI tools; it's about building AI into your workflows. As these technologies evolve, your ability to harness them through custom solutions will become an increasingly valuable skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience: From Preparation to Connection
&lt;/h2&gt;

&lt;p&gt;Crafting this training wasn't just about listing features; it was about deeply understanding the challenges professionals face daily and then showing them a practical, actionable path forward with Gemini. My background as a Google Developer Expert means I'm constantly exploring these tools, so my focus was on bringing real-world scenarios and genuine business value to every demo and exercise. &lt;/p&gt;

&lt;p&gt;Building those &lt;strong&gt;hands-on activities&lt;/strong&gt; to simulate real business tasks - like creating that executive briefing or analyzing messy data - is critical for making the learning stick. It's incredibly rewarding to see participants engage, ask those insightful questions, and achieve those tangible results in just a few hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The response to these live sessions has been overwhelmingly positive, and it truly energizes me to see so many professionals eager to adopt AI.&lt;/p&gt;

&lt;p&gt;We're moving toward a world where AI literacy is a core skill - and the ability to integrate tools like Gemini into real workflows will be a major differentiator.&lt;/p&gt;

&lt;p&gt;I'm currently working on turning this training into a structured, self-paced course so more people can learn and apply these concepts at their own pace.&lt;/p&gt;

&lt;p&gt;If you're exploring Gemini for Google Workspace - whether individually or for your team - I'd love to hear how you're approaching it.&lt;/p&gt;

&lt;p&gt;Stay Tuned: Keep an eye out for the upcoming video course version of this training - it will offer even more depth and flexibility for self-paced learning!&lt;/p&gt;

&lt;p&gt;Thank you for reading and for your interest in harnessing the power of AI and Google Workspace. &lt;/p&gt;

&lt;p&gt;Feel free to reach out if you have any issues/feedback at &lt;a href="mailto:aryaniran123@gmail.com"&gt;aryaniran123@gmail.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gemini</category>
      <category>googleworkspace</category>
      <category>livetraining</category>
      <category>googleappsscript</category>
    </item>
    <item>
      <title>Building &amp; Deploying a Google Cloud Storage MCP Server to Cloud Run</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Sat, 07 Feb 2026 07:25:41 +0000</pubDate>
      <link>https://forem.com/gde/building-deploying-a-google-cloud-storage-mcp-server-to-cloud-run-4bfn</link>
      <guid>https://forem.com/gde/building-deploying-a-google-cloud-storage-mcp-server-to-cloud-run-4bfn</guid>
      <description>&lt;p&gt;Model Context Protocol (MCP) is changing how we connect LLMs to external data. While running MCP locally via stdio is great for testing, the real power comes when you deploy these servers to the cloud, making your tools available to any agent, anywhere.&lt;/p&gt;

&lt;p&gt;In this guide, I'm going to walk you through building a Google Cloud Storage (GCS) MCP Server, containerizing it, and deploying it to Google Cloud Run.&lt;/p&gt;

&lt;p&gt;We will cover:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Server Logic: Writing our own custom MCP server.&lt;/li&gt;
&lt;li&gt;Containerization: Docker setup for Cloud Run.&lt;/li&gt;
&lt;li&gt;Deployment: Permissions and Cloud Build commands.&lt;/li&gt;
&lt;li&gt;Verification: Testing with the MCP Inspector.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So let's get started. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Server Logic (server.py)
&lt;/h2&gt;

&lt;p&gt;The biggest challenge with deploying MCP servers is the transport. Locally, we usually use Stdio (standard input/output). In the cloud, we need SSE (Server-Sent Events) over HTTP.&lt;/p&gt;

&lt;p&gt;I didn't want to maintain two separate scripts, so I wrote a single &lt;strong&gt;server.py&lt;/strong&gt; that detects where it's running. If it sees a PORT environment variable (which Cloud Run injects), it spins up a web server.&lt;/p&gt;

&lt;p&gt;Here is the implementation using &lt;strong&gt;FastMCP&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# server.py
import os
import logging
from mcp.server.fastmcp import FastMCP
from google.cloud import storage

# Initialize FastMCP
mcp = FastMCP("gcs-mcp-server")

# Initialize GCS Client
storage_client = storage.Client()

@mcp.tool()
def list_buckets() -&amp;gt; str:
    """Lists all Google Cloud Storage buckets in the project."""
    buckets = list(storage_client.list_buckets())
    return "\n".join([bucket.name for bucket in buckets])

@mcp.tool()
def create_bucket(bucket_name: str, location: str = "US") -&amp;gt; str:
    """Creates a new GCS bucket."""
    bucket = storage_client.bucket(bucket_name)
    bucket.storage_class = "STANDARD"
    new_bucket = storage_client.create_bucket(bucket, location=location)
    return f"Created bucket {new_bucket.name} in {location}"

@mcp.tool()
def delete_bucket(bucket_name: str) -&amp;gt; str:
    """
    Deletes a GCS bucket. 
    WARNING: This forces deletion of all objects and versions inside.
    """
    bucket = storage_client.bucket(bucket_name)

    # Robust cleanup: List and delete all blob versions to avoid "Bucket not empty" errors
    blobs = list(storage_client.list_blobs(bucket_name, versions=True))
    for blob in blobs:
        blob.delete()

    bucket.delete(force=True)
    return f"Deleted bucket {bucket_name}"

if __name__ == "__main__":
    # DUAL MODE LOGIC
    if "PORT" in os.environ:
        # We are in Cloud Run -&amp;gt; Start an SSE Server
        import uvicorn
        port = int(os.environ["PORT"])
        print(f"Starting SSE server on port {port}...")

        # Critical for Cloud Run: Allow proxy headers and bind to 0.0.0.0
        uvicorn.run(
            mcp._sse_app, 
            host="0.0.0.0", 
            port=port, 
            proxy_headers=True, 
            forwarded_allow_ips='*',
            timeout_keep_alive=300 # Prevent SSE connection drops
        )
    else:
        # We are local -&amp;gt; Start Stdio Server
        mcp.run()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You'll notice I added some extra logic in delete_bucket. GCS is very protective; it won't let you delete a bucket if there's anything inside it. If you have Object Versioning turned on, a bucket might look empty but still have hidden archived files. My implementation explicitly hunts down every version and deletes it first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Dockerizing (Keep It Simple)
&lt;/h2&gt;

&lt;p&gt;We don't need a complex multi-stage build here. A simple Python slim image works perfectly.&lt;/p&gt;

&lt;p&gt;The requirements.txt is minimal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mcp[cli]
google-cloud-storage
uvicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "server.py"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Infrastructure Setup 
&lt;/h2&gt;

&lt;p&gt;Before we deploy, we need to make sure your CLI is pointing to the right place and your project has permissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2.1: Initialize gcloud
&lt;/h3&gt;

&lt;p&gt;Open your terminal. If you haven't logged in recently, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud auth login
gcloud config set project &amp;lt;YOUR_PROJECT_ID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2.2: Grant Permissions
&lt;/h3&gt;

&lt;p&gt;By default, Cloud Run cannot manage Storage buckets. We need to find the Service Account that Cloud Run uses and give it the Storage Admin role.&lt;/p&gt;

&lt;p&gt;Run these commands in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 1. Get your Project ID and Number
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

# 2. Grant the permission
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
    --role="roles/storage.admin"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Expected Output: You should see a YAML list of bindings updated with "Updated IAM policy for project [your-project-id]."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Deploying to Cloud Run
&lt;/h2&gt;

&lt;p&gt;Instead of typing long commands every time, we use a deployment script. Save this as deploy.sh in your project folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
set -e

# Configuration
PROJECT_ID=$(gcloud config get-value project)
SERVICE_NAME="gcs-mcp-server"
REGION="us-central1"
IMAGE_NAME="gcr.io/${PROJECT_ID}/${SERVICE_NAME}"

if [ -z "$PROJECT_ID" ]; then
    echo "Error: No Google Cloud project selected. Run 'gcloud config set project &amp;lt;PROJECT_ID&amp;gt;' first."
    exit 1
fi

echo "Deploying ${SERVICE_NAME} to Project: ${PROJECT_ID}..."

# 1. Build the container image
echo "Building container image..."
gcloud builds submit --tag $IMAGE_NAME

# 2. Deploy to Cloud Run
echo "Deploying to Cloud Run..."
# Note: --allow-unauthenticated is used here for simplicity to allow easy testing.
# For production, remove this flag and configure IAM authentication.
gcloud run deploy $SERVICE_NAME \
    --image $IMAGE_NAME \
    --platform managed \
    --region $REGION \
    --allow-unauthenticated

echo "Deployment complete!"
echo "Service URL:"
gcloud run services describe $SERVICE_NAME --platform managed --region $REGION --format 'value(status.url)'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running the Deployment
&lt;/h2&gt;

&lt;p&gt;Now, make the script executable and run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod +x deploy.sh
./deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What You Will See (Terminal Output)&lt;br&gt;
Build Step: You will see a stream of logs starting with Creating temporary tarball... followed by Docker build steps (Step 1/5, Step 2/5). This ends with SUCCESS.&lt;br&gt;
Deploy Step: You will see Deploying container to Cloud Run service [gcs-mcp-server] in project...&lt;/p&gt;

&lt;p&gt;Success:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Service [gcs-mcp-server] has been deployed and is serving 100 percent of traffic.
Service URL: https://gcs-mcp-server-xyz-uc.a.run.app

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy that Service URL. You need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification
&lt;/h2&gt;

&lt;p&gt;Go to the Google Cloud Console and navigate to Cloud Run.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Service Dashboard
&lt;/h3&gt;

&lt;p&gt;Click on gcs-mcp-server. You should see a green checkmark indicating the service is healthy.&lt;/p&gt;

&lt;p&gt;Revisions Tab: Ensure the latest revision is receiving 100% traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logs Tab:&lt;/strong&gt; This is crucial. If your code crashes, this is where you look. You should see a log entry: Starting SSE server on port 8080.... If you see that, your code successfully detected the environment and started Uvicorn.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Testing with MCP Inspector
&lt;/h3&gt;

&lt;p&gt;You don't need to write Python code to verify the server is working. Use the MCP Inspector from your terminal.&lt;br&gt;
The Command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx @modelcontextprotocol/inspector \
  --transport sse \
  --server-url https://&amp;lt;YOUR-SERVICE-URL&amp;gt;/sse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: You MUST append /sse to the URL. The root URL / will likely give you a 404 or Method Not Allowed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What You Will See: A web interface will open in your browser.&lt;/p&gt;

&lt;p&gt;1.Start by establishing connection by clicking Connect. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo93qxfm0ktcrbbzfh6cm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo93qxfm0ktcrbbzfh6cm.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.On the left sidebar, click Tools and List Tools. You should see &lt;br&gt;
list_buckets, create_bucket, and delete_bucket listed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8q20y3v5d9qkogrondmh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8q20y3v5d9qkogrondmh.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Click &lt;strong&gt;list_buckets&lt;/strong&gt; and hit Run. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyftu1l1x5emzhdyyo12t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyftu1l1x5emzhdyyo12t.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.You should see a JSON response with your bucket names.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fla8672y2om6k800ehfea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fla8672y2om6k800ehfea.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;That's it! You've gone from a local script to a deployed, scalable microservice that acts as a tool for your AI agents.&lt;/p&gt;

&lt;p&gt;By moving your tools to Cloud Run, you decouple them from your agent's runtime. Your agent can be a script on your laptop, a service in Vertex AI, or a workflow in a completely different environment - it doesn't matter. As long as it can hit that URL, it has access to your Google Cloud Storage tools.&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>cloudrun</category>
      <category>mcp</category>
      <category>cloudstorage</category>
    </item>
    <item>
      <title>2025 in Review: AI Agents, Automation, and a Year of Building</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Tue, 27 Jan 2026 11:23:32 +0000</pubDate>
      <link>https://forem.com/aryanirani123/2025-in-review-ai-agents-automation-and-a-year-of-building-3nc3</link>
      <guid>https://forem.com/aryanirani123/2025-in-review-ai-agents-automation-and-a-year-of-building-3nc3</guid>
      <description>&lt;p&gt;Every year since I started writing and working in tech, I’ve written a yearly recap — not just to list what I did, but to pause, acknowledge growth, and remind myself why I build in the first place.&lt;/p&gt;

&lt;p&gt;2025 was a meaningful year for me. A year of graduating, publishing my add-ons to the Workspace Marketplace, teaching developers, experimenting with AI agents, and contributing to the Google Workspace and Gemini ecosystem in every way I could.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Personal Milestone: Graduating as an Engineer
&lt;/h3&gt;

&lt;p&gt;This year, I completed my Bachelor of Technology in Computer Engineering from NMIMS, Mumbai. It’s hard to overstate how special that moment was. Balancing final-year projects and exams with consistent writing, building tools, recording tutorials, and community engagement was challenging at times — but it all reinforced the discipline and problem-solving mindset that engineering instilled in me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What starts as small experiments or hobby projects can grow into meaningful work when done consistently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Graduating marked the close of one chapter and the exciting start of another, where I can now focus even more deeply on creating practical AI and automation solutions.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/aryanirani123_i-graduated-engineering-was-fun-while-activity-7365727898017611776-mTn0?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAADChMpcBd4q5V6PUN2z7rUckyicQhiCjWE8" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4D22AQFX5guVuNxECA%2Ffeedshare-shrink_800%2FB4DZjhSfU7H0Ak-%2F0%2F1756126377935%3Fe%3D2147483647%26v%3Dbeta%26t%3DYlJyeXSpIEx1KeLT0PIg3GWSGdxr3w8ta0jtC-dwpG8" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/aryanirani123_i-graduated-engineering-was-fun-while-activity-7365727898017611776-mTn0?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAADChMpcBd4q5V6PUN2z7rUckyicQhiCjWE8" rel="noopener noreferrer" class="c-link"&gt;
            I graduated :) - Engineering was fun while it lasted. | Aryan Irani | 22 comments
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            I graduated :) - Engineering was fun while it lasted.  | 22 comments on LinkedIn
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h3&gt;
  
  
  Mumbai Tech Week — Sharing My Work on a Big Stage
&lt;/h3&gt;

&lt;p&gt;One of the year’s highlights was presenting at Mumbai Tech Week 2025, thanks to GDG MAD Mumbai and Faiz Malkani. I demoed two Gemini-powered projects live:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-cloud/turn-google-docs-into-ai-powered-podcasts-with-google-cloud-193210d28950" rel="noopener noreferrer"&gt;Turning Google Docs into AI-powered podcasts using Google Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/ZlL76NIiG64?si=wFunbTZa7wilFHh2" rel="noopener noreferrer"&gt;Generating speaker notes in Google Slides with Gemini 2.0 Flash and Apps Script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A Different Kind of Stage — My TEDx Talk
&lt;/h3&gt;

&lt;p&gt;2025 also brought a deeply personal speaking experience — my TEDx talk at TEDxGEA Youth. This was the first time I stood in front of a crowd not to dive into tech tutorials or code demos, but to open up about myself, my journey, and the messy, human side of building a career in tech.&lt;/p&gt;

&lt;p&gt;At 21, I shared how I went from a directionless 15-year-old to a technical writer and co-founder of MadLads Studios. It wasn’t about expertise or polished skills — it was about curiosity sparking everything: starting with simple book reviews, automating Gmail tasks, and embracing uncertainty along the way.&lt;/p&gt;

&lt;p&gt;I talked about the messy middle of rejections, learning through failures, the importance of consistency over perfection, saying no to avoid burnout, finding joy in the process (my take on “JOMO” — Joy of Missing Out), and how belief from others (like a professor who trusted me to teach Python) ignited my path before I believed in myself.&lt;/p&gt;

&lt;p&gt;Stepping outside my tech comfort zone felt vulnerable, but it was rewarding to connect on a more human level. If you’re navigating your own journey, I hope it resonates. Watch it here: &lt;a href="https://youtu.be/Nifu9zGZ6po?si=pDIojDZoAMTnZu_6" rel="noopener noreferrer"&gt;Aryan Irani | TEDxGEA Youth&lt;/a&gt; (Uploaded October 2025).&lt;/p&gt;

&lt;h3&gt;
  
  
  Product Launches: My First Google Workspace Add-ons
&lt;/h3&gt;

&lt;p&gt;One of the biggest professional steps this year was shipping two add-ons to the Google Workspace Marketplace — my first publicly available products built for real users:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SmartCheckbox&lt;/strong&gt; — A no-code tool that automates checkbox updates in Google Sheets based on custom rules. Ideal for task management, approval workflows, and dynamic trackers. It includes real-time refresh, audit logs, and an intuitive sidebar setup. &lt;a href="https://workspace.google.com/marketplace/app/smartcheckbox/664272491133" rel="noopener noreferrer"&gt;Install it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sheet Protector Pro&lt;/strong&gt; — One-click sheet protection with smart features: protect formulas/ranges, easy undo, audit history, and controlled editor sharing. Built for teams who need secure collaboration without the hassle. &lt;a href="https://workspace.google.com/marketplace/app/sheet_protector_pro/952934246621" rel="noopener noreferrer"&gt;Install it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Launching these taught me invaluable lessons about user experience, Marketplace guidelines, permissions, and iterative polishing. Seeing people install and use them has been incredibly rewarding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Live Trainings: Getting Started with Google Apps Script
&lt;/h3&gt;

&lt;p&gt;I also ran my comprehensive Mastering Google Apps Script live training program — taking participants from beginner concepts to building advanced automations across Google Workspace. Watching attendees gain confidence, script their own solutions, and apply them to real workflows was one of the most fulfilling parts of the year.&lt;/p&gt;

&lt;p&gt;The program is still available for anyone looking to level up their Workspace automation skills: &lt;a href="https://www.aryanirani123.com/google-apps-script-training" rel="noopener noreferrer"&gt;Mastering Google Apps Script — Aryan Irani&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini for Google Workspace Fundamentals — O’Reilly
&lt;/h3&gt;

&lt;p&gt;I’m also thrilled to share that I’ll be leading an upcoming Gemini for Google Workspace Fundamentals live training with O’Reilly on January 22, 2026. It’s a hands-on course covering how to leverage Gemini’s AI capabilities across Docs, Sheets, Gmail, and more to boost productivity. From writing effective prompts to automating workflows, I’m excited to help developers and professionals unlock Gemini’s potential. Learn more and &lt;a href="https://www.oreilly.com/live-events/gemini-for-google-workspace-fundamentals/0642572262921/" rel="noopener noreferrer"&gt;register here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writing: A Strong Year of Deep Technical Content
&lt;/h3&gt;

&lt;p&gt;My writing this year became more focused on production-ready solutions — especially building AI agents that don’t just respond, but take meaningful actions. I published consistently on Medium (largely through Google Cloud Community), with a clear progression: starting with core Workspace + Gemini automations, moving into Agent Development Kit (ADK) basics, then deep into dynamic agents with MCP Toolbox for Databases, and finally deployment and Workspace integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Workspace &amp;amp; Gemini Automations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fetch BigQuery Data to Google Sheets using Google Apps Script (Feb)&lt;/li&gt;
&lt;li&gt;Generate Speaker Notes in Google Slides using Gemini 2.0 Flash and Google Apps Script (Feb)&lt;/li&gt;
&lt;li&gt;Turn Google Docs into AI-Powered Podcasts with Google Cloud (Feb)&lt;/li&gt;
&lt;li&gt;How to Use Service Accounts with Google Apps Script (Mar)&lt;/li&gt;
&lt;li&gt;Turn Google Docs Comments into Actionable Summaries with Gemini and Apps Script (Oct)&lt;/li&gt;
&lt;li&gt;Automating Google Drive Labels with Google Apps Script: A Step-by-Step Guide (Dec)&lt;/li&gt;
&lt;li&gt;Automating Google Drive Labels with Gemini and Apps Script (Dec)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started with ADK &amp;amp; Practical Agents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Your First ADK Agent: Building a Google Tasks To-Do Manager (Jun)&lt;/li&gt;
&lt;li&gt;Build Your Own AI Google Calendar Assistant with Agent Development Kit (Sep)&lt;/li&gt;
&lt;li&gt;MCP Toolbox for Databases Course Series (Connecting Agents to Live Data)&lt;/li&gt;
&lt;li&gt;Build an AI That Connects to Your Database: MCP Toolbox for Databases Course (Jul)&lt;/li&gt;
&lt;li&gt;The Data Gap | Connecting an Agent to a LIVE Database (Jul)&lt;/li&gt;
&lt;li&gt;Build Your First AI Agent with ADK (Jul)&lt;/li&gt;
&lt;li&gt;Build Your First MCP Server (Aug)&lt;/li&gt;
&lt;li&gt;The Quick Start to Dynamic AI Agents (Aug)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advanced Builds, FinOps, and Custom Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;NotebookLM 2.0: From Research Tool to Creative Powerhouse (Sep)&lt;/li&gt;
&lt;li&gt;Building a Custom MCP Server for Gemini CLI: A Hands-on Guide (Sep)&lt;/li&gt;
&lt;li&gt;Exporting Your Google Cloud Billing Data to BigQuery (Sep)&lt;/li&gt;
&lt;li&gt;Build a Google Cloud FinOps Assistant Agent with ADK &amp;amp; MCP Toolbox (Sep)&lt;/li&gt;
&lt;li&gt;Build a GCP Cost Agent with ADK and MCP Toolbox for Databases (Sep)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  October Surge: Workspace Integration &amp;amp; Deployment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create an AI-Agent in Google Workspace: Step-by-Step with ADK &amp;amp; Vertex AI Agent Engine (Oct)&lt;/li&gt;
&lt;li&gt;Deploy Your ADK Agent to Vertex AI Agent Engine: A Complete Tutorial (Oct)&lt;/li&gt;
&lt;li&gt;Turn Google Docs Into an AI Agent Hub: Integrate ADK Agents in Google Workspace (Oct)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SmartCheckbox Launch &amp;amp; Fun Experiments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Getting Started with SmartCheckbox™: Install, Setup, and Your First Rule (Oct)&lt;/li&gt;
&lt;li&gt;Hands-On Tutorial — Build a Content Approval Workflow with SmartCheckbox (Oct)&lt;/li&gt;
&lt;li&gt;Integrating Zomato’s MCP Server into Gemini CLI: AI-Powered Food Ordering in Your Terminal (Oct) — A lighter, experimental piece that was genuinely fun to build.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The work I’ve been doing isn’t just content, it’s helping shape how teams and developers think about productivity, automation, and AI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Product Collaborations &amp;amp; Developer Education
&lt;/h2&gt;

&lt;p&gt;A meaningful part of my work this year involved collaborating with product teams in a way that closely resembled developer education and advocacy. My role was to explore their platforms hands-on and produce developer use cases, getting-started guides, tutorials, and documentation that simplified adoption.&lt;/p&gt;

&lt;p&gt;This work helped bridge the gap between product capabilities and how developers and users actually experience them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Not-So-Perfect Side — And What I Learned
&lt;/h2&gt;

&lt;p&gt;Not every moment in 2025 sparkled. At one point during the year, I lost a client I was writing content for. The work itself wasn’t the issue. The problem was communication.&lt;/p&gt;

&lt;p&gt;I was traveling to another city for a community talk and didn’t communicate clearly about timelines. A small delay, combined with silence on my end, led to misaligned expectations. Eventually, the client decided to move on.&lt;/p&gt;

&lt;p&gt;It wasn’t a dramatic failure — just a quiet reminder of something important:&lt;br&gt;
technical skill and good intentions don’t replace clear, proactive communication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflections: What 2025 Taught Me
&lt;/h2&gt;

&lt;p&gt;Looking back with humility, this year was about consistent progress over perfection. A few grounded lessons that stand out:&lt;/p&gt;

&lt;p&gt;Shipping real products (like the add-ons) creates momentum nothing else can — even if they start small.&lt;br&gt;
Agentic AI shines when grounded in reliable data and clear actions; the MCP series reinforced how crucial live database connections are.&lt;/p&gt;

&lt;p&gt;Teaching and presenting amplify impact — the live training and Mumbai Tech Week, Devfest, CCDs reminded me that sharing knowledge openly builds community and sharpens your own understanding.&lt;br&gt;
Balance and resilience matter — graduating while maintaining a steady output wasn’t always easy, but celebrating small wins kept the momentum going.&lt;/p&gt;

&lt;p&gt;I’m quietly proud of how far the work has come, but I also know there’s so much more to explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Ahead to 2026
&lt;/h2&gt;

&lt;p&gt;I’m excited to go deeper: more sophisticated multi-agent systems, production-grade deployments, expanded add-on features, and perhaps new courses or tools. The goal remains the same — build practical solutions that make Google Workspace and AI more accessible and powerful for everyone.&lt;/p&gt;

&lt;p&gt;Thank you to every reader, installer, attendee, and community member who engaged this year — your feedback, questions, and encouragement make all of this worthwhile.&lt;/p&gt;

&lt;p&gt;P.S. Past recaps for the tradition: &lt;a href="https://aryanirani123.medium.com/summary-of-blogs-tutorials-and-talks-of-2024-aryan-irani-7007a3dfebbe" rel="noopener noreferrer"&gt;2024&lt;/a&gt;, &lt;a href="https://aryanirani123.medium.com/summary-of-blogs-tutorials-and-course-of-2023-aryan-irani-b3648fb1f5d2" rel="noopener noreferrer"&gt;2023&lt;/a&gt;, &lt;a href="https://aryanirani123.medium.com/summary-of-blogs-tutorials-and-course-of-2022-aryan-irani-38045cbf0de7" rel="noopener noreferrer"&gt;2022&lt;/a&gt;, &lt;a href="https://aryanirani123.medium.com/summary-of-2021-aryan-irani-21faa0e5f835" rel="noopener noreferrer"&gt;2021&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Automating Google Drive Labels with Google Apps Script: A Step-by-Step Guide</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Tue, 16 Dec 2025 14:36:20 +0000</pubDate>
      <link>https://forem.com/aryanirani123/automating-google-drive-labels-with-google-apps-script-a-step-by-step-guide-4hm8</link>
      <guid>https://forem.com/aryanirani123/automating-google-drive-labels-with-google-apps-script-a-step-by-step-guide-4hm8</guid>
      <description>&lt;p&gt;Welcome !&lt;br&gt;
If you manage a Google Workspace environment, you already know that folders only get you so far. Eventually, you need &lt;strong&gt;metadata&lt;/strong&gt; - Status, Department, Sensitivity, or custom fields like Invoice Amount.&lt;/p&gt;

&lt;p&gt;Google Drive Labels solve this by turning Drive into a structured metadata system, not just a file store.&lt;/p&gt;

&lt;p&gt;But there's a catch: users hate tagging files. If you rely on humans to manually open the details pane and select Invoice and type in a date, it won't happen.&lt;/p&gt;

&lt;p&gt;To make Drive Labels actually useful, you need to automate them.&lt;br&gt;
In this guide, we are going to write some Google Apps Script that interacts with the &lt;strong&gt;Drive Labels API&lt;/strong&gt; and &lt;strong&gt;Drive API&lt;/strong&gt; to programmatically fetch label definitions, identify the correct fields, and apply them to files with specific metadata.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites 
&lt;/h2&gt;

&lt;p&gt;Before writing a single line of code, a bit of setup is required. The Drive Labels API is not enabled by default in Apps Script projects.&lt;/p&gt;
&lt;h3&gt;
  
  
  Google Workspace edition
&lt;/h3&gt;

&lt;p&gt;You'll need an edition that supports Drive Labels (Business Standard, Business Plus, or Enterprise). &lt;/p&gt;
&lt;h3&gt;
  
  
  Admin setup 
&lt;/h3&gt;

&lt;p&gt;Make sure at least one label (for example, Invoice) is published in the Admin Console under: &lt;strong&gt;Security → Access and Data Control → Label Manager&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Apps Script services 
&lt;/h3&gt;

&lt;p&gt;Open your Apps Script project, click the + next to Services, and enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drive API &lt;/li&gt;
&lt;li&gt;Drive Labels API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The scripts - what each function does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;fetchAvailableLabels()&lt;/code&gt; - lists published labels and returns a map &lt;br&gt;
&lt;code&gt;fetchLabelFields(labelId)&lt;/code&gt; - reads a label's fields and their types&lt;br&gt;
&lt;code&gt;applyLabelToFile(fileId, labelId)&lt;/code&gt; - applies a label to a file (no field values).&lt;br&gt;
&lt;code&gt;applyLabelAndUpdateFields(fileId, labelId, fields)&lt;/code&gt; - applies a label and updates field values (types handled: text, integer, date, selection).&lt;br&gt;
&lt;code&gt;fullLabelAutomation(fileId)&lt;/code&gt; - example chain that demonstrates label suggestion + applying fields.&lt;/p&gt;

&lt;p&gt;You can check out the code by clicking on the link given below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aryanirani123/Google-Apps-Script/blob/master/DriveLabelsAutomation.js" rel="noopener noreferrer"&gt;https://github.com/aryanirani123/Google-Apps-Script/blob/master/DriveLabelsAutomation.js&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Fetching all available Drive labels
&lt;/h3&gt;

&lt;p&gt;We start with the &lt;code&gt;fetchAvailableLabels()&lt;/code&gt; function. This is the discovery step - before we can apply any label, we first need to know which labels are actually available and visible to our account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function fetchAvailableLabels() {
  try {
    const response = DriveLabels.Labels.list({ view: "LABEL_VIEW_FULL" });
    const labels = response.labels || [];
    if (labels.length === 0) {
      Logger.log("No labels found. Check Workspace admin for published labels.");
      return {};
    }

    const labelMap = {};
    labels.forEach(label =&amp;gt; {
      if (label.properties?.title) {
        labelMap[label.properties.title] = label.id;
      }
    });

    Logger.log(`Fetched ${labels.length} labels: ${JSON.stringify(labelMap)}`);
    return labelMap;
  } catch (error) {
    Logger.log(`Error fetching labels: ${error.message}`);
    return {};
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the function we call &lt;code&gt;DriveLabels.Labels.list({ view: "LABEL_VIEW_FULL" });&lt;/code&gt; that hits the Drive Labels API and returns all published labels that the current user is allowed to see. Using &lt;code&gt;LABEL_VIEW_FULL&lt;/code&gt; ensures we get complete metadata instead of just surface-level information. &lt;/p&gt;

&lt;p&gt;Next we safely extract the labels array from the response. If nothing is returned, we log a message suggesting the user to check whether the labels are published in the Admin Console. &lt;/p&gt;

&lt;p&gt;We then loop through each label and build a simple object map that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Invoice": "label-id-123",
  "Contract": "label-id-456"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This mapping is extremely useful because it lets us refer to the labels by human-readable titles instead of IDs for the rest of the workflow. &lt;/p&gt;

&lt;p&gt;Finally, we log the results and return the map. If anything fails (permission issues, API errors, etc), the &lt;code&gt;catch&lt;/code&gt; block logs the error and returns an empty object instead of crashing the script. &lt;/p&gt;

&lt;p&gt;At this point, we now have a clean list of usable labels.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwowzv4drwobses5ukaqn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwowzv4drwobses5ukaqn.png" alt=" " width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fetching fields for a specific label
&lt;/h3&gt;

&lt;p&gt;Once we know which label we're working with, the next step is to understand its field structure. That's what the &lt;code&gt;fetchLabelFields(labelId)&lt;/code&gt; does.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function fetchLabelFields(labelId) {
  try {
    if (!labelId) {
      throw new Error("labelId is required. Run fetchAvailableLabels() first and copy an ID.");
    }

    const response = DriveLabels.Labels.list({ view: "LABEL_VIEW_FULL" });
    const labels = response.labels || [];
    if (labels.length === 0) {
      Logger.log("No labels found. Check Workspace admin for published labels.");
      return {};
    }

    const targetLabel = labels.find(label =&amp;gt; label.id === labelId);
    if (!targetLabel) {
      Logger.log(`Label ID "${labelId}" not found in available labels. Run fetchAvailableLabels() to verify.`);
      return {};
    }

    const fields = targetLabel.fields || [];
    if (fields.length === 0) {
      Logger.log(`No fields found for label ${labelId}.`);
      return {};
    }

    const fieldMap = {};
    fields.forEach(field =&amp;gt; {
      const displayName = field.properties?.displayName;
      if (displayName) {
        let type = 'text'; // Default
        if (field.integerOptions) type = 'integer';
        else if (field.dateOptions) type = 'date';
        else if (field.selectionOptions) type = 'selection';

        fieldMap[displayName] = {
          id: field.id,
          type: type
        };
      }
    });

    Logger.log(`Fetched ${fields.length} fields for label ${labelId}: ${JSON.stringify(fieldMap)}`);
    return fieldMap;
  } catch (error) {
    Logger.log(`Error fetching fields for label ${labelId}: ${error.message}`);
    return {};
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function starts with a validation check. If no &lt;code&gt;labelId&lt;/code&gt; is passed, it immediately throws an error. This prevents silent failures and makes debugging much easier. &lt;/p&gt;

&lt;p&gt;Instead of calling a label-specific endpoint, the function safely reuses the full labels list and searches for the label using &lt;code&gt;labels.find(label =&amp;gt; label.id === labelId);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the label isn't found, we log a clear message telling the user to verify the ID using &lt;code&gt;fetchAvailableLabels().&lt;/code&gt;&lt;br&gt;
Once the correct label is found, we extract its fields. Each field represents a piece of structured metadata such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invoice Number&lt;/li&gt;
&lt;li&gt;Invoice Date&lt;/li&gt;
&lt;li&gt;Vendor Name&lt;/li&gt;
&lt;li&gt;Status (dropdown/select)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We then loop through each field and store: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The field ID&lt;/li&gt;
&lt;li&gt;The field type (text, integer, date, or selection)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates another human-friendly mapping that looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Invoice Number": { id: "field-id-1", type: "text" },
  "Invoice Date": { id: "field-id-2", type: "date" }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This step is critical because Drive does not allow us to update fields using display names - only IDs work. This function bridges that gap.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8e7ynjlwhh56lthv7mz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8e7ynjlwhh56lthv7mz.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Applying a label to a file
&lt;/h3&gt;

&lt;p&gt;With label IDs in hand, we move on to the write operation: attaching a label to a file using &lt;code&gt;applyLabelToFile(fileId, labelId)&lt;/code&gt; .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function applyLabelToFile(fileId, labelId) {
  try {
    if (!fileId || !labelId) {
      throw new Error("fileId and labelId are required.");
    }

    const request = {
      kind: "drive#modifyLabelsRequest",
      labelModifications: [
        {
          kind: "drive#labelModification",
          labelId: labelId,
          removeLabel: false
        }
      ]
    };

    const response = Drive.Files.modifyLabels(request, fileId);
    Logger.log(`Label ${labelId} applied to file ${fileId}: ${JSON.stringify(response.modifiedLabels)}`);
    return response.modifiedLabels || [];
  } catch (error) {
    Logger.log(`Error applying label ${labelId} to file ${fileId}: ${error.message}`);
    return [];
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function begins by validating that both fileId and labelId are present. If either is missing, we immediately fail with a clear message. &lt;/p&gt;

&lt;p&gt;We then build a &lt;code&gt;modifyLabels&lt;/code&gt; request object. The key pieces here are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;labelId -&amp;gt; which label to apply &lt;/li&gt;
&lt;li&gt;removeLabel: false -&amp;gt; explicitly tells Drive to attach the label (not remove it) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This request is sent using &lt;code&gt;Drive.Files.modifyLabels(request, fileId);&lt;/code&gt; . If successful, the Drive API returns a list of modified labels, which we log and return. If anything goes wrong - permission, invalid IDs, or API errors. We catch it and return an empty array instead of breaking the flow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3yi22sot6w5c8rpzaiib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3yi22sot6w5c8rpzaiib.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, the file will now visibly show the label inside Drive → File Details → Labels.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnl8cw8slyclemd8etd62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnl8cw8slyclemd8etd62.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Applying a label and updating its fields
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;applyLabelAndUpdateFields()&lt;/code&gt; function is the heart of this entire automation. Up until this point, we've only been discovering what labels and fields exist. This is the moment where metadata &lt;strong&gt;actually gets written back to the file in Google Drive.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function applyLabelAndUpdateFields(fileId, labelId, fields) {
  try {
    if (!fileId || !labelId || !fields || fields.length === 0) {
      throw new Error("fileId, labelId, and non-empty fields array are required.");
    }

    const fieldModifications = fields.map(field =&amp;gt; {
      let fieldMod = {
        kind: "drive#labelFieldModification",
        fieldId: field.id
      };

      const value = field.value;
      if (!value) {
        Logger.log(`Skipping field ${field.id}: No value provided.`);
        return null;
      }

      switch (field.type) {
        case 'selection':
          fieldMod.setSelectionValues = [value];
          break;
        case 'integer':
          const intVal = parseInt(value);
          if (!isNaN(intVal)) {
            fieldMod.setIntegerValues = [intVal.toString()];
          } else {
            Logger.log(`Invalid integer for field ${field.id}: ${value}`);
            return null;
          }
          break;
        case 'date':
          const date = new Date(value);
          if (!isNaN(date.getTime())) {
            const isoDate = date.toISOString().split('T')[0];
            fieldMod.setDateValues = [isoDate];
          } else {
            Logger.log(`Invalid date for field ${field.id}: ${value}`);
            return null;
          }
          break;
        case 'text':
        default:
          fieldMod.setTextValues = [value];
          break;
      }

      return fieldMod;
    }).filter(mod =&amp;gt; mod !== null);

    if (fieldModifications.length === 0) {
      Logger.log('No valid field modifications; applying label only.');
      return applyLabelToFile(fileId, labelId);
    }

    const request = {
      kind: "drive#modifyLabelsRequest",
      labelModifications: [
        {
          kind: "drive#labelModification",
          labelId: labelId,
          fieldModifications: fieldModifications,
          removeLabel: false
        }
      ]
    };

    const response = Drive.Files.modifyLabels(request, fileId);
    Logger.log(`Label ${labelId} and fields applied to file ${fileId}: ${JSON.stringify(response.modifiedLabels)}`);
    return response.modifiedLabels || [];
  } catch (error) {
    Logger.log(`Error applying label and fields to file ${fileId}: ${error.message}`);
    return [];
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function takes three inputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fileId → the Drive file we want to update&lt;/li&gt;
&lt;li&gt;labelId → the label we want to apply&lt;/li&gt;
&lt;li&gt;fields → an array of field definitions with values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each field is expected to be passed in this simple format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  id: "field-id",
  type: "text",
  value: "Some value"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function starts with a strict validation check. If any of these three inputs are missing - the file ID, the label ID, or a non-empty fields array - we immediately throw an error. This prevents silent failures where the script looks like it ran but didn't actually apply anything.&lt;/p&gt;

&lt;p&gt;Next, the function transforms the human-friendly fields array into a Drive API–compatible request structure. This is done by iterating over each field and dynamically constructing a labelFieldModification object. &lt;/p&gt;

&lt;p&gt;At this stage, the script does something very important: it does not assume that every field value is valid. If a field is missing a value, that field is skipped entirely rather than breaking the update for all fields. This makes the system resilient in real-world automation scenarios where extracted data might be partially incomplete.&lt;/p&gt;

&lt;p&gt;For every field, we first construct a base object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  kind: "drive#labelFieldModification",
  fieldId: field.id
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, we've told Drive which field we want to modify, but not how.&lt;/p&gt;

&lt;p&gt;Next, we check if a value is actually present. If the value is missing or empty, we log a message and skip that field entirely. This is important because sending empty field updates can cause API errors or overwrite existing values accidentally.&lt;/p&gt;

&lt;p&gt;After that, the function switches behaviour based on the field's type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text fields:  These are the simplest. We attach the value using:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setTextValues: [value]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API always expects values as arrays, even if there's only one value.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integer fields: We first run parseInt(value) to verify that the value is actually numeric. If it's not a valid number, we log an error and skip the field. If it is valid, we convert it to a string and attach it using:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setIntegerValues: ["123"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Date fields: Dates are trickier because the API only accepts them in strict YYYY-MM-DD format. We solve this by:&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Creating a JavaScript Date object&lt;/li&gt;
&lt;li&gt;Converting it to ISO format&lt;/li&gt;
&lt;li&gt;Dropping the time portion using:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date.toISOString().split("T")[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This guarantees the format Drive expects.&lt;br&gt;
Selection (dropdown) fields: These use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setSelectionValues: [value]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note on selection fields&lt;/strong&gt;&lt;br&gt;
In real production systems, selection (dropdown) fields require option IDs - not display values. This demo assumes a direct mapping for simplicity. In the Gemini-powered automation covered next, option IDs are resolved dynamically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If at any point a field fails validation - invalid date, non-numeric integer, missing value - that field is excluded from the request entirely. This ensures that one bad field never breaks the entire automation.&lt;/p&gt;

&lt;p&gt;After processing all fields, we run a cleanup step using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.filter(mod =&amp;gt; mod !== null)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This removes any skipped or invalid field updates and leaves us with only clean, valid modifications.&lt;/p&gt;

&lt;p&gt;Next comes a very important safety check: If no valid field modifications remain, we don't try to update fields at all. &lt;/p&gt;

&lt;p&gt;Instead, we gracefully fall back to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;applyLabelToFile(fileId, labelId)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This guarantees that the label still gets applied even if field data is missing.&lt;/p&gt;

&lt;p&gt;If valid fields do exist, we build the final modifyLabels request. This request bundles both actions into one atomic update:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Applying the label&lt;/li&gt;
&lt;li&gt;Updating all valid fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is done in a single API call using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Drive.Files.modifyLabels(request, fileId);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From Drive's perspective, this happens as one clean transaction instead of multiple partial updates.&lt;/p&gt;

&lt;p&gt;Finally, the API response is logged and returned so we can inspect what actually changed. If anything fails - permission issues, API limits, or malformed requests - the &lt;code&gt;catch&lt;/code&gt; block logs the error and safely returns an empty array instead of crashing the full workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full automation: chaining everything together
&lt;/h2&gt;

&lt;p&gt;Up to this point, every function we've written has been doing one focused job - fetching labels, fetching fields, applying a label, or updating fields. The fullLabelAutomation(fileId) function is where all of those pieces finally come together into a single, end-to-end automation pipeline.&lt;/p&gt;

&lt;p&gt;Think of this function as the orchestration layer. It doesn't introduce any new low-level API logic. Instead, it coordinates all the building blocks we already created and runs them in the right order.&lt;/p&gt;

&lt;p&gt;The function starts by logging the file ID being processed. This may seem minor, but it's extremely useful when you're running batch jobs or automations on multiple files and need traceability in your execution logs.&lt;/p&gt;

&lt;p&gt;The very first real step is calling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const labelMap = fetchAvailableLabels();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that every run starts with a fresh snapshot of currently published and visible labels. We're not hardcoding label IDs anywhere in this workflow, which is important because label configurations can change over time in the Admin Console.&lt;/p&gt;

&lt;p&gt;Immediately after that, we verify that at least one label was found. If not, the script exits cleanly with a helpful message. This avoids unnecessary API calls when the environment itself isn't ready.&lt;/p&gt;

&lt;p&gt;Next comes the label suggestion step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const suggestedLabel = "Invoice";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Right now this is hardcoded for demo purposes, but this is the exact point where you would normally plug in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text extraction from the document&lt;/li&gt;
&lt;li&gt;Regex-based classification&lt;/li&gt;
&lt;li&gt;Or an AI model for document categorization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What matters here is that we treat the suggested label as just another input and still validate it against what actually exists in Drive. We don't blindly trust the suggestion. We look it up in the labelMap, and if it doesn't exist, we log all available labels and safely exit. This kind of validation is critical in production systems.&lt;/p&gt;

&lt;p&gt;Once a valid label is identified, we move on to schema discovery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fieldMap = fetchLabelFields(labelId);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this stage, the script dynamically learns what fields exist on the selected label and what types they are. This allows the automation to adapt even if the label schema changes later - for example, if a new field is added in the Admin Console.&lt;/p&gt;

&lt;p&gt;If no fields are found, the script doesn't fail. Instead, it gracefully falls back to applying only the label using applyLabelToFile(). This ensures that even minimal labels without metadata fields still work with the automation.&lt;/p&gt;

&lt;p&gt;If fields do exist, we then build the structured fields array. This is where raw business data gets mapped to Drive metadata. &lt;/p&gt;

&lt;p&gt;In our demo, this is done using mock values like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invoice Number&lt;/li&gt;
&lt;li&gt;Invoice Date&lt;/li&gt;
&lt;li&gt;Vendor Name&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each field entry is constructed using the dynamically fetched field ID and type, combined with the value you want to store. The end result is a clean, API-ready representation of your metadata.&lt;/p&gt;

&lt;p&gt;This is also the exact point where you would plug in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OCR output from PDFs&lt;/li&gt;
&lt;li&gt;Extracted text from Google Docs&lt;/li&gt;
&lt;li&gt;Parsed values from emails or forms&lt;/li&gt;
&lt;li&gt;Or structured data returned by an AI model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the fields array is prepared, everything is handed off to the core execution function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;applyLabelAndUpdateFields(fileId, labelId, fields);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single call applies the label and writes all valid field values in one atomic operation. From Drive's perspective, the file moves instantly from unlabeled to fully enriched with structured metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a Clean Entry Point with runDemo()
&lt;/h2&gt;

&lt;p&gt;Instead of directly calling fullLabelAutomation(fileId) at the bottom of the script, we now wrap it inside a simple launcher function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function runDemo() {
  // Replace this with your actual File ID
  const myFileId = "your_file_id"; 

  fullLabelAutomation(myFileId);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This small addition significantly improves how the automation is executed and tested.&lt;/p&gt;

&lt;p&gt;It gives us a clean entry point for the entire workflow. You can now simply select &lt;code&gt;runDemo&lt;/code&gt; from the function dropdown and click Run-without touching the core logic every time.&lt;/p&gt;

&lt;p&gt;More importantly, this mirrors how real-world systems behave. In production, fullLabelAutomation() would typically be triggered by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Drive folder upload trigger&lt;/li&gt;
&lt;li&gt;A time-based batch job&lt;/li&gt;
&lt;li&gt;A UI button inside an Add-on&lt;/li&gt;
&lt;li&gt;Or a webhook or API call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, &lt;code&gt;runDemo()&lt;/code&gt; cleanly separates &lt;strong&gt;execution control&lt;/strong&gt; from &lt;strong&gt;automation logic&lt;/strong&gt;, which is exactly how scalable Drive automation systems should be structured.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjbtq0ig6xsklap9lf53.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjbtq0ig6xsklap9lf53.png" alt=" " width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once this function completes successfully, you can open the file in Google Drive, click on File details → Labels, and see the label and populated metadata live.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj02fxjbefoguwjmgs5vj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj02fxjbefoguwjmgs5vj.png" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What we have built here is a robust labeling engine. It solves the hardest part of the Drive Labels API: translating human-readable names (like Invoice) into the cryptic IDs that Google requires.&lt;/p&gt;

&lt;p&gt;Because we separated the logic into distinct steps - &lt;strong&gt;Fetch&lt;/strong&gt;, &lt;strong&gt;Map&lt;/strong&gt;, &lt;strong&gt;Build&lt;/strong&gt;, &lt;strong&gt;Apply&lt;/strong&gt; - this script is highly resilient. If you change a field name in the Admin Console, you only have to update your mapping logic, not the entire payload structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap: What We've Built So Far
&lt;/h2&gt;

&lt;p&gt;At this point in the walkthrough, we've quietly assembled a complete Google Drive Labels automation pipeline.&lt;/p&gt;

&lt;p&gt;We started by dynamically discovering which labels exist in the workspace instead of hardcoding anything. Then we learned how to inspect a label's schema at runtime and understand what fields it contains and what types those fields expect. From there, we moved into actually applying labels to files and finally into enriching those labels with structured field values.&lt;/p&gt;

&lt;p&gt;Individually, each function does one small, focused job. But together, they form something much more powerful: &lt;em&gt;&lt;strong&gt;a reusable metadata engine for Google Drive.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By the time we reached the full automation function, everything clicked into place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Label discovery&lt;/li&gt;
&lt;li&gt;Schema discovery&lt;/li&gt;
&lt;li&gt;Validation&lt;/li&gt;
&lt;li&gt;Field mapping&lt;/li&gt;
&lt;li&gt;Atomic application of labels and values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a system where files don't just get tagged - they get structured, searchable metadata that Drive can actually understand and act on. This is the foundation for any serious document automation strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How This Becomes Real Automation (Beyond a Demo)
&lt;/h2&gt;

&lt;p&gt;Right now, we've been running this using a manual function trigger with a single test file. That's perfect for learning and debugging - but the real power of this setup shows up when you connect it to actual workflows.&lt;/p&gt;

&lt;p&gt;In a production environment, this same pipeline can be triggered automatically when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new file is uploaded to a specific Drive folder&lt;/li&gt;
&lt;li&gt;An invoice gets dropped into an Accounts folder&lt;/li&gt;
&lt;li&gt;A contract is generated from a form submission&lt;/li&gt;
&lt;li&gt;A shared drive receives new documents from vendors&lt;/li&gt;
&lt;li&gt;A scheduled batch process scans unlabelled files every night&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, there is no manual step left. Files flow into Drive, your automation picks them up, and labels + structured fields get applied in the background without anyone needing to open the document.&lt;/p&gt;

&lt;p&gt;And the best part is - all of this runs on top of tools most teams already have: Google Drive, Google Apps Script, and Workspace APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If there's one key takeaway from this walkthrough, it's this: Google Drive Labels are not just visual tags - they're a powerful metadata platform hiding in plain sight.&lt;/p&gt;

&lt;p&gt;With Google Apps Script, you now have full programmatic control over discovering labels, understanding their schemas, and enriching files with structured, queryable metadata. Once this foundation is in place, Drive stops being just a storage system and starts behaving like an intelligent document platform.&lt;/p&gt;

&lt;p&gt;In the next part, we'll take this further by introducing fully automatic, Gemini-powered labeling, where documents are analyzed and classified without any manual input.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aryanirani123/Google-Apps-Script/blob/master/DriveLabelsAutomation.js" rel="noopener noreferrer"&gt;https://github.com/aryanirani123/Google-Apps-Script/blob/master/DriveLabelsAutomation.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to reach out if you have any issues/feedback at &lt;a href="mailto:aryanirani123@gmail.com"&gt;aryanirani123@gmail.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>googledrive</category>
      <category>googleworkspace</category>
      <category>googleappscript</category>
    </item>
    <item>
      <title>Integrating Zomato’s MCP Server into Gemini CLI: AI-Powered Food Ordering in Your Terminal</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Thu, 30 Oct 2025 05:11:46 +0000</pubDate>
      <link>https://forem.com/aryanirani123/integrating-zomatos-mcp-server-into-gemini-cli-ai-powered-food-ordering-in-your-terminal-6fc</link>
      <guid>https://forem.com/aryanirani123/integrating-zomatos-mcp-server-into-gemini-cli-ai-powered-food-ordering-in-your-terminal-6fc</guid>
      <description>&lt;p&gt;Hey folks! If you’re like me, you love blending AI with everyday tasks — like ordering dinner without leaving your terminal. Zomato just dropped a shiny new &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; server on October 22, 2025, turning their food delivery magic into AI-friendly tools. This means you can discover restaurants, browse menus, build carts and place orders.&lt;/p&gt;

&lt;p&gt;MCP? It’s an open standard (kicked off by Anthropic in late 2024) that lets AI agents like Gemini connect to external services seamlessly. Think of it as a universal plug for tools and APIs.&lt;/p&gt;

&lt;p&gt;If you want to learn more about building an integrating an MCP server into Gemini CLI, check out tutorial below.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/google-cloud/building-a-custom-mcp-server-for-gemini-cli-a-personal-finance-assistant-tutorial-ee230229ab7d" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A64%3A64%2F1%2AzHMOnHjeT0QOF8sioPh-Bw.jpeg" alt="Aryan Irani"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/google-cloud/building-a-custom-mcp-server-for-gemini-cli-a-personal-finance-assistant-tutorial-ee230229ab7d" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Building a Custom MCP Server for Gemini CLI: A Hands-on guide | by Aryan Irani | Google Cloud - Community | Sep, 2025 | Medium&lt;/h2&gt;
      &lt;h3&gt;Aryan Irani ・ &lt;time&gt;Sep 9, 2025&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;In this quick guide, we’ll integrate Zomato’s MCP server into Gemini CLI — Google’s open-source AI agent for your terminal (launched mid-2025). We’ll cover setup, config, and some fun interactions. Let’s get you ordering pizza with prompts in under 10 minutes!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Zomato mcp-server-manifest?
&lt;/h2&gt;

&lt;p&gt;Zomato’s mcp-server-manifest is an implementation of the Model Context Protocol (MCP) that exposes Zomato’s services as a tool for AI assistants. This allows you to conversationally interact with Zomato to discover restaurants, browse their menus, create a cart, and place an order. The server utilizes OAuth for secure authentication.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before we begin, ensure you have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini CLI installed:&lt;/strong&gt; If you haven’t already, you can install it by running the following command in your terminal:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g @google/gemini-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To learn more about Gemini CLI, check out the detailed tutorial series given below.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/google-cloud/gemini-cli-tutorial-series-77da7d494718" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A64%3A64%2F1%2A-JQl2Mvox0IH75DTOgj6Ow.png" alt="Romin Irani"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/google-cloud/gemini-cli-tutorial-series-77da7d494718" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Gemini CLI Tutorial Series. Welcome to the Gemini CLI Tutorial… | by Romin Irani | Google Cloud - Community | Medium&lt;/h2&gt;
      &lt;h3&gt;Romin Irani ・ &lt;time&gt;Oct 10, 2025&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Zomato Account&lt;/strong&gt;: You will need your Zomato account credentials to authenticate and place orders.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrating Zomato with Gemini CLI: A Step-by-Step Guide
&lt;/h3&gt;

&lt;p&gt;The key to this integration lies in configuring the Zomato MCP server within the Gemini CLI’s settings. Here’s how to do it:&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Locate your Gemini CLI settings file
&lt;/h4&gt;

&lt;p&gt;The Gemini CLI configuration is stored in a JSON file located in your home directory. You can find it at ~/.gemini/settings.json.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;code ~/.gemini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ful3s6dql8gtyme9r5doh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ful3s6dql8gtyme9r5doh.png" alt=" " width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Step 2: Add the Zomato MCP Server Configuration
&lt;/h4&gt;

&lt;p&gt;Open the settings.json file in your favorite text editor. You will need to add a new entry to the mcpServers object. This object contains the configurations for all the external tools you want to integrate with Gemini CLI.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    "mcpServers": {
      "zomato-mcp": {
        "command": "npx",
        "args": [
          "mcp-remote",
          "https://mcp-server.zomato.com/mcp"
        ]
      }

  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Check out the official Github repository for the MCP server.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Zomato" rel="noopener noreferrer"&gt;
        Zomato
      &lt;/a&gt; / &lt;a href="https://github.com/Zomato/mcp-server-manifest" rel="noopener noreferrer"&gt;
        mcp-server-manifest
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Zomato MCP Server&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;An mcp server for your food ordering needs.&lt;/p&gt;

&lt;p&gt;Disclaimer : This is only for testing purposes and Zomato disclaims any and all liabilities that may arise due to erroneous / non-functionality of the MCP integration.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Supported Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;🔎 &lt;strong&gt;Restaurant Discovery&lt;/strong&gt; - Find nearby restaurants based on your location and preferences.&lt;/li&gt;
&lt;li&gt;📒 &lt;strong&gt;Menu Browsing&lt;/strong&gt; - Browse through detailed menus with prices, descriptions, and ratings.&lt;/li&gt;
&lt;li&gt;🛒 &lt;strong&gt;Cart Creation&lt;/strong&gt; - Add items to your cart and customize orders with ease.&lt;/li&gt;
&lt;li&gt;🥗 &lt;strong&gt;Food Ordering&lt;/strong&gt; - Place orders seamlessly with order tracking support.&lt;/li&gt;
&lt;li&gt;💳 &lt;strong&gt;QR code payment&lt;/strong&gt; - Complete secure payments using QR code integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation Guide&lt;/h2&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;OAuth Redirect URI Warning&lt;/strong&gt;: Currently, we have only whitelisted the following redirect URIs for OAuth authentication. Please reach out to us to enable your client:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;claude://claude.ai/settings/connectors&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://chatgpt.com/connector_platform_oauth_redirect&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http://localhost&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http://127.0.0.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://claude.ai/api/mcp/auth_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://insiders.vscode.dev/redirect&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://oauth.pstmn.io/v1/callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://vscode.dev/redirect&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Install in VsCode&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;&lt;b&gt;One Click Installation&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://insiders.vscode.dev/redirect?url=vscode:mcp/install?%7B%22type%22%3A%22http%22%2C%22name%22%3A%22zomato-mcp%22%2C%22version%22%3A%220.0.1%22%2C%22description%22%3A%22MCP%20server%20to%20interact%20with%20Zomato%20services%22%2C%22url%22%3A%22https%3A%2F%2Fmcp-server.zomato.com%2Fmcp%22%2C%22author%22%3A%22Zomato%22%2C%22tags%22%3A%5B%22zomato-mcp%22%2C%22mcp%22%2C%22server%22%5D%2C%22categories%22%3A%5B%22mcp%22%5D%7D" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/79ce758faef9c4767251c680f12281766d02a266dc2f754665e47e2d7047a5db/68747470733a2f2f636f64652e76697375616c73747564696f2e636f6d2f6173736574732f696d616765732f636f64652d737461626c652e706e67" alt="Click to install" height="32"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Manual Installation&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Add this…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Zomato/mcp-server-manifest" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33vzlpsqm8s7r4m04a39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33vzlpsqm8s7r4m04a39.png" alt=" " width="800" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explanation of the configuration:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;zomato&lt;/strong&gt;: This is a user-defined name for the MCP server. You can choose any name you like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;command: npx **: This specifies the command to execute to start the MCP server. In this case, we are using npx, which is a package runner tool that comes with npm.&lt;br&gt;
**args: […]&lt;/strong&gt;: This is an array of arguments to be passed to the command.&lt;br&gt;
&lt;strong&gt;mcp-server&lt;/strong&gt;: This is the name of the package that will run the MCP server.&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/Zomato/mcp-server-manifest" rel="noopener noreferrer"&gt;https://github.com/Zomato/mcp-server-manifest&lt;/a&gt;&lt;/strong&gt;: This is the URL to the Zomato mcp-server-manifest on GitHub.&lt;/p&gt;
&lt;h4&gt;
  
  
  Step 3: Save and Restart Gemini CLI
&lt;/h4&gt;

&lt;p&gt;Save the settings.json file and restart your Gemini CLI. If it’s already running, you can exit and relaunch it.&lt;/p&gt;
&lt;h4&gt;
  
  
  Step 4: Verify the Integration
&lt;/h4&gt;

&lt;p&gt;Once Gemini CLI restarts, it will automatically connect to the Zomato MCP server. The first time you try to access it requires authentication , you will be prompted to log in to your Zomato account through a secure OAuth flow. Once done, you will be redirected back to your terminal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feipt5i59s6p3o9e3boq4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feipt5i59s6p3o9e3boq4.png" alt=" " width="508" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To verify that the integration is successful, you can use the /mcp command in the Gemini CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will list all the configured MCP servers. You should see zomato in the list of connected servers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6796jtko3ivh1wxxvrw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6796jtko3ivh1wxxvrw6.png" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Interacting with Zomato through Gemini CLI
&lt;/h2&gt;

&lt;p&gt;Now for the fun part! You can start interacting with Zomato using natural language queries directly in your Gemini CLI. Here are a few examples to get you started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;To find restaurants&lt;/strong&gt;: Find me some biryani restaurants near me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;To see the menu of a restaurant&lt;/strong&gt;: Show me the menu for Restaurant Name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;To add items to your cart&lt;/strong&gt;: Add one chicken biryani to my cart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;To view your cart&lt;/strong&gt;: Show my cart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;To place an order&lt;/strong&gt;: Place this order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the demo given below for verification and interaction with the Zomato MCP Server using Gemini CLI.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/MZKcSsdGP7o"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  A Powerful Combination for a Seamless Workflow
&lt;/h2&gt;

&lt;p&gt;The integration of the Zomato mcp-server with Gemini CLI is a fantastic example of how the command line is evolving into a more interactive and powerful tool. This seamless connection allows developers and command-line enthusiasts to stay within their preferred environment while accessing essential real-world services. So, the next time you’re deep in your coding workflow and hunger strikes, you know you’re just a command away from your next meal.&lt;/p&gt;

</description>
      <category>geminicli</category>
      <category>mcp</category>
      <category>zomatomcp</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Getting Started with SmartCheckbox™: Install, Setup, and your First Rule</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Tue, 28 Oct 2025 07:29:04 +0000</pubDate>
      <link>https://forem.com/aryanirani123/getting-started-with-smartcheckbox-install-setup-and-your-first-rule-42jo</link>
      <guid>https://forem.com/aryanirani123/getting-started-with-smartcheckbox-install-setup-and-your-first-rule-42jo</guid>
      <description>&lt;p&gt;If you've ever spent more time fighting Google Sheets than actually working in it, you're not alone. Checkboxes are a staple in task trackers, inventories, and reports — but default ones either stay static or override your changes like an overzealous intern.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;&lt;a href="https://smartcheckbox.store/" rel="noopener noreferrer"&gt;SmartCheckbox&lt;/a&gt;™&lt;/strong&gt;, a free Google Workspace add-on that makes checkboxes smart: they auto-update based on your data, but respect your manual tweaks. No more "Why did it flip back?!" moments.&lt;/p&gt;

&lt;p&gt;This guide walks you through installation, your first setup, and running a simple rule. By the end, you'll have a live task tracker. Let's get started — no coding required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Installing SmartCheckbox
&lt;/h2&gt;

&lt;p&gt;1.&lt;strong&gt;Open Google Sheets:&lt;/strong&gt; Head to sheets.google.com and open (or create) a spreadsheet.&lt;br&gt;
2.&lt;strong&gt;Access Extensions:&lt;/strong&gt; Click Extensions in the top menu → Add-ons → Get add-ons.&lt;br&gt;
3.&lt;strong&gt;Search &amp;amp; Install:&lt;/strong&gt; Type "SmartCheckbox" in the search bar. Click the add-on card → Install. Grant permissions (it only accesses your active sheet).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe00qmwwnsrk2os2zips0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe00qmwwnsrk2os2zips0.png" alt=" " width="800" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.&lt;strong&gt;Verify:&lt;/strong&gt; Refresh your sheet. Go to Extensions → SmartCheckbox → Open Sidebar. A clean panel appears on the right.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktb9t3ft2onxgoycaw1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktb9t3ft2onxgoycaw1u.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pro Tip: If you're on a work account, check with your admin — but it's read-only on your sheets, no data leaves Google.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 2: Your First Setup – The Basics
&lt;/h2&gt;

&lt;p&gt;The sidebar has four sections: &lt;strong&gt;Setup&lt;/strong&gt;, &lt;strong&gt;Conditions&lt;/strong&gt;, &lt;strong&gt;Options&lt;/strong&gt;, &lt;strong&gt;Status&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5qfnqv2rkcp1d1tig2w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5qfnqv2rkcp1d1tig2w.png" alt=" " width="800" height="855"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup (Target &amp;amp; Range):
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Target Column:&lt;/strong&gt; Click the dropdown → Select a header (e.g., "Completed?") or type a letter (e.g., "F"). This is where checkboxes live.&lt;br&gt;
&lt;strong&gt;Row Range:&lt;/strong&gt; Enter start (e.g., 2) and end (e.g., 10). Skips headers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06g85qq7c2tiqdsq1ks2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06g85qq7c2tiqdsq1ks2.png" alt=" " width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conditions (The Magic):
&lt;/h3&gt;

&lt;p&gt;1.Click + Add Condition.&lt;br&gt;
2.Column: Pick "Status" (dropdown).&lt;br&gt;
3.Operator: Select == (equals).&lt;br&gt;
Value: Type Done (no quotes needed).&lt;br&gt;
Combiner: Leave as "AND" for now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpvbfliwoqgrlyyphappi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpvbfliwoqgrlyyphappi.png" alt=" " width="800" height="856"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Options (Polish It):
&lt;/h3&gt;

&lt;p&gt;Custom True: Yes (instead of TRUE).&lt;br&gt;
Custom False: No.&lt;br&gt;
Auto-Refresh: Toggle on (updates on edits).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7de8f64zc1cu4lhyan0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7de8f64zc1cu4lhyan0.png" alt=" " width="800" height="855"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apply: &lt;strong&gt;Hit Apply &amp;amp; Save&lt;/strong&gt;. Watch checkboxes appear — and auto-check where "Status" is "Done".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawbhw7yqxen54z61jabb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawbhw7yqxen54z61jabb.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Action,Result&lt;br&gt;
Look at Row 3 → Status = Done, Completed? auto-fills with a checked box and shows Yes&lt;br&gt;
Row 1, 2, 4 → Status ≠ Done,All show unchecked and No&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 3: Test Your First Rule
&lt;/h2&gt;

&lt;p&gt;Now that your rule is saved, let’s see it in action. Now change &lt;strong&gt;Row 1 Status&lt;/strong&gt; → &lt;strong&gt;Done&lt;/strong&gt; &lt;br&gt;
The checkbox in the Completed? column auto-checks → Yes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ws4e49h8duo78c244dj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ws4e49h8duo78c244dj.png" alt=" " width="800" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Just Learned
&lt;/h2&gt;

&lt;p&gt;Auto-updates happen instantly when data matches your rule.&lt;br&gt;
Manual clicks are final — SmartCheckbox never overrides them.&lt;br&gt;
Custom labels (Yes/No) make your sheet readable at a glance.&lt;/p&gt;

&lt;p&gt;You now have a fully functional, self-maintaining task tracker.&lt;br&gt;
Try adding a new row (e.g., Task ID 5, Status = "Done") — watch the checkbox appear and auto-check!&lt;/p&gt;

&lt;p&gt;Try it now → Install &lt;a href="https://workspace.google.com/marketplace/app/smartcheckbox/664272491133" rel="noopener noreferrer"&gt;SmartCheckbox&lt;/a&gt;&lt;br&gt;
Live Demo → &lt;a href="https://smartcheckbox.store/" rel="noopener noreferrer"&gt;https://smartcheckbox.store/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's Next?&lt;br&gt;
You've got basics down. Next guide: Hands-on Tutorial with real-world use-case. &lt;/p&gt;

&lt;p&gt;Check it out -&amp;gt; &lt;a href="https://dev.to/aryanirani123/hands-on-tutorial-build-a-content-approval-workflow-with-smartcheckbox-1mc4"&gt;https://dev.to/aryanirani123/hands-on-tutorial-build-a-content-approval-workflow-with-smartcheckbox-1mc4&lt;/a&gt;&lt;/p&gt;

</description>
      <category>googlesheets</category>
      <category>addons</category>
      <category>googleworkspace</category>
      <category>automation</category>
    </item>
    <item>
      <title>Hands-On Tutorial – Build a Content Approval Workflow with SmartCheckbox</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Tue, 28 Oct 2025 07:27:17 +0000</pubDate>
      <link>https://forem.com/aryanirani123/hands-on-tutorial-build-a-content-approval-workflow-with-smartcheckbox-1mc4</link>
      <guid>https://forem.com/aryanirani123/hands-on-tutorial-build-a-content-approval-workflow-with-smartcheckbox-1mc4</guid>
      <description>&lt;p&gt;You’re a content team. Blog drafts, social posts, video scripts — all live in Google Sheets.&lt;/p&gt;

&lt;p&gt;Every week:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writer marks “Ready for Review”&lt;/li&gt;
&lt;li&gt;Editor checks a box → “Approved”&lt;/li&gt;
&lt;li&gt;Someone emails the team: “Is this live?”&lt;/li&gt;
&lt;li&gt;Then someone accidentally unchecks it → chaos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SmartCheckbox kills the chaos.&lt;/p&gt;

&lt;p&gt;In this hands-on tutorial, you’ll build a Content Approval Workflow that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-approves when all 3 steps are complete&lt;/li&gt;
&lt;li&gt;Lets editors manually override (e.g., “Reject”)&lt;/li&gt;
&lt;li&gt;Logs every change in an Audit Log&lt;/li&gt;
&lt;li&gt;Uses custom labels: Approved,Draft&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No scripts. No formulas. No more “Did we approve this?”&lt;br&gt;
Let’s build it — step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Set Up Your Content Calendar Sheet
&lt;/h2&gt;

&lt;p&gt;Create a new Google Sheet → Name it: Content Approval Workflow&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjovu3zrk5e4lflx029qv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjovu3zrk5e4lflx029qv.png" alt=" " width="800" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note:&lt;br&gt;
C, D, E = Yes/No dropdowns (Data → Data validation → List: Yes,No)&lt;br&gt;
F (Status) = Optional text field for team notes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 2: Configure SmartCheckbox – AND Logic Rule
&lt;/h2&gt;

&lt;p&gt;Open SmartCheckbox Sidebar → Extensions &amp;gt; SmartCheckbox &amp;gt; Open Sidebar&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecf7mrmdmb7lmilwxftv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecf7mrmdmb7lmilwxftv.png" alt=" " width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set Target &amp;amp; Range:&lt;/strong&gt; Click the dropdown → Select a header (e.g., "Approved?") or type a letter (e.g., "F"). This is where checkboxes live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Row Range:&lt;/strong&gt; Enter start (e.g., 2) and end (e.g., 10). Skips headers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j71g8kojg7oal3ajbbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j71g8kojg7oal3ajbbv.png" alt=" " width="800" height="1026"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Conditions Tab: *&lt;/em&gt; 3-Step AND Logic → Click + Add Condition → 3 times&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&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;Draft Complete?&lt;/td&gt;
&lt;td&gt;==&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Editor Review?&lt;/td&gt;
&lt;td&gt;==&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Designer OK?&lt;/td&gt;
&lt;td&gt;==&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Combiner: All must be true (AND)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pm1jezroa5k0m8niitb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pm1jezroa5k0m8niitb.png" alt=" " width="800" height="1075"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Options Tab(Polish It) *&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvzjmwlhngz033aie58k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvzjmwlhngz033aie58k.png" alt=" " width="800" height="1072"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save &amp;amp; Apply&lt;br&gt;
Click Apply &amp;amp; Save → Watch Column G update:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdreaasr0yqhqdc4ku2hb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdreaasr0yqhqdc4ku2hb.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Test the Workflow – Real Team Simulation
&lt;/h2&gt;

&lt;p&gt;Let’s simulate a real content week. &lt;/p&gt;

&lt;p&gt;Full Approval&lt;/p&gt;

&lt;p&gt;Row 1 already has all Yes → Approved&lt;br&gt;
Row 5: Set all values → Yes → G5 → Approved instantly&lt;br&gt;
You can also see that it has logged this into the Audit-Log. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ieg4qbasp1pforxerdp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ieg4qbasp1pforxerdp.png" alt=" " width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Your Content Workflow Is Live
&lt;/h2&gt;

&lt;p&gt;You now have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A self-policing approval system&lt;/li&gt;
&lt;li&gt;No more email threads&lt;/li&gt;
&lt;li&gt;Full audit trail&lt;/li&gt;
&lt;li&gt;Manual control when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it now → Install &lt;a href="https://workspace.google.com/marketplace/app/smartcheckbox/664272491133?flow_type=2" rel="noopener noreferrer"&gt;SmartCheckbox&lt;/a&gt;&lt;br&gt;
Live Demo → &lt;a href="https://smartcheckbox.store/" rel="noopener noreferrer"&gt;https://smartcheckbox.store/&lt;/a&gt;&lt;br&gt;
Download Template → [&lt;a href="https://docs.google.com/spreadsheets/d/1KRZA9F0Nh37I672j5IkCI6Pa9JXf_6-3vkmkelWZr1s/copy" rel="noopener noreferrer"&gt;Link&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Built with &lt;a href="https://workspace.google.com/marketplace/app/smartcheckbox/664272491133?flow_type=2" rel="noopener noreferrer"&gt;SmartCheckbox™&lt;/a&gt; — Free forever.&lt;/p&gt;

</description>
      <category>googlesheets</category>
      <category>addons</category>
      <category>googleworkspace</category>
      <category>automation</category>
    </item>
    <item>
      <title>Turn Google Docs Into an AI Agent Hub: Integrate ADK Agents in Google Workspace</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Mon, 20 Oct 2025 12:41:31 +0000</pubDate>
      <link>https://forem.com/aryanirani123/turn-google-docs-into-an-ai-agent-hub-integrate-adk-agents-in-google-workspace-4l6e</link>
      <guid>https://forem.com/aryanirani123/turn-google-docs-into-an-ai-agent-hub-integrate-adk-agents-in-google-workspace-4l6e</guid>
      <description>&lt;p&gt;Series Roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/aryanirani123/agentic-workflows-inside-google-workspace-build-a-google-docs-agent-with-adk-56dc"&gt;Part 1: Build Your First ADK Agent &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/aryanirani123/how-to-deploy-adk-agents-to-vertex-ai-agent-engine-447g"&gt;Part 2: Deploy an ADK Agent to Vertex AI Agent Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part 3: Integrate into Google Docs (You're here!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Welcome back to the final part of our three-part tutorial series on building Google Workspace AI agents using the &lt;strong&gt;Agent Development Kit (ADK)&lt;/strong&gt; and &lt;strong&gt;Vertex AI Agent Engine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the first two parts, we:&lt;br&gt;
 ✅ Built an AI-powered Fact Verifier Agent using the ADK.&lt;br&gt;
 ✅ Deployed it to Vertex AI Agent Engine, making it accessible via API.&lt;/p&gt;

&lt;p&gt;Now in this third and final part, we'll connect everything together - &lt;strong&gt;bringing your deployed agent inside Google Docs&lt;/strong&gt;. With a few lines of Apps Script, you'll transform a standard Google Doc into an &lt;strong&gt;AI-assisted editor&lt;/strong&gt; that can analyze and fact-check content automatically using your deployed agent.&lt;/p&gt;

&lt;p&gt;If you want a video version of the blog, check out the tutorial given below.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/LCiAVTT7XCA"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If your organization is looking to &lt;strong&gt;build custom Google Workspace Add-ons&lt;/strong&gt;, &lt;strong&gt;integrate AI Agents with ADK&lt;/strong&gt;, or &lt;strong&gt;develop agentic workflows using Gemini and Vertex AI&lt;/strong&gt;, my team and I can help. We specialize in turning complex ideas into &lt;strong&gt;production-ready AI solutions&lt;/strong&gt; for enterprise environments.&lt;br&gt;
📩 &lt;a href="mailto:aryanirani123@gmail.com"&gt;Reach out&lt;/a&gt; to discuss your project - whether it's automating Workspace tools, enhancing data intelligence, or designing agent-driven workflows tailored to your needs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step1: Set Up Your Google Docs Environment
&lt;/h2&gt;

&lt;p&gt;Start by opening a new or existing Google Document. From the menu, go to Extensions -&amp;gt; Apps Script to open the editor. We'll use this space to connect to the deployed ADK Agent. The Google Doc we are using for this tutorial contains the following contents: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcxuik64u6fj2rjya9m3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcxuik64u6fj2rjya9m3.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step2: Add the Integration Code
&lt;/h2&gt;

&lt;p&gt;You'll need two files in your Apps Script project for this setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AIVertex.gs&lt;/strong&gt; – Handles all communication with Vertex AI and the ADK Agent. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code.gs&lt;/strong&gt; – Controls the Google Docs interface, menus, and document actions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's go through each one.&lt;/p&gt;

&lt;h3&gt;
  
  
  File 1: AIVertex.gs
&lt;/h3&gt;

&lt;p&gt;This file handles everything related to your deployed agent - making authenticated API calls to both Vertex AI Agent Engine (for reasoning) and Gemini models (for output formatting).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const LOCATION = PropertiesService.getScriptProperties().getProperty('LOCATION');
const GEMINI_MODEL_ID = PropertiesService.getScriptProperties().getProperty('GEMINI_MODEL_ID');
const REASONING_ENGINE_ID = PropertiesService.getScriptProperties().getProperty('REASONING_ENGINE_ID');
const SERVICE_ACCOUNT_KEY = PropertiesService.getScriptProperties().getProperty('SERVICE_ACCOUNT_KEY');

const credentials = credentialsForVertexAI();

/**
 * @param {string} statement The statement to fact-check.
 */
function requestLlmAuditorAdkAiAgent(statement) {
  return UrlFetchApp.fetch(
    `https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${credentials.projectId}/locations/${LOCATION}/reasoningEngines/${REASONING_ENGINE_ID}:streamQuery?alt=sse`,
    {
      method: 'post',
      headers: { 'Authorization': `Bearer ${credentials.accessToken}` },
      contentType: 'application/json',
      muteHttpExceptions: true,
      payload: JSON.stringify({
        "class_method": "async_stream_query",
        "input": {
          "user_id": "google_sheets_custom_function_fact_check",
          "message": statement,
        }
      })
    }
  ).getContentText();
}

/**
 * @param {string} prompt The Gemini prompt to use.
 */
function requestOutputFormatting(prompt) {
  const response = UrlFetchApp.fetch(
    `https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${credentials.projectId}/locations/${LOCATION}/publishers/google/models/${GEMINI_MODEL_ID}:generateContent`,
    {
      method: 'post',
      headers: { 'Authorization': `Bearer ${credentials.accessToken}` },
      contentType: 'application/json',
      muteHttpExceptions: true,
      payload: JSON.stringify({
        "contents": [{
          "role": "user",
          "parts": [{ "text": prompt }]
        }],
        "generationConfig": { "temperature": 0.1, "maxOutputTokens": 2048 },
        "safetySettings": [
          {
            "category": "HARM_CATEGORY_HARASSMENT",
            "threshold": "BLOCK_NONE"
          },
          {
            "category": "HARM_CATEGORY_HATE_SPEECH",
            "threshold": "BLOCK_NONE"
          },
          {
            "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
            "threshold": "BLOCK_NONE"
          },
          {
            "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
            "threshold": "BLOCK_NONE"
          }
        ]
      })
    }
  );
  return JSON.parse(response).candidates[0].content.parts[0].text
}

/**
 * Gets credentials required to call Vertex API using a Service Account.
 * Requires use of Service Account Key stored with project.
 * 
 * @return {!Object} Containing the Google Cloud project ID and the access token.
 */
function credentialsForVertexAI() {
  const credentials = SERVICE_ACCOUNT_KEY;
  if (!credentials) {
    throw new Error("service_account_key script property must be set.");
  }

  const parsedCredentials = JSON.parse(credentials);

  const service = OAuth2.createService("Vertex")
    .setTokenUrl('https://oauth2.googleapis.com/token')
    .setPrivateKey(parsedCredentials['private_key'])
    .setIssuer(parsedCredentials['client_email'])
    .setPropertyStore(PropertiesService.getScriptProperties())
    .setScope("https://www.googleapis.com/auth/cloud-platform");
  return {
    projectId: parsedCredentials['project_id'],
    accessToken: service.getAccessToken(),
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What this file does
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Authenticates securely to Vertex AI using a Service Account key.
Calls your deployed ADK Agent to analyze or fact-check the document text.&lt;/li&gt;
&lt;li&gt;Uses Gemini for smart response formatting - making the results human-readable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  File 2: Code.gs
&lt;/h3&gt;

&lt;p&gt;This file connects your Docs UI with the ADK logic above. It lets you trigger the audit directly from a custom Docs menu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Adds a custom menu in Google Docs to run the AI Audit directly.
 */
function onOpen() {
  DocumentApp.getUi()
    .createMenu('AI Audit Tools')
    .addItem('Run AI Audit', 'runAuditAndInsert')
    .addToUi();
}

/**
 * Returns the entire text content of the document.
 */
function getDocumentText() {
  const doc = DocumentApp.getActiveDocument();
  const body = doc.getBody();
  let text = body.getText();
  return text.trim();
}

/**
 * Runs the AI Audit and inserts the result as text at the end of the document.
 */
function runAuditAndInsert() {
  const docText = getDocumentText();
  const result = runAudit(docText);

  if (result) {
    const doc = DocumentApp.getActiveDocument();
    const body = doc.getBody();
    // Append the audit result as a new paragraph at the end of the document
    body.appendParagraph('AI Audit Result: ' + result);
  }
}

/**
 * Runs the AI Audit using ADK Agent and Gemini formatting.
 */
function runAudit(docText) {
  console.log('[INFO] Starting AI audit process...');
  if (!docText) {
    console.log('[WARN] No text in document.');
    return '⚠️ The document is empty. Please add some text to audit.';
  }

  // Check for excessive document length to avoid token limits
  if (docText.length &amp;gt; 10000) {
    console.log('[WARN] Document too long.');
    return '⚠️ Document exceeds 10,000 characters. Please shorten the text.';
  }

  console.log('[STEP] Sending text to ADK Agent...');
  const rawAudit = requestLlmAuditorAdkAiAgent(docText);

  // Check if rawAudit is an error message
  if (rawAudit.startsWith('ERROR:')) {
    console.error('[ERROR] ADK Agent returned error:', rawAudit);
    return rawAudit;
  }

  console.log('[STEP] Formatting AI response...');
  let formatted;
  try {
    formatted = requestOutputFormatting(
      `Here is a fact-checking result: ${rawAudit}.
       Summarize it. Keep the main verdict and reasoning. Remove markdown and make it concise.`
    );
  } catch (error) {
    console.error('[ERROR] Formatting failed:', error.toString());
    return `ERROR: Failed to format audit result - ${error.toString()}`;
  }

  console.log('[SUCCESS] Audit completed successfully.');
  console.log('[RESULT] Final Output:', formatted);
  return formatted;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What this file does
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Adds a custom menu in Google Docs called AI Audit Tools.&lt;/li&gt;
&lt;li&gt;Grabs your document text and sends it to your ADK Agent for analysis.&lt;/li&gt;
&lt;li&gt;Displays the &lt;strong&gt;AI-generated audit&lt;/strong&gt; results back into the document.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Add Script Properties
&lt;/h2&gt;

&lt;p&gt;To connect your script to your deployed resources, go to:&lt;br&gt;
&lt;strong&gt;Project Settings → Script Properties → Add Script Property&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl62s7qex3lynk0b81nat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl62s7qex3lynk0b81nat.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the following to your Script Properties&lt;br&gt;
&lt;strong&gt;LOCATION:&lt;/strong&gt; The region of your Vertex AI deployment us-central1   &lt;strong&gt;GEMINI_MODEL_ID:&lt;/strong&gt; Gemini model to use gemini-2.5-flash-lite   &lt;strong&gt;REASONING_ENGINE_ID:&lt;/strong&gt; The deployed ADK Agent ID 1234567890   &lt;strong&gt;SERVICE_ACCOUNT_KEY:&lt;/strong&gt; JSON key for the Service Account { "type": "service_account", ... }&lt;/p&gt;

&lt;p&gt;Click Save script properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Add the OAuth2 Library
&lt;/h2&gt;

&lt;p&gt;Our Apps Script project needs the OAuth2 library for authenticating API calls.&lt;br&gt;
To add it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Services → Libraries&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click Add a Library&lt;/li&gt;
&lt;li&gt;Enter the Script ID:&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;1B7FSrk5Zi6L1rS6Qm6C9q8Zs6z3jQm5iBv6-1iQ0gWA-2&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 5: Test Your AI Agent in Google Docs
&lt;/h2&gt;

&lt;p&gt;1.In the Apps Script editor, run the &lt;strong&gt;onOpen()&lt;/strong&gt; function once. This will add a new AI Audit Tools menu in Google Docs.&lt;br&gt;
2.Return to your Doc and click AI Audit Tools → Run AI Audit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F257r7w7l34ymo3fa049j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F257r7w7l34ymo3fa049j.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.The script will send your document's text to the deployed ADK Agent for fact-checking.&lt;br&gt;
4.The AI Audit Result will appear automatically at the end of your document.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjblfsqqvxq6kvdytpfev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjblfsqqvxq6kvdytpfev.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;You've now deployed your AI Agent, connected it to Google Docs, and seen it in action - analyzing, reasoning, and summarizing right where your content lives. What we've built here isn't just a standalone demo. It's the foundation for intelligent, agent-driven collaboration inside Google Workspace.&lt;/p&gt;

&lt;p&gt;By combining ADK's reasoning capabilities with Gemini's generative models, we've effectively turned Google Docs into a living, thinking assistant - one that can read, audit, and refine your text with context.&lt;/p&gt;

&lt;p&gt;But this is only the beginning. The same blueprint extends naturally across Sheets, Slides, Drive, and Gmail - anywhere you want AI to work with you, not just for you. Imagine agents that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit financial data and flag inconsistencies in Sheets,&lt;/li&gt;
&lt;li&gt;Auto-generate pitch decks and summaries in Slides,&lt;/li&gt;
&lt;li&gt;Label and organize documents intelligently in Drive,&lt;/li&gt;
&lt;li&gt;Or even draft and fact-check emails directly in Gmail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This demonstration lays the groundwork for building agentic workflows that integrate seamlessly into your daily Workspace tools - turning static documents into dynamic AI collaborators.&lt;/p&gt;

&lt;p&gt;You've just taken the first step toward the future of AI-native productivity - where every file, message, and meeting can think, reason, and evolve with you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you're ready to bring this level of intelligence into your own Workspace tools, we'd love to collaborate.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>adk</category>
      <category>googleworkspace</category>
      <category>googleappsscript</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Agentic Workflows inside Google Workspace: Build a Google Docs Agent with ADK</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Mon, 20 Oct 2025 12:41:28 +0000</pubDate>
      <link>https://forem.com/aryanirani123/agentic-workflows-inside-google-workspace-build-a-google-docs-agent-with-adk-56dc</link>
      <guid>https://forem.com/aryanirani123/agentic-workflows-inside-google-workspace-build-a-google-docs-agent-with-adk-56dc</guid>
      <description>&lt;p&gt;Welcome ! &lt;/p&gt;

&lt;p&gt;Google Workspace is where work happens. From drafting reports in Docs to crunching data in Sheets and collaborating in Gmail and Meet - it's the daily home for millions of teams. It's where ideas start, decisions are documented, and collaboration happens in real time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Now imagine if your Docs, Sheets, and Gmail weren't just tools, but collaborators.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks to &lt;strong&gt;Google's Agent Development Kit (ADK)&lt;/strong&gt; and &lt;strong&gt;Vertex AI's Agent Engine&lt;/strong&gt;, that's no longer just an idea. These frameworks let you &lt;strong&gt;build intelligent agents&lt;/strong&gt;, &lt;strong&gt;deploy them at scale&lt;/strong&gt;, and integrate them seamlessly into your Google Workspace tools - enabling a new era of agentic productivity. &lt;/p&gt;

&lt;p&gt;In this three-part tutorial series, we'll explore exactly how to do that. &lt;br&gt;
Series Roadmap: &lt;br&gt;
 - &lt;strong&gt;Part 1: Build Your First ADK Agent (You're here!) &lt;/strong&gt;&lt;br&gt;
 - &lt;strong&gt;&lt;a href="https://dev.to/aryanirani123/how-to-deploy-adk-agents-to-vertex-ai-agent-engine-447g"&gt;Part 2: Deploy an ADK Agent to Vertex AI Agent Engine&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
 - &lt;strong&gt;&lt;a href="https://dev.to/aryanirani123/turn-google-docs-into-an-ai-agent-hub-integrate-adk-agents-in-google-workspace-4l6e"&gt;Part 3: Integrate into Google Docs&lt;/a&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Let's get started and bring intelligent, agentic workflows to the tools you already use every day.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This tutorial builds upon ideas introduced in &lt;a href="https://developers.google.com/apps-script/samples/custom-functions/fact-check" rel="noopener noreferrer"&gt;Google's official Fact-Check sample for Apps Script&lt;/a&gt;. If you're looking for a quick overview of the official implementation, that's a great place to start.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you want a video version of the blog, check out the tutorial given below.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/ZXVtOwIRqOg"&gt;
  &lt;/iframe&gt;


&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9f6rov4gpwiecg1njn7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9f6rov4gpwiecg1njn7.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Building the ADK-Agent
&lt;/h1&gt;

&lt;p&gt;Let'a create the ADK agent - AI based Auditor that fact checks text, inspired by Google's Fact-Check custom function &lt;a href="https://developers.google.com/apps-script/samples/custom-functions/fact-check" rel="noopener noreferrer"&gt;sample&lt;/a&gt;. Unlike the sample's single-step approach, our agent uses multi-step reasoning to extract claims, verify them with google_search, and output structured JSON.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Set Up Your Project Environment
&lt;/h2&gt;

&lt;p&gt;First, prepare your development environment to use the Google Agent Development Kit (ADK). Create a project, install dependencies, and authenticate with Google Cloud.&lt;/p&gt;

&lt;p&gt;1.Create a folder and navigate to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir workspace-agent
cd workspace-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;2.Create &amp;amp; activate virtual environment:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`python -m venv .venv
source .venv/bin/activate`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;3.Install Google ADK:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`pip install google-adk`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;4.Authenticate with Google Cloud for local testing:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`gcloud auth application-default login`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzvge21pyivt7zh4ytbp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzvge21pyivt7zh4ytbp.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the link given below for information on how to get started with Google Cloud SDK.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://docs.cloud.google.com/sdk/docs/install-sdk" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.cloud.google.com%2F_static%2Fcloud%2Fimages%2Fsocial-icon-google-cloud-1200-630.png" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://docs.cloud.google.com/sdk/docs/install-sdk" rel="noopener noreferrer" class="c-link"&gt;
            Quickstart: Install the Google Cloud CLI  |  Google Cloud SDK  |  Google Cloud Documentation
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Learn how to install Google Cloud CLI and run a few core gcloud CLI c ommands.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.gstatic.com%2Fdevrel-devsite%2Fprod%2Fvd3309c0d80f416d7367081c5c5ffd3cd171f6ea37becda6136423538d770ce20%2Fclouddocs%2Fimages%2Ffavicons%2Fonecloud%2Ffavicon.ico"&gt;
          docs.cloud.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Step 2: Design the Agent's Logic
&lt;/h2&gt;

&lt;p&gt;Now that we have our environment setup, we will now write the agent's code in &lt;strong&gt;agent.py&lt;/strong&gt; . An ADK agent has three main components: a model, tools and instruction set to define its behaviour. Our AI-Auditor agent extracts factual claims from text, verifies them with Google Search, and returns a JSON report. &lt;/p&gt;

&lt;p&gt;You can work with the out the agent code by checking out the link given below.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/aryanirani123" rel="noopener noreferrer"&gt;
        aryanirani123
      &lt;/a&gt; / &lt;a href="https://github.com/aryanirani123/ADKAGENTGAPS" rel="noopener noreferrer"&gt;
        ADKAGENTGAPS
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ADKAGENTGAPS&lt;/h1&gt;

&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/aryanirani123/ADKAGENTGAPS" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from google.adk.agents import Agent
from google.adk.tools import google_search
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We start off by setting up our initial python script with the necessary imports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root_agent = Agent(
    name='ai_auditor',
    model='gemini-2.0-flash-001',
    description="Fact-checks statements from a document and provides citations.",
    instruction="""
You are an AI Auditor specialized in factual verification and evidence-based reasoning.
Your goal is to analyze text from a Google Doc, identify verifiable factual claims, and produce a concise, source-backed audit report.

### 🔍 TASK FLOW

1. **Extract Claims**
   - Analyze the input text and identify factual claims that can be objectively verified.
   - A factual claim is any statement that can be proven true or false with external evidence.
   - Skip opinions, vague generalizations, or speculative language.
   - List each claim as a string in a JSON array.

2. **Verify Claims**
   - For each extracted claim:
     - Use the `google_search` tool to find relevant, credible results.
     - Evaluate at least the top 3 relevant URLs to determine the claim's accuracy.
     - Cross-check multiple sources when possible to ensure confidence.

3. **Classify Findings**
   - For each claim, determine one of the following verdicts:
     - ✅ **True:** Supported by multiple reputable sources.
     - ⚠️ **Misleading / Partially True:** Contains partially correct or context-dependent information.
     - ❌ **False:** Contradicted by credible evidence.
     - ❓ **Unverifiable:** Insufficient information to confirm or deny.
   - Provide a **confidence score (0–100)** reflecting the strength of evidence.

4. **Record Evidence**
   - For each claim, include:
     - The **verdict**
     - **Reasoning summary** (1–2 sentences)
     - **List of citation URLs** used for verification

5. **Summarize Results**
   - Compile a final report including:
     - Total number of claims analyzed
     - Distribution of verdicts (True / False / Misleading / Unverifiable)
     - Brief overall conclusion (e.g., "Most claims are accurate but some lack supporting evidence.")

### 🧾 OUTPUT FORMAT

Return your final response in structured JSON format as follows:

{
  "claims": [
    {
      "claim": "...",
      "verdict": "True | False | Misleading | Unverifiable",
      "confidence": 0-100,
      "reasoning": "...",
      "sources": ["https://...", "https://..."]
    }
  ],
  "summary": {
    "total_claims": X,
    "verdict_breakdown": {
      "True": X,
      "False": X,
      "Misleading": X,
      "Unverifiable": X
    },
    "overall_summary": "..."
  }
}

### 🧠 ADDITIONAL INSTRUCTIONS
- Always prefer authoritative domains (.gov, .edu, .org, or major media).
- Avoid low-quality or user-generated content as primary sources.
- Be concise, accurate, and transparent about uncertainty.
    """,
    tools=[google_search],  # Only use the search tool
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We then define the AI agent by giving it a name, followed by the model, description and a very detailed instruction set. The instruction set it the most important part that defines how exactly the agent should think and operate. This structure mirrors how professional fact-checkers work - turning the AI into an &lt;strong&gt;autonomous auditing pipeline&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once done with this agent declaration, we move to giving the agent access to real-world information via the Google Search tool. Instead of relying on pre-trained data, the agent can perform live searches, evaluate results, and provide &lt;strong&gt;up-to-date citations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's what makes this system agentic - the model doesn't just generate answers, it takes action (using tools) to verify information. &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Test the Agent Locally
&lt;/h2&gt;

&lt;p&gt;Before deploying the agent, we must test the agent locally to ensure it works. You can either generate sample scripts for testing to very the agent with sample input and verify the output, or you can test the agent using &lt;em&gt;&lt;strong&gt;adk web&lt;/strong&gt;&lt;/em&gt; command.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fena762cwsewnqifbgdm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fena762cwsewnqifbgdm5.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our first interaction is fundamental: understanding what the agent can actually do. This tests the agent's ability to summarize its description and instruction_text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvasc437ci1ejb6lxlcpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvasc437ci1ejb6lxlcpu.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent provides a concise summary of its abilities, drawing from its description and instruction set.&lt;/p&gt;

&lt;p&gt;We then provide it two statements and it successfully audits the contents and give me back a well structure JSON response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4eb95o4zct1x5vvj4vt2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4eb95o4zct1x5vvj4vt2.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under the hood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The google_search tool fetches relevant pages from the web.&lt;/li&gt;
&lt;li&gt;The Gemini 2.0 Flash model parses those snippets and classifies truthfulness.&lt;/li&gt;
&lt;li&gt;The ADK handles reasoning orchestration and ensures step-by-step logic is followed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This local test phase helps validate your agent's workflow before you deploy it on &lt;strong&gt;Vertex AI Agent Engine&lt;/strong&gt;, where it can be connected to Google Workspace tools like Docs or Sheets.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion and Teaser
&lt;/h1&gt;

&lt;p&gt;Congratulations ! You've built an AI Auditor Agent that fact-checks text with google_search, producing structured JSON responses. This pattern - defining a model, tool and instruction - can power any task, from verifying doc claims to analysing sheet data. By automating manual tasks and leveraging credible sources, you have unlocked smarter productivity. &lt;/p&gt;

&lt;p&gt;Try it now: Run your agent with a fun input like &lt;em&gt;The moon is made of cheese&lt;/em&gt; and check out the JSON response returned by the agent. &lt;/p&gt;

&lt;p&gt;In Part 2, we'll deploy the agent to Vertex AI Agent Engine, making it cloud powered and scalable for production use. Stay tuned, check out the Github repo for all the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aryanirani123/Agent-Development-Kit" rel="noopener noreferrer"&gt;https://github.com/aryanirani123/Agent-Development-Kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to reach out if you have any issues/feedback at &lt;a href="mailto:aryanirani123@gmail.com"&gt;aryanirani123@gmail.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>googleworkspace</category>
      <category>aiagents</category>
      <category>googleappsscript</category>
      <category>adk</category>
    </item>
  </channel>
</rss>
