<?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>DEV Community: Aryan Irani</title>
    <description>The latest articles on DEV Community by Aryan Irani (@aryanirani123).</description>
    <link>https://dev.to/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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F754479%2F1d1fdf42-b44b-4b4b-beba-7125aa2a60e7.jpeg</url>
      <title>DEV Community: Aryan Irani</title>
      <link>https://dev.to/aryanirani123</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aryanirani123"/>
    <language>en</language>
    <item>
      <title>Chatting with your Data: Conversational Analytics in BigQuery</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Sat, 20 Jun 2026 07:45:01 +0000</pubDate>
      <link>https://dev.to/gde/chatting-with-your-data-conversational-analytics-in-bigquery-5545</link>
      <guid>https://dev.to/gde/chatting-with-your-data-conversational-analytics-in-bigquery-5545</guid>
      <description>&lt;p&gt;For the last decade, the workflow for Business Intelligence hasn't changed much: A business stakeholder asks a question, a Data Engineer writes the ad-hoc SQL, and a dashboard is built. But as data scales to the petabyte level, this reactive cycle creates massive bottlenecks.&lt;/p&gt;

&lt;p&gt;What if business users could just chat directly with the database?&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="https://docs.cloud.google.com/bigquery/docs/conversational-analytics" rel="noopener noreferrer"&gt;BigQuery Conversational Analytics&lt;/a&gt;. Google Cloud has effectively turned the traditional data warehouse into an active participant. By leveraging Gemini, Conversational Analytics allows users to query massive datasets using natural language. It understands the intent, generates the complex SQL, and returns the data (or geographic visualizations) instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with "Text-to-SQL" Toys
&lt;/h2&gt;

&lt;p&gt;We've all seen the basic "Text-to-SQL" AI wrappers on Twitter. They look great in a controlled demo, but they fall apart in production. Why? Because raw LLMs don't understand your company's unique business logic. If an AI doesn't know that your definition of "Net Profit" excludes returned items, the data it returns is not just wrong - it's dangerous.&lt;/p&gt;

&lt;p&gt;To deploy AI over enterprise data, you need strict governance.&lt;/p&gt;

&lt;p&gt;You need to be able to explicitly teach the AI your database schema. You need &lt;strong&gt;Dataplex Glossaries&lt;/strong&gt; to lock down business terminology so the AI never guesses a formula. You need &lt;strong&gt;Parameterized Verified Queries&lt;/strong&gt; to ensure highly sensitive financial reports use pre-approved SQL. And crucially, you need &lt;strong&gt;Financial Controls&lt;/strong&gt; (like Maximum Bytes Billed) so a business user asking a vague question doesn't trigger a $5,000 table scan.&lt;/p&gt;

&lt;p&gt;BigQuery Conversational Analytics isn't just an AI wrapper; it's a governed enterprise agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Playlist: Build It&amp;nbsp;Yourself
&lt;/h2&gt;

&lt;p&gt;I spent the last few weeks using this product. To show you exactly how you can get started, I recorded a 4-part vide playlist on YouTube.&lt;/p&gt;

&lt;p&gt;If you are a Data Engineer, Cloud Architect, or BI Analyst, this series will show you exactly how to build and govern your own AI data agents from scratch:&lt;/p&gt;

&lt;p&gt;📺 Part 1: The AI Reasoning Pipeline We dive into the BigQuery Studio UI and test Gemini's ability to perform comparative analysis on the Google Trends public dataset without writing a single line of SQL.&lt;/p&gt;

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

&lt;p&gt;📺 Part 2: Building Custom Data Agents An AI can't magically understand your database schema. I show you how to connect your tables and write System Instructions to explicitly control the SQL that Gemini generates.&lt;/p&gt;

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

&lt;p&gt;📺 Part 3: Enterprise Data Governance We tackle the hardest part of Enterprise AI. I show you how to lock down your agent using Column Metadata, Dataplex Glossaries, and strict financial controls to prevent petabyte-scale billing surprises.&lt;/p&gt;

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

&lt;p&gt;📺 Part 4: Automating Multi-Table Relational Joins In the grand finale, we use everything we've built to force the agent to write a flawless, massive 3-table relational JOIN from a single natural language prompt.&lt;/p&gt;

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

&lt;p&gt;The role of the Data Engineer is shifting from writing ad-hoc SQL to governing autonomous data pipelines. If you're building in Google Cloud, I highly recommend getting hands-on with this.&lt;/p&gt;

&lt;p&gt;You can watch the full series here: &lt;a href="https://youtube.com/playlist?list=PL_MCVBMm-9sogdOzjqIcbX-dAizXux91c&amp;amp;si=890s67FrqxYfZTeu" rel="noopener noreferrer"&gt;https://youtube.com/playlist?list=PL_MCVBMm-9sogdOzjqIcbX-dAizXux91c&amp;amp;si=890s67FrqxYfZTeu&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>googlecloud</category>
      <category>bigquery</category>
      <category>dataagents</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Google Workspace Studio Tutorial: The New 'Notify by Email' Action</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Tue, 16 Jun 2026 12:19:35 +0000</pubDate>
      <link>https://dev.to/gde/google-workspace-studio-tutorial-the-new-notify-by-email-action-2400</link>
      <guid>https://dev.to/gde/google-workspace-studio-tutorial-the-new-notify-by-email-action-2400</guid>
      <description>&lt;p&gt;If you run a product or manage technical operations, you likely have a Google Sheet somewhere that acts as a dumping ground for unstructured data. Whether it's customer feedback, bug reports, or feature requests, that spreadsheet grows every single day.&lt;/p&gt;

&lt;p&gt;Manually reading through hundreds of rows every Friday just to summarize the "vibe" and identify blockers for the executive team is tedious, repetitive work.&lt;/p&gt;

&lt;p&gt;In this tutorial, we are going to completely automate that process using Google Workspace Studio.&lt;/p&gt;

&lt;p&gt;We are going to build an event-driven pipeline that wakes up on a strict schedule, extracts the raw data from your Google Sheet, natively parses the tone and urgency, and uses Gemini to output a highly-structured executive summary directly into your inbox.&lt;/p&gt;

&lt;p&gt;Here is the exact step-by-step architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: The Scheduled Trigger
&lt;/h2&gt;

&lt;p&gt;Instead of relying on a manual event—like a form submission or a file upload—we want this pipeline to run autonomously. In &lt;strong&gt;Workspace Studio&lt;/strong&gt;, create a new flow and set the Starter to On a schedule. You can configure this to act exactly like a cron job.&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%2Fqd3hf1cwiyc0mcs112jz.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%2Fqd3hf1cwiyc0mcs112jz.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure the following fields:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start date and time:&lt;/strong&gt; Set this to your desired starting Friday at 4:00 PM (or 8:00 AM, depending on when you want the report).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat:&lt;/strong&gt; Select Weekly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ends:&lt;/strong&gt; Set to 1 year (or your preferred duration).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time zone:&lt;/strong&gt; Ensure this matches your local working hours (e.g., (GMT+05:30) India Time).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Data Extraction &amp;amp; Structuring
&lt;/h2&gt;

&lt;p&gt;Next, we need to pull the raw data into the pipeline runtime. Instead of just dumping a massive, unstructured spreadsheet directly into an LLM, we can use Workspace Studio's native Extract node to structure it first.&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%2F81tka0sp318u7nhrwloi.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%2F81tka0sp318u7nhrwloi.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add an &lt;strong&gt;Extract&lt;/strong&gt; node.&lt;/li&gt;
&lt;li&gt;In the "Content to analyze" field, paste the direct link to your target Google Sheet.&lt;/li&gt;
&lt;li&gt;Under "What to extract", select the predefined option: Sentiment: tone and urgency.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By doing this, Workspace Studio automatically parses the massive spreadsheet behind the scenes and generates two distinct, structured variables for our next step: &lt;code&gt;{{Tone}}&lt;/code&gt; and &lt;code&gt;{{Urgency}}&lt;/code&gt;. This significantly reduces AI hallucinations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Data Analysis (Ask Gemini)
&lt;/h2&gt;

&lt;p&gt;This is the core logic node where we take those extracted variables and format them into a readable report.&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%2Famg3oapx8qyguvawfa89.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%2Famg3oapx8qyguvawfa89.png" alt=" " width="799" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add an Ask Gemini node.&lt;/li&gt;
&lt;li&gt;Click the + Variables dropdown and insert the &lt;code&gt;{{Tone}}&lt;/code&gt; and &lt;code&gt;{{Urgency}}&lt;/code&gt; variables generated from Step 2.&lt;/li&gt;
&lt;li&gt;Append strict system instructions to force a structured output.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because the Extract node already did the heavy lifting of determining the sentiment, our runtime prompt can be incredibly simple and targeted:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are an Ops Manager. I have automatically extracted the overall tone and urgency from our weekly customer feedback spreadsheet. Tone: {{Tone}}. Urgency: {{Urgency}}. Based on these extracted variables, generate a professional Executive Summary. Highlight the overall sentiment and summarize the urgency of the technical blockers. Format as a clean report using bullet points.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 4: Generating the Report (Google Docs)
&lt;/h2&gt;

&lt;p&gt;Now we need to get the output out of the pipeline and into a readable 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%2Fjq3z3c4vmydy13s7ka7h.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%2Fjq3z3c4vmydy13s7ka7h.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a Create a doc node.&lt;/li&gt;
&lt;li&gt;Set the Title: Executive Summary: Feedback.&lt;/li&gt;
&lt;li&gt;Set the Body to the output variable from the Gemini node in Step3. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 5: Distribution (Gmail)
&lt;/h2&gt;

&lt;p&gt;Finally, we need to distribute the report so you don't have to go digging through your Drive to find it.&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%2Fjlfqwbbguejlwlvyqkxd.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%2Fjlfqwbbguejlwlvyqkxd.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a Notify me by email node.&lt;/li&gt;
&lt;li&gt;Set the Subject to: &lt;strong&gt;[Automated Report] Weekly Feedback Summary&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the Message field, copy and paste the following template. Use the + Variables dropdown to insert the dynamic variables where indicated:&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Here is your automated weekly feedback report.&lt;br&gt;
Overall Tone: {{Tone}} Urgency Level: {{Urgency}}&lt;br&gt;
You can review the full executive summary and the breakdown of technical blockers here: {{Document_Link}}&lt;br&gt;
(You can forward this document to the leadership team).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(Note: The 'Notify me by email' node automatically sends the email directly to the account running the workflow, making it perfect for a personal executive summary.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: The Test Run &amp;amp; Output
&lt;/h2&gt;

&lt;p&gt;Before blindly turning this on, you always want to run a test to ensure your variables are mapping correctly. Click the &lt;strong&gt;Test run&lt;/strong&gt; button at the bottom of the Workspace Studio editor.&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%2Fla0omjlre5wvdcwp99bs.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%2Fla0omjlre5wvdcwp99bs.png" alt=" " width="800" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is wired up correctly, you will see a beautiful wall of green checkmarks confirming that the pipeline successfully extracted the data, generated the document, and sent the email.&lt;/p&gt;

&lt;p&gt;Check your inbox. You should have an email waiting for you that looks like this:&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%2F1erhmznnlf6eqm8pfezz.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%2F1erhmznnlf6eqm8pfezz.png" alt=" " width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because we used the Extract node, the pipeline correctly identified the tone of our mock data as negative and the urgency as urgent.&lt;/p&gt;

&lt;p&gt;When you click the generated document link in the email, you'll see the real magic. Gemini successfully parsed the unstructured customer feedback, bypassed the generic complaints, and accurately identified the critical technical blockers (like the timeout errors and scheduled trigger failures).&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%2Fd0ciajbnmwpvm8nxwg4u.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%2Fd0ciajbnmwpvm8nxwg4u.png" alt=" " width="799" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Verdict: Moving from Manual to Event-Driven
&lt;/h2&gt;

&lt;p&gt;If you are still manually reading spreadsheets, parsing user feedback, and writing Friday summary emails from scratch, you are wasting valuable engineering and operational hours.&lt;/p&gt;

&lt;p&gt;By combining a Scheduled Trigger with the new Extract and Notify me by email nodes, we just built a highly-resilient, event-driven reporting pipeline in under 10 minutes.&lt;/p&gt;

&lt;p&gt;The beauty of this architecture is the clean separation of concerns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Google Sheets acts as your raw data lake.&lt;/li&gt;
&lt;li&gt;Workspace Studio's Extract Node acts as your data parser (which severely reduces LLM hallucination).&lt;/li&gt;
&lt;li&gt;Gemini acts as your dedicated logic and reasoning engine.&lt;/li&gt;
&lt;li&gt;Google Docs &amp;amp; Gmail act as your automated distribution layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You set it up once, and every single Friday at 4:00 PM, a perfectly formatted executive summary lands in your inbox. No manual prompting required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work With Me
&lt;/h2&gt;

&lt;p&gt;I run a specialized software consultancy focused on building custom tools, AI integrations, and automation pipelines that help engineering and ops teams move significantly faster.&lt;/p&gt;

&lt;p&gt;We just launched our brand new website, and we are currently taking on new clients. My core services include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI &amp;amp; Workspace Automation:&lt;/strong&gt; Building custom Gemini architectures (like the pipeline above) directly into your business infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Software Development:&lt;/strong&gt; Architecting scalable web applications and internal tools from the ground up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Architecture:&lt;/strong&gt; Secure GCP and Firebase infrastructure design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Relations &amp;amp; Content:&lt;/strong&gt; Partnering with tech brands to create high-quality developer tutorials and video series.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your team is dealing with manual bottlenecks, or if you need an expert to help architect a complex solution, check out my new site and let's get on a call.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://aryanirani123.com/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://www.linkedin.com/in/aryanirani123/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>googleworkspace</category>
      <category>workspacestudio</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Connecting GCP Budget Alerts to AppSheet: A Step-by-Step Guide</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Fri, 12 Jun 2026 13:57:22 +0000</pubDate>
      <link>https://dev.to/gde/connecting-gcp-budget-alerts-to-appsheet-a-step-by-step-guide-4pda</link>
      <guid>https://dev.to/gde/connecting-gcp-budget-alerts-to-appsheet-a-step-by-step-guide-4pda</guid>
      <description>&lt;p&gt;Have you ever woken up to a massive Google Cloud bill because a developer accidentally left a cluster running, or an API got stuck in an infinite loop?&lt;/p&gt;

&lt;p&gt;Cloud "bill shock" is a rite of passage for many builders, but it can be avoided to a large extent. While Google Cloud allows you to set budget alerts that send you an email when you cross a threshold, an email doesn't stop the bleeding. By the time you see the email, log into your laptop, authenticate, navigate the Google Cloud console, and find the offending resource, you could be out hundreds or thousands of dollars.&lt;/p&gt;

&lt;p&gt;What if, instead of an email, you got a push notification on your phone with a big red "Kill Resources" button?&lt;/p&gt;

&lt;p&gt;In this comprehensive tutorial, we are going to bridge the gap between enterprise Google Cloud infrastructure and Google Workspace. We will build a serverless architecture using &lt;strong&gt;Cloud Functions&lt;/strong&gt;, &lt;strong&gt;Pub/Sub&lt;/strong&gt;, &lt;strong&gt;Google Sheets&lt;/strong&gt;, and &lt;strong&gt;AppSheet&lt;/strong&gt; to create a custom mobile app that gives you absolute, instant control over your cloud spend.&lt;/p&gt;

&lt;p&gt;Whether you are a beginner looking to understand Event-Driven Architecture, or a seasoned architect looking for a rapid Low-Code internal tool, this guide will walk you through every single click and line of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture: How It All Connects
&lt;/h2&gt;

&lt;p&gt;Before we write code, let's understand the flow of data. Event-driven architecture means one system yells into the void, and another system is waiting to catch it.&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%2Fj1c4pd3q1aywjj1il0f1.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%2Fj1c4pd3q1aywjj1il0f1.png" alt=" " width="800" height="943"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Google Cloud Billing detects a budget anomaly and publishes a payload to a Pub/Sub topic. Think of Pub/Sub as a massive post office.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An Ingest Cloud Function (Python) is subscribed to that post office. It catches the payload, parses the metrics, and uses the Google Sheets API to write a row to a Google Sheet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AppSheet (a low-code platform) reads the sheet and instantly generates a mobile UI, sending a Push Notification to your phone.&lt;br&gt;
When you tap the "Kill Resources" button in AppSheet, an AppSheet Automation Bot fires a Webhook.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Remediation Cloud Function receives the webhook and executes a secure shutdown command against the target resource using the Google Compute API.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's build it step-by-step!&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Setting up the Database (Google Sheets)
&lt;/h3&gt;

&lt;p&gt;Why Google Sheets? Because for rapid prototyping and internal tools, a spreadsheet is the easiest database to visually debug.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open Google Sheets and create a new blank spreadsheet. Name it "Google Cloud Budget Alerts".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the first row, create the following headers exactly as written: &lt;code&gt;alert_id&lt;/code&gt;, &lt;code&gt;budget_name&lt;/code&gt;, &lt;code&gt;budget_amount&lt;/code&gt;, &lt;code&gt;current_spend&lt;/code&gt;, &lt;code&gt;threshold_percent&lt;/code&gt;, &lt;code&gt;timestamp&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;project_id&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep this tab open, we will need the Sheet ID from the URL later.&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%2F25x0ds7s5jupgjtznj9q.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%2F25x0ds7s5jupgjtznj9q.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: The Ingest Pipeline (Pub/Sub &amp;amp; Cloud Functions)
&lt;/h3&gt;

&lt;p&gt;Now we need Google Cloud to send data to our sheet whenever you spend too much money.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Create the Pub/Sub Topic
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Open the Google Cloud Console and search for Pub/Sub.&lt;/li&gt;
&lt;li&gt;Click Create Topic and name it budget-alerts.
Uncheck "Add a default subscription" (our Cloud Function will create one automatically).&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%2Fljcqpoixgm8d2sw5wlw6.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%2Fljcqpoixgm8d2sw5wlw6.png" alt=" " width="800" height="802"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Connect Google Cloud Billing to Pub/Sub
&lt;/h4&gt;

&lt;p&gt;This is the most critical link in the chain. We have to tell the Google Cloud Billing system to actually use the post office we just built.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the Google Cloud Console, navigate to &lt;strong&gt;Billing -&amp;gt; Budgets &amp;amp; alerts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create Budget&lt;/strong&gt;. Name it "development-budget".&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Amount&lt;/strong&gt;, set your target budget (e.g., $100).&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Actions&lt;/strong&gt; (this is the secret sauce), scroll down to the &lt;strong&gt;Manage notifications&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Check the box for "&lt;strong&gt;Connect a Pub/Sub topic to this budget&lt;/strong&gt;".&lt;/li&gt;
&lt;li&gt;Select your Google Cloud Project and choose the &lt;code&gt;budget-alerts&lt;/code&gt; topic we just created from the dropdown. Save the budget.&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%2F2e16y5df2n09bfttns7r.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%2F2e16y5df2n09bfttns7r.png" alt=" " width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Deploy the Ingest Cloud Function
&lt;/h4&gt;

&lt;p&gt;This Python script is the "glue" between the Google Cloud Billing alerts and Google Sheets.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search for Cloud Functions in the Google Cloud console and click Create Function.&lt;/li&gt;
&lt;li&gt;Select Gen 2. Name it &lt;code&gt;ingest-budget-alert&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In the Trigger section, select &lt;strong&gt;Cloud Pub/Sub&lt;/strong&gt; and choose your &lt;code&gt;budget-alerts&lt;/code&gt; topic.&lt;/li&gt;
&lt;li&gt;Expand the Runtime, build, connections and security settings, and add an Environment Variable named &lt;code&gt;SPREADSHEET_ID&lt;/code&gt;. Paste the ID found in your Google Sheet's URL.&lt;/li&gt;
&lt;li&gt;Click Next. Change the Runtime to Python 3.11.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In your &lt;code&gt;requirements.txt&lt;/code&gt;, add these libraries so GCP knows what packages to install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;functions-framework==3.*
google-api-python-client==2.*
google-auth==2.*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your main.py, paste this code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;functions_framework&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;googleapiclient.discovery&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.auth&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Initialize Google Sheets client securely
&lt;/span&gt;&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://www.googleapis.com/auth/spreadsheets&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;sheets_service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sheets&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v4&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@functions_framework.cloud_event&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ingest_budget_alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cloud_event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;SPREADSHEET_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SPREADSHEET_ID&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. Decode the incoming message from Pub/Sub
&lt;/span&gt;    &lt;span class="n"&gt;pubsub_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cloud_event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;alert_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pubsub_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. Extract the exact metrics we care about
&lt;/span&gt;    &lt;span class="n"&gt;cost_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alert_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;costAmount&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;budget_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alert_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;budgetAmount&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;budget_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;alert_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;budgetDisplayName&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Unknown Budget&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;threshold_percent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_amount&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;budget_amount&lt;/span&gt;
    &lt;span class="n"&gt;alert_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;())[:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;project_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GCP_PROJECT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;my-test-project&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 4. Format the row and push to Google Sheets
&lt;/span&gt;    &lt;span class="n"&gt;row_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;alert_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;budget_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cost_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cost_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;threshold_percent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PENDING&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project_id&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;values&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;row_data&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;

    &lt;span class="n"&gt;sheets_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spreadsheets&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;spreadsheetId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SPREADSHEET_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sheet1!A:H&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;valueInputOption&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USER_ENTERED&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Appended alert to Google Sheet.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Crucial Step:&lt;/strong&gt; When the function deploys, go to its "Details" page and find the &lt;strong&gt;Service Account&lt;/strong&gt; email it is using (usually looks like &lt;code&gt;123456789-compute@developer.gserviceaccount.com&lt;/code&gt;). You must go to your Google Sheet, click the "Share" button, and add this email as an Editor! Otherwise, the script will get a Permission Denied error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Building the Low-Code Mobile App
&lt;/h3&gt;

&lt;p&gt;We have data flowing into a spreadsheet. Now let's turn that spreadsheet into a mobile app in under 60 seconds without writing a single line of iOS or Android code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;AppSheet.com&lt;/strong&gt; and log in with your Google account.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create -&amp;gt; App -&amp;gt; Start with your own data&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the "Google Cloud Budget Alerts" Google Sheet.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AppSheet will analyze your columns and instantly generate a working mobile app on your screen!&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%2Fx8y8u2bt67tjwelp1nub.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%2Fx8y8u2bt67tjwelp1nub.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating the "Kill Switch" Action
&lt;/h3&gt;

&lt;p&gt;We need a giant red button to press when disaster strikes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the left-hand menu, click on the Actions icon (the lightning bolt).&lt;/li&gt;
&lt;li&gt;Click + New Action.&lt;/li&gt;
&lt;li&gt;Configure it exactly like this:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Action Name: Kill Resources&lt;/li&gt;
&lt;li&gt;For a record of this table: alerts&lt;/li&gt;
&lt;li&gt;Do this: Data: set the values of some columns in this row&lt;/li&gt;
&lt;li&gt;Set these columns: Choose status from the dropdown, and type "SHUTDOWN_REQUESTED" in the formula box.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4.Go to Appearance, choose a stop sign icon.&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%2Fo59us6cwsruk9xyexogf.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%2Fo59us6cwsruk9xyexogf.png" alt=" " width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: The Remediation Engine (The Webhook)
&lt;/h3&gt;

&lt;p&gt;Pressing a button in an app doesn't magically turn off a server on Google Cloud. We need Google Cloud to listen to AppSheet. We will deploy a second Cloud Function, this time with an &lt;strong&gt;HTTP Trigger&lt;/strong&gt;, that acts as our Remediation Engine.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go back to Cloud Functions and Create a new Function.&lt;/li&gt;
&lt;li&gt;Name it &lt;code&gt;remediate-budget-alert&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For the trigger, select &lt;strong&gt;HTTPS&lt;/strong&gt; and choose "Allow unauthenticated invocations" (for this tutorial).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the Trigger URL&lt;/strong&gt; shown on the screen! You will need this for AppSheet.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the Python code for &lt;code&gt;main.py&lt;/code&gt;. This script listens for the HTTP request, verifies you actually pressed the button, and uses the Compute API to forcefully stop a virtual machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;functions_framework&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;googleapiclient.discovery&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.auth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;

&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;compute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;compute&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@functions_framework.http&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remediate_resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 1. Parse the JSON sent by AppSheet
&lt;/span&gt;    &lt;span class="n"&gt;request_json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;silent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request_json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;project_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request_json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. Security Check: Ensure the button was actually pressed
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SHUTDOWN_REQUESTED&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Ignoring status&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🚨 SHUTDOWN AUTHORIZED. Commencing remediation...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. The Kill Command!
&lt;/span&gt;    &lt;span class="c1"&gt;# (Hardcoded for this tutorial, but can be dynamic based on the payload)
&lt;/span&gt;    &lt;span class="n"&gt;ZONE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;us-central1-a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;INSTANCE_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;demo-kill-switch-vm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

    &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;compute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;project_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ZONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;INSTANCE_NAME&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Shutdown successful&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Closing the Loop (The Automation Bot)
&lt;/h3&gt;

&lt;p&gt;Finally, we tell AppSheet to hit that HTTP URL whenever you press the red Kill Switch button.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In AppSheet, go to the Automation tab (the robot icon).&lt;/li&gt;
&lt;li&gt;Click Create my first Bot -&amp;gt; Create a new Bot. Name it "Trigger Kill Switch".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event&lt;/strong&gt;: Select Data Change -&amp;gt; Updates Only on the alerts table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condition&lt;/strong&gt;: Type exactly [status] = "SHUTDOWN_REQUESTED".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action Step&lt;/strong&gt;: Select Call a webhook.&lt;/li&gt;
&lt;li&gt;Paste your Cloud Function HTTP URL from Step 4. Set the HTTP Verb to POST.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the JSON Body, paste this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;&amp;lt;[status]&amp;gt;&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;&amp;lt;YOUR_PROJECT_ID&amp;gt;&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alert_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;&amp;lt;[alert_id]&amp;gt;&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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%2F32n887jqdm0ju2ui57pm.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%2F32n887jqdm0ju2ui57pm.png" alt=" " width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Testing the End-to-End System (The Demo)
&lt;/h3&gt;

&lt;p&gt;A tutorial isn't complete until we prove that it works! We don't want to actually wait for our cloud bill to skyrocket to test this, so we will simulate a mock billing alert.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Send a Mock Payload
&lt;/h4&gt;

&lt;p&gt;Open your terminal or Google Cloud Shell and create a script named &lt;code&gt;test_alert.sh&lt;/code&gt;. Paste the following code, replacing &lt;code&gt;YOUR_PROJECT_ID&lt;/code&gt; with your actual Project ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;PROJECT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_PROJECT_ID"&lt;/span&gt;
&lt;span class="nv"&gt;TOPIC_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"budget-alerts"&lt;/span&gt;

&lt;span class="nv"&gt;PAYLOAD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{
  "budgetDisplayName": "development-budget",
  "alertThresholdExceeded": 1.0,
  "costAmount": 150.00,
  "budgetAmount": 100.00
}'&lt;/span&gt;
&lt;span class="nv"&gt;ENCODED_PAYLOAD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PAYLOAD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

gcloud pubsub topics publish &lt;span class="nv"&gt;$TOPIC_NAME&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PROJECT_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ENCODED_PAYLOAD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the script. This instantly fires a "100% budget exceeded" alert into our architecture.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Watch the Data Flow
&lt;/h4&gt;

&lt;p&gt;Immediately check your Google Sheet. You will see a brand new row pop up instantly with the alert data and a status of &lt;code&gt;PENDING&lt;/code&gt;. Check your phone or browser where AppSheet is open. Within seconds, a Push Notification will arrive: "&lt;strong&gt;🚨 GCP Budget Alert!&lt;/strong&gt;".&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Hit the Kill Switch
&lt;/h4&gt;

&lt;p&gt;Open the AppSheet app. You will see the new &lt;code&gt;development-budget&lt;/code&gt; alert in the UI. Tap the alert, and smash that red Kill Resources button we built in Step 3.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Verify the Shutdown
&lt;/h4&gt;

&lt;p&gt;The moment you press that button, AppSheet fires the webhook to our Remediation Cloud Function. Navigate to &lt;strong&gt;Compute Engine -&amp;gt; VM Instances&lt;/strong&gt; in your Google Cloud Console. You will see your target test VM's status transition from &lt;code&gt;RUNNING&lt;/code&gt; to &lt;code&gt;TERMINATED&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;You have successfully built an event-driven, zero-latency cloud control system.&lt;/p&gt;

&lt;p&gt;By combining the robustness of Google Cloud Functions with the rapid UI generation of AppSheet and Google Sheets, you've created a powerful internal tool. This architecture is incredibly extensible: in the future, you could modify the Python code to dynamically revoke IAM permissions, disable billing accounts entirely, or integrate with Cloud Monitoring for sub-minute predictive alerting.&lt;/p&gt;

&lt;p&gt;The next time your cloud bill starts to spike, you won't need to scramble for your laptop. You just need to reach into your pocket.&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>appsheet</category>
      <category>finops</category>
      <category>cloudbilling</category>
    </item>
    <item>
      <title>Building a Content Pipeline: A Guide to the Workspace Studio + Gems Integration</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Wed, 10 Jun 2026 11:14:05 +0000</pubDate>
      <link>https://dev.to/gde/building-a-content-pipeline-a-guide-to-the-workspace-studio-gems-integration-e3n</link>
      <guid>https://dev.to/gde/building-a-content-pipeline-a-guide-to-the-workspace-studio-gems-integration-e3n</guid>
      <description>&lt;p&gt;Google just rolled out a major quality-of-life update for developers and ops teams: &lt;a href="https://workspaceupdates.googleblog.com/2026/04/use-your-gems-in-your-google-workspace-studio-flows.html" rel="noopener noreferrer"&gt;Custom Gems are now officially live inside Google Workspace Studio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If your day-to-day involves building automations or wiring up LLMs, you already know how tedious prompt wrangling can get. You spend half your time managing context windows and copying/pasting massive system prompts just to ensure the AI returns a consistent output. This integration essentially automates away that headache.&lt;/p&gt;

&lt;p&gt;In this tutorial, I'll break down exactly what Custom Gems are, why they matter for your workflow, and how we can use them to build a fully automated "Content Engine"—a system that intercepts rough text, extracts the raw data, and feeds it directly into a custom Ghostwriter Gem to generate perfectly formatted social media posts.&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/6F2Y3VMrhMc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Custom Gems?
&lt;/h2&gt;

&lt;p&gt;If you’ve used OpenAI’s Custom GPTs, you already understand the basic concept. A Custom Gem is a specialized, pre-configured version of Gemini. Instead of starting from a blank chat interface every time, you define the AI's behavior once and save it as a reusable expert.&lt;/p&gt;

&lt;p&gt;When building a Gem, you configure three main elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Persona &amp;amp; Instructions:&lt;/strong&gt; This is your foundational system prompt. You define exactly who the Gem is (e.g., "Technical SEO Copywriter" or "Senior Data Analyst"), the rules it must follow, and the strict structure of its output (like JSON, markdown tables, or specific code blocks).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Knowledge Grounding:&lt;/strong&gt; You can upload static files (PDFs, codebases, style guides) or link the Gem directly to live Google Drive documents. This gives the AI a dedicated context window based only on your company's actual data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Constraints:&lt;/strong&gt; Hard boundaries on what the AI should and shouldn't do, which is critical for keeping automated outputs predictable.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why this changes the automation stack
&lt;/h3&gt;

&lt;p&gt;Having a custom chatbot in your browser is helpful, but the real power unlocks when you bring Gems into &lt;strong&gt;Google Workspace Studio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of treating the Gem as a chatbot you have to manually converse with, Workspace Studio allows you to plug that custom Gem directly into automated, background workflows as an agent.&lt;/p&gt;

&lt;p&gt;Rather than manually pasting text into an AI window, you can now build event-driven architecture. For example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A new rough draft gets dropped into a specific Google Drive folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Workspace Studio triggers automatically, intercepting the file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The raw text is routed to your custom "Editor Gem."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Gem processes the text based on its pre-saved rules and knowledge base.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The polished output is automatically routed into a new Google Doc, a Slack channel, or a content scheduler.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You set up the prompt architecture once, and the AI runs in the background. No manual tweaking, no babysitting.&lt;/p&gt;

&lt;p&gt;Let's look at how to actually build this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Zero-Touch Content Engine
&lt;/h2&gt;

&lt;p&gt;To show you how this actually works in practice, I built an automated pipeline that takes my messy, unformatted brain-dumps and turns them into ready-to-publish social posts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Part 1: Creating and Configuring the Custom Gem
&lt;/h3&gt;

&lt;p&gt;Before building the automation pipeline, we need to configure the specialized "brain" that will handle our text transformation. A Custom Gem allows us to define strict boundaries, formatting rules, and system instructions once, making them reusable across any workflow.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Open the Gems Interface
&lt;/h4&gt;

&lt;p&gt;Navigate to your &lt;a href="https://gemini.google.com/" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt; interface and locate the Gems Manager panel. Click on New Gem to initialize a blank workspace.&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%2Feir5rmbqlrw2q69g1lwb.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%2Feir5rmbqlrw2q69g1lwb.png" alt=" " width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Name and Describe Your Gem
&lt;/h4&gt;

&lt;p&gt;Once you reached the Gems dashboard, go ahead and click on New Gem.&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%2Fg37bztva6pwixkapy87z.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%2Fg37bztva6pwixkapy87z.png" alt=" " width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the configuration panel, give your Gem a clear name and a concise description. This helps identify the correct node later inside Workspace Studio.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; My Technical Ghostwriter&lt;br&gt;
&lt;strong&gt;Description:&lt;/strong&gt; Transforms raw transcripts and markdown brain-dumps into structured LinkedIn and Twitter posts.&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%2F0qnbzb115l7tf1wolj55.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%2F0qnbzb115l7tf1wolj55.png" alt=" " width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3: Insert the Technical System Instructions
&lt;/h4&gt;

&lt;p&gt;In the &lt;strong&gt;Instructions box&lt;/strong&gt;, paste the exact rules governance for your AI. To ensure the output remains highly professional, engineering-focused, and free of typical marketing clichés, use the following structured prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are an expert technical ghostwriter for a Google Developer Expert (GDE) who focuses on automation, cloud infrastructure, and AI engineering. &lt;br&gt;
Your job is to take raw brain-dumps or video transcripts and turn them into highly engaging social media posts (LinkedIn and Twitter).&lt;br&gt;
CRITICAL RULES FOR YOUR TONE:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Never use AI fluff: Do not use words like "delve", "tapestry", "unlocking potential", "supercharge", or "game-changer."&lt;/li&gt;
&lt;li&gt;Keep it punchy: Use short, direct sentences. Write like an engineer explaining something cool to another engineer over coffee.&lt;/li&gt;
&lt;li&gt;Focus on the "How" and "Why": Always highlight the exact technical architecture or the exact problem being solved.&lt;/li&gt;
&lt;li&gt;No heavy emojis: Use a maximum of 1 or 2 emojis per post. Never use rocket ships or fire emojis. Use simple structural emojis like 1️⃣ or 💬 if explaining a pipeline.&lt;/li&gt;
&lt;li&gt;Formatting: Always include a clear hook (the problem), the architecture (the solution), and a call to action at the bottom.
When provided with a raw transcript, generate exactly ONE LinkedIn post and ONE Twitter thread based on the content.&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%2Fsmw6vgpmuet0ifkv67pl.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%2Fsmw6vgpmuet0ifkv67pl.png" alt=" " width="799" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4: Save and Test the Gem
&lt;/h4&gt;

&lt;p&gt;Click Save in the top right corner. Run a quick manual test by dropping a messy paragraph into the chat window to ensure it strictly follows the formatting constraints and outputs exactly one LinkedIn post and one Twitter thread.&lt;/p&gt;

&lt;h3&gt;
  
  
  Part 2: Building the Workspace Studio Automation Pipeline
&lt;/h3&gt;

&lt;p&gt;With the Gem ready, open &lt;strong&gt;Google Workspace Studio&lt;/strong&gt; to build the event-driven architecture. The pipeline will contain 5 distinct blocks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Drive Trigger] ➔ [Extract Text] ➔ [Ask a Gem] ➔ [Create Doc] ➔ [Google Chat Notification]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Step 1: Set Up the Google Drive Trigger
&lt;/h4&gt;

&lt;p&gt;We want the automation to watch a specific folder for incoming raw materials.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Add a new Trigger node to the canvas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Google Drive as the app and choose When an item is added to a folder as the event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select or create a folder in your Drive named Raw Transcripts.&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%2Fcum9t21bdkd42qxsfg1l.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%2Fcum9t21bdkd42qxsfg1l.png" alt=" " width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Add the File Extraction Block
&lt;/h4&gt;

&lt;p&gt;Workspace Studio needs to read the contents of the uploaded file rather than just passing the file object itself.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go ahead and click on &lt;strong&gt;Choose a step&lt;/strong&gt;, and select &lt;strong&gt;Extract under AI Actions&lt;/strong&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%2Fpnhfu72oo83a3gyptwli.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%2Fpnhfu72oo83a3gyptwli.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Map the file ID from Step 1 into this block and define the output variable name as &lt;code&gt;Raw Text&lt;/code&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%2F5l09qsk17enzgdcpzr85.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%2F5l09qsk17enzgdcpzr85.png" alt=" " width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3: Integrate the Custom Gem Node
&lt;/h4&gt;

&lt;p&gt;This is where we call our pre-configured expert.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a new action block and select Ask a Gem.&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%2Fm6v38issb5sn82hrrvyn.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%2Fm6v38issb5sn82hrrvyn.png" alt=" " width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.In the configuration settings, locate the Gem dropdown menu and select My Technical Ghostwriter.&lt;/p&gt;

&lt;p&gt;3.In the Prompt field, map the dynamic text variable from your extraction block. Use a clean, direct instruction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please process the following transcript and generate the social media posts exactly as instructed in your system prompt. Here is the raw transcript text: {{Step 2: Raw Text}}&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%2F312uu0vuawhsszqa8p75.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%2F312uu0vuawhsszqa8p75.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4: Generate the Finalized Google Document
&lt;/h4&gt;

&lt;p&gt;Instead of leaving the output in a log, we route it directly into a clean document for review.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go ahead and click on Add step, followed by adding the &lt;strong&gt;Create a Doc&lt;/strong&gt; action block to the workflow.&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%2Fuh9fyncr5e8flfbr1tyd.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%2Fuh9fyncr5e8flfbr1tyd.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Set the Document Title to Social Draft - {{Step1: Name of item}}.&lt;/p&gt;

&lt;p&gt;3.Map the body/content text field to the output generated by the Ask a Gem block in Step 3.&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%2F5j31fxzt0j5glsq96qk2.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%2F5j31fxzt0j5glsq96qk2.png" alt=" " width="799" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 5: Configure the Google Chat Notification
&lt;/h4&gt;

&lt;p&gt;To eliminate the need to check Google Drive constantly, the final step pings your workspace chat when the task is complete.&lt;/p&gt;

&lt;p&gt;1.Add a Google Chat action block. Select Notify me in Chat.&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%2F7zphd0s0z52hewmj9lkr.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%2F7zphd0s0z52hewmj9lkr.png" alt=" " width="799" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Construct a clean notification payload that passes the direct URL of the freshly created document:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💬 Content Engine update: A new social media draft is ready for review.&lt;br&gt;
🔗 Edit Document: {{Step 4: Link to doc}}&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%2Fmbqfri2usg7epjx6bv1y.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%2Fmbqfri2usg7epjx6bv1y.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Part 3: The Test Run
&lt;/h3&gt;

&lt;p&gt;Before pushing this live, Workspace Studio has a built-in &lt;strong&gt;Test run&lt;/strong&gt; feature.&lt;/p&gt;

&lt;p&gt;When you click "Test run", it lets you select an existing file that is currently sitting in your target Google Drive folder. It will execute the entire pipeline against that specific file—extracting the text, prompting the Gem, and generating the Doc—without actually enabling the background listener.&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%2Foq6azuw6esr5darp4fqh.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%2Foq6azuw6esr5darp4fqh.png" alt=" " width="799" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you verify the output formatting is exactly how you want it, you just click "Turn on" to set the automation 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%2F1c4thsskxekvzedl4v3n.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%2F1c4thsskxekvzedl4v3n.png" alt=" " width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the workflow finishes executing, open the newly created document inside Google Drive or click the link delivered to your Google Chat workspace.&lt;/p&gt;

&lt;p&gt;The output is split exactly into the two requested formats—one comprehensive LinkedIn post and one structured Twitter thread—while strictly respecting our anti-fluff boundaries:&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%2Fy8kizmuc6lucfwaphsdw.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%2Fy8kizmuc6lucfwaphsdw.png" alt=" " width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Why This Test Success Matters
&lt;/h4&gt;

&lt;p&gt;Looking closely at the output, the Custom Gem followed every single negative constraint and structural guardrail perfectly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Zero Marketing Fluff: There are no instances of generic buzzwords like "delve," "tapestry," or "game-changer."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engineering Tone: The language is conversational but technically grounded, describing the setup as a "3-step architecture" and an "event-driven flow."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Emoji Discipline: The post uses exactly two structural numbering emojis (1️⃣, 2️⃣) instead of being cluttered with unnecessary fire or rocket graphics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Perfect Formatting: Both formats lead with a distinct problem-focused hook, detail the underlying pipeline mechanics, and close with a clear call to action.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;By moving away from manual chat interfaces and embedding Custom Gems directly into Google Workspace Studio, you transform an LLM from a passive assistant into an active, automated node in your development stack.&lt;/p&gt;

&lt;p&gt;You write the architecture rules once, and the engine runs seamlessly in the background whenever new data enters your pipeline.&lt;/p&gt;

</description>
      <category>workspacestudio</category>
      <category>googleworkspace</category>
      <category>automation</category>
      <category>geminigems</category>
    </item>
    <item>
      <title>Building an AI Sales RFP Assistant with Google Workspace Studio &amp; NotebookLM</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Mon, 08 Jun 2026 08:08:51 +0000</pubDate>
      <link>https://dev.to/gde/building-an-ai-sales-rfp-assistant-with-google-workspace-studio-notebooklm-3cl</link>
      <guid>https://dev.to/gde/building-an-ai-sales-rfp-assistant-with-google-workspace-studio-notebooklm-3cl</guid>
      <description>&lt;p&gt;If you are a Sales Engineer or Account Executive, you know that responding to a Request for Proposal (RFP) is a massive time sink. When a potential client asks, "Can you prove you've done this before?", you have to dig through Google Drive, read half a dozen old case studies, and manually copy-paste metrics to draft a response.&lt;/p&gt;

&lt;p&gt;In this tutorial, we are going to automate the hardest part of RFP writing: the research.&lt;/p&gt;

&lt;p&gt;Using &lt;strong&gt;Google Workspace Studio&lt;/strong&gt; and &lt;strong&gt;NotebookLM&lt;/strong&gt;, we are going to build an AI Research Assistant. When a salesperson drops an RFP into a Google Form, the workflow will instantly search your company's past case studies, map the client's requirements to your proven metrics, and generate a customized Google Doc draft for the sales team to review.&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/0fA2OgAXLlQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  The Traditional Workflow:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Receive an RFP.&lt;/li&gt;
&lt;li&gt;Search Google Drive for "Cloud Migration Case Study".&lt;/li&gt;
&lt;li&gt;Read through three old PDFs to find the one that mentions "cost savings."&lt;/li&gt;
&lt;li&gt;Copy the metrics into a new Google Doc.&lt;/li&gt;
&lt;li&gt;Spend an hour drafting the executive summary.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The New AI Workflow:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Submit the RFP requirements via a Google Form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workspace Studio&lt;/strong&gt; asks &lt;strong&gt;NotebookLM&lt;/strong&gt; to cross-reference the client's needs against your uploaded case studies.&lt;/li&gt;
&lt;li&gt;Workspace Studio instantly creates a new Google Doc with a customized, metric-driven draft and pings the sales team in Google Chat.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Step-by-Step Build Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites: Setting up NotebookLM
&lt;/h3&gt;

&lt;p&gt;Before building the automation, we need to build the brain.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;NotebookLM&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Create a new Notebook named "Past Proposals &amp;amp; Case Studies".&lt;/li&gt;
&lt;li&gt;Upload your company's best marketing materials, case studies, and winning RFPs. &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 1: Configure the Starter (Google Forms)
&lt;/h3&gt;

&lt;p&gt;Open Google Workspace Studio. We want to trigger this flow whenever the sales team has a new lead.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose a starter.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;When a form response comes in&lt;/strong&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%2Fyy77opsj1ejhdmsvj9md.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%2Fyy77opsj1ejhdmsvj9md.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Select the specific Google Form your team uses for RFP Intake. (Your form should ask for things like Client Name, Industry, and Core Requirements).&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%2Fxsap5op3o4pzkexst03z.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%2Fxsap5op3o4pzkexst03z.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: The Reasoning Engine (NotebookLM)
&lt;/h3&gt;

&lt;p&gt;This is where we map the incoming form data to our internal docs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on Choose a step: NotebookLM -&amp;gt; Ask NotebookLM.&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%2Fbuy0tfhtylpxa3th6q2t.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%2Fbuy0tfhtylpxa3th6q2t.png" alt=" " width="799" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Point it to the notebook you created in Step 0.&lt;br&gt;
3.Click the + Variables button to inject the form responses into your prompt.&lt;/p&gt;

&lt;p&gt;Here is the exact prompt I used:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are an RFP drafter. Review the client requirements below. &lt;br&gt;
Search our past case studies and map our existing capabilities to these requirements. Pull the exact ROI metrics from our past work. Draft a 3-paragraph executive summary addressing their specific needs.&lt;br&gt;
Client Name: {{Step1: Client Name}}&lt;br&gt;
Client Industry: {{Step1: Client Industry}}&lt;br&gt;
Core Requirements: {{Step1: Core RFP Requirements}}&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%2Flq3ucbkefndlqgm7w291.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%2Flq3ucbkefndlqgm7w291.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Generating the Output (Google Docs)
&lt;/h3&gt;

&lt;p&gt;We want a collaborative document, not just a block of text in an email.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on Add a step: Google Docs -&amp;gt; Create Document.&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%2Fkwia3plawr6se0ctqks0.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%2Fkwia3plawr6se0ctqks0.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.&lt;strong&gt;New doc name:&lt;/strong&gt; RFP Draft - {{Step1: Client Name}}&lt;br&gt;
3.&lt;strong&gt;Content to add:&lt;/strong&gt; Map the {{NotebookLM Output}} variable here.&lt;br&gt;
4.&lt;strong&gt;Location for new doc:&lt;/strong&gt; Select a specific Drive folder.&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%2Ftwr77uqno3hzp6t5vmvo.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%2Ftwr77uqno3hzp6t5vmvo.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: The Alert (Google Chat)
&lt;/h3&gt;

&lt;p&gt;Finally, let’s send a chat message when the draft is ready.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on Add step: Google Chat -&amp;gt; Notify me in Chat.&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%2Fl9sd2qyk74dm3ubv9hrp.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%2Fl9sd2qyk74dm3ubv9hrp.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Map it to your channel and use this payload:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🎉 New RFP Draft Generated! &lt;br&gt;
The initial research for {{Step1: Client Name}} is done. &lt;br&gt;
Review and edit the draft here: {{Step3: Link to doc}}&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%2Fr8d140fsxbf738hu7mwu.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%2Fr8d140fsxbf738hu7mwu.png" alt=" " width="799" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Test Run
&lt;/h2&gt;

&lt;p&gt;Workspace Studio has a built-in test runner at the bottom of the canvas. To test it, I submitted a mock RFP for a fictional bank asking for a cloud migration with a strict 99.99% SLA and a 25% cost reduction.&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%2Fbuav3580stgkobadxgs0.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%2Fbuav3580stgkobadxgs0.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hit Test run. 15 seconds later, my Google Chat pinged with a link to a newly generated Google Doc.&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%2F7px2xonmvd5ur8rc4woc.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%2F7px2xonmvd5ur8rc4woc.png" alt=" " width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the exact output NotebookLM generated and dumped into the Doc:&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%2Fc91a0ky0sf7ccjlx1l7f.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%2Fc91a0ky0sf7ccjlx1l7f.png" alt=" " width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Look closely at how NotebookLM structured that response. It didn't just summarize a document; it actively reasoned against the prompt. The mock RFP asked for a 25% cost reduction and a 99.99% SLA. NotebookLM searched the knowledge base, ignored the irrelevant cybersecurity and data analytics case studies, and extracted the exact metrics from our cloud migration case study.&lt;/p&gt;

&lt;p&gt;It confidently stated: "we stabilized the client's environment to a guaranteed 99.999% SLA" and "yielded a verified 42.4% reduction in TCO." It even included citation markers (e.g., [1], [3]) so you can trace exactly which source document it pulled the data from.&lt;/p&gt;

&lt;p&gt;By using Workspace Studio as the orchestration layer and NotebookLM as the grounded reasoning engine, we bypassed the biggest issue with LLMs in enterprise environments: hallucination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond RFPs: Scaling This Pattern
&lt;/h2&gt;

&lt;p&gt;The architecture we just built is essentially a "Form-Triggered Research Agent," and you can apply this exact same template to dozens of other use cases across your organization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HR Onboarding:&lt;/strong&gt; Trigger a flow when a new hire submits their role and department via a form. NotebookLM reads your massive employee handbook and auto-generates a customized 30-day onboarding checklist in a Google Doc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customer Support:&lt;/strong&gt; When a complex technical ticket is logged, Workspace Studio asks NotebookLM to search your internal troubleshooting wikis and drafts a technical response directly in Chat for the support engineer to review.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Legal Contract Drafting:&lt;/strong&gt; Intake a vendor's basic details via a form, and have NotebookLM query your standard legal templates to generate an initial MSA draft.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The days of writing boilerplate Python scripts to string together basic RAG (Retrieval-Augmented Generation) pipelines are fading. With native integration inside Workspace Studio, you can build, test, and deploy grounded enterprise workflows in minutes.&lt;/p&gt;

&lt;p&gt;(Standard disclaimer: As impressive as this is, NotebookLM explicitly warns in the UI that it can be inaccurate. Always have a human review the metrics before sending a proposal to a client!)&lt;/p&gt;

</description>
      <category>workspacestudio</category>
      <category>googleworkspace</category>
      <category>automation</category>
      <category>notebooklm</category>
    </item>
    <item>
      <title>Automating Document Review with Google Workspace Studio and NotebookLM</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Thu, 04 Jun 2026 08:53:08 +0000</pubDate>
      <link>https://dev.to/gde/automating-document-review-with-google-workspace-studio-and-notebooklm-4p6e</link>
      <guid>https://dev.to/gde/automating-document-review-with-google-workspace-studio-and-notebooklm-4p6e</guid>
      <description>&lt;p&gt;If you work in IT, Legal, or Procurement, you know the pain of the Vendor Security Review. A vendor emails you a 50-page PDF outlining their privacy terms, and you have to manually cross-reference their document against your company’s internal Standard Operating Procedures (SOPs).&lt;/p&gt;

&lt;p&gt;It is tedious, time-consuming, and highly prone to human error. What if they sneaked in a clause about 72-hour breach notifications when your policy strictly mandates 24 hours?&lt;/p&gt;

&lt;p&gt;In this tutorial, we are going to fix that. We will build a fully automated workflow using &lt;strong&gt;Google Workspace Studio&lt;/strong&gt; and &lt;strong&gt;NotebookLM&lt;/strong&gt; that intercepts these documents, reads them, reasons against your internal rules, and instantly alerts you of any violations in Google Chat.&lt;/p&gt;

&lt;p&gt;Check out the official update around the &lt;a href="https://workspaceupdates.googleblog.com/2026/05/notebooklm-in-workspace-studio.html" rel="noopener noreferrer"&gt;NotebookLM and Google Workspace Studio Integration&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Traditional Workflow:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Receive an email with a vendor PDF.&lt;/li&gt;
&lt;li&gt;Download the PDF.&lt;/li&gt;
&lt;li&gt;Open your 30-page internal compliance rulebook.&lt;/li&gt;
&lt;li&gt;Spend 45 minutes using Ctrl+F and reading legalese to find discrepancies.&lt;/li&gt;
&lt;li&gt;Write up a summary email of the risks and send it to the team.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The New AI Workflow:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Receive an email with a vendor PDF.&lt;/li&gt;
&lt;li&gt;Workspace Studio automatically saves the file, extracts the text, and asks NotebookLM to grade the vendor against your rulebook.&lt;/li&gt;
&lt;li&gt;10 seconds later, you receive a bulleted risk summary in Google Chat.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why Workspace Studio &amp;amp; NotebookLM?
&lt;/h2&gt;

&lt;p&gt;This architecture is incredibly powerful because it separates the automation from the reasoning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Workspace Studio&lt;/strong&gt; acts as the connective tissue (the hands). It handles the Gmail triggers, Drive storage, text extraction, and Chat messaging.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NotebookLM&lt;/strong&gt; acts as the grounded reasoning engine (the brain). By uploading your company SOPs directly into a Notebook, you ensure the AI's analysis is strictly grounded in your unique corporate rules, eliminating hallucinations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Beyond Vendor Compliance: Make it Your Own!
&lt;/h2&gt;

&lt;p&gt;While we are building a &lt;strong&gt;Vendor Compliance checker&lt;/strong&gt; today, you can tweak this exact architecture to automate dozens of other workflows simply by changing the source document in NotebookLM and adjusting the prompt:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HR / Recruiting:&lt;/strong&gt; Upload your ideal Job Description to NotebookLM. Have Studio intercept emails with resumes, and output a candidate grading summary to Chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Legal / Contract Review:&lt;/strong&gt; Upload your standard Master Services Agreement (MSA). Have Studio intercept third-party redlines and flag unapproved changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sales / RFP Responses:&lt;/strong&gt; Upload your product documentation. Have Studio intercept incoming RFPs and draft the initial technical responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Step-by-Step Build Guide
&lt;/h2&gt;

&lt;p&gt;Let's build the workflow!&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites: Setting up NotebookLM
&lt;/h3&gt;

&lt;p&gt;Before building the automation, we need to create the "brain."&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Head over to NotebookLM.&lt;/li&gt;
&lt;li&gt;Create a new Notebook and name it "Compliance &amp;amp; SOPs".&lt;/li&gt;
&lt;li&gt;Upload your company's baseline rulebooks (e.g., your Data Privacy Standards, ISO 27001 requirements, etc.).&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Pro Tip: You can manage up to 300 sources per notebook, with each source containing up to 500,000 words. You can dump all your governance documents here!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 1: Configure the Starter (Gmail)
&lt;/h3&gt;

&lt;p&gt;Open Google Workspace Studio and create a new flow. We need to trigger this automation whenever a new document arrives.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click Choose a starter.&lt;/li&gt;
&lt;li&gt;Select Gmail -&amp;gt; New Email.&lt;/li&gt;
&lt;li&gt;Configure the trigger conditions to catch vendor emails:

&lt;ul&gt;
&lt;li&gt;Subject includes: "Vendor Assessment"&lt;/li&gt;
&lt;li&gt;Has Attachment: Yes&lt;/li&gt;
&lt;/ul&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%2F5nomg4z4ysjunr54p22i.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%2F5nomg4z4ysjunr54p22i.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Save to Drive
&lt;/h3&gt;

&lt;p&gt;We need a place to securely store the raw PDF for record-keeping.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click + Choose a step.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Google Drive&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Save Attachment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destination Folder:&lt;/strong&gt; Select a specific, private folder in your Drive.&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%2F0vjx8bb1p2sbhvadvxpe.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%2F0vjx8bb1p2sbhvadvxpe.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Important Security Note: Ensure the destination folder is restricted to your team. Currently, this Studio step cannot save attachments directly to Shared Drives.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 3: Extract Text (Gemini)
&lt;/h3&gt;

&lt;p&gt;NotebookLM operates in a secure sandbox and cannot click external Drive links passed to it. We need to extract the raw text from the file first. Studio makes this easy with Gemini.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;+ Add step&lt;/strong&gt; and choose the &lt;strong&gt;Extract&lt;/strong&gt; action (powered by Gemini).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Content to analyze: Click "Variables" and map the {{Saved File URL}} (from the Google Drive step). The Extract step natively supports reading URLs!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What to extract: Scroll down to the &lt;strong&gt;Custom content name&lt;/strong&gt; section.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom content name:&lt;/strong&gt; Document Text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description for Gemini:&lt;/strong&gt; Extract the entire text content of this document exactly as it is.&lt;/li&gt;
&lt;/ul&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%2Frqqedf7q61pkkbfudb98.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%2Frqqedf7q61pkkbfudb98.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Ask NotebookLM
&lt;/h3&gt;

&lt;p&gt;This is where the magic happens. We pass the extracted text to NotebookLM and ask it to find discrepancies against our SOP.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click + Add step and choose &lt;strong&gt;NotebookLM&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Ask NotebookLM&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select a notebook:&lt;/strong&gt; Choose the Notebook you created earlier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enter a prompt:&lt;/strong&gt; Construct your prompt like this:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;You are an expert IT Compliance Auditor. Analyze the vendor terms provided below against our company compliance guidelines (your source document). &lt;br&gt;
Identify any missing clauses or violations regarding data privacy, security certifications, breach notifications, and data residency. &lt;br&gt;
Do not include conversational filler. Output ONLY a Markdown formatted list. For each violation, use a 🔴 emoji, state the vendor's policy, and state what our SOP requires instead.&lt;br&gt;
Vendor Terms Context: {{Step3: Document Text}}&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%2Fscuyzn6bwsrifcyyk8yj.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%2Fscuyzn6bwsrifcyyk8yj.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Send to Google Chat
&lt;/h3&gt;

&lt;p&gt;Finally, we deliver this risk assessment directly to the team so they can review it without leaving their chat window.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click + Add step and choose &lt;strong&gt;Notify me in Chat&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Message Payload: Format it nicely using markdown and variables:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;🚨 &lt;em&gt;New Vendor Compliance Assessment&lt;/em&gt; 🚨&lt;br&gt;
&lt;em&gt;Received From:&lt;/em&gt; {{Step1: Sender email address}}&lt;br&gt;
&lt;em&gt;Document Reviewed:&lt;/em&gt; {{Step1: Full list-Email Attachments file name}}&lt;br&gt;
&lt;em&gt;NotebookLM Risk Summary:&lt;/em&gt;&lt;br&gt;
{{Step4: Content created by NotebookLM}}&lt;br&gt;
&lt;em&gt;Review the raw document here:&lt;/em&gt; &lt;br&gt;
{{Step2: Links to the files}}&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%2F66x3tn9togqqubuweoru.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%2F66x3tn9togqqubuweoru.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Running a Test (The Moment of Truth)
&lt;/h3&gt;

&lt;p&gt;Before you fully turn the workflow on for your entire organization, Google Workspace Studio gives you a powerful way to test it using real data.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Send a Test Email: First, send yourself an email with a sample vendor PDF attached. Use the subject line we defined earlier (e.g., "New Vendor Assessment: CloudService Inc").&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the Test Panel: At the bottom of your Studio canvas, click the Test run button.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Your Email: A side panel will appear. Studio will automatically scan your Gmail inbox and let you select the test email you just sent from a dropdown.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hit Start: Click the blue Start button. Note: A test run takes real actions! It will actually save the file to Drive and post the message in Chat.&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%2Fcx5eruhspvqz3ysbk4ho.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%2Fcx5eruhspvqz3ysbk4ho.png" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;Within seconds, my Google Chat space lit up. Instead of having to read a 50-page vendor PDF manually, NotebookLM instantly output this incredibly detailed risk assessment:&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%2Fpl7o1kug0py7ueq9fkot.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%2Fpl7o1kug0py7ueq9fkot.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;And just like that, we’ve bridged the gap between basic "if-this-then-that" automation and actual cognitive reasoning.&lt;/p&gt;

&lt;p&gt;By combining the automation engine of &lt;strong&gt;Google Workspace Studio&lt;/strong&gt; with the grounded, hallucination-free reasoning of &lt;strong&gt;NotebookLM&lt;/strong&gt;, we didn't just automate a task—we automated a decision-making process. This architecture is highly scalable and can fundamentally change how enterprise teams handle documents, contracts, resumes, and RFPs.&lt;/p&gt;

&lt;p&gt;What will you build? Once you have the foundation set up, the possibilities are endless. If you end up tweaking this workflow for your own HR, Legal, or Sales team, let me know in the comments below!&lt;/p&gt;

</description>
      <category>workspacestudio</category>
      <category>googleworkspace</category>
      <category>notebooklm</category>
      <category>automation</category>
    </item>
    <item>
      <title>I Built an Autonomous AI Agent with Google ADK + Gemini That Spots Trends and Drafts Dev.to Articles for Me</title>
      <dc:creator>Aryan Irani</dc:creator>
      <pubDate>Tue, 02 Jun 2026 09:43:33 +0000</pubDate>
      <link>https://dev.to/gde/i-built-an-autonomous-ai-agent-with-google-adk-gemini-20-flash-that-spots-trends-and-drafts-60</link>
      <guid>https://dev.to/gde/i-built-an-autonomous-ai-agent-with-google-adk-gemini-20-flash-that-spots-trends-and-drafts-60</guid>
      <description>&lt;p&gt;Keeping up with trending technical topics and new tools on developer forums can be time-consuming. To save time, I wanted to automate the process of finding popular articles, reading the comments to understand community sentiment, and drafting a summary.&lt;/p&gt;

&lt;p&gt;While I could write a standard Python script to scrape the dev.to API, simple scripts tend to be brittle. If an article doesn't have comments yet, a basic script will likely crash unless you write extensive error-handling logic.&lt;/p&gt;

&lt;p&gt;Instead of a rigid script, I built an &lt;strong&gt;Agent&lt;/strong&gt;—a program that can dynamically reason about errors and adjust its approach. If one task fails, it can figure out the next best step.&lt;/p&gt;

&lt;p&gt;In this tutorial, I'll show you how to build a Trend-Spotting Agent using Python, the &lt;strong&gt;Google Agent Development Kit (ADK)&lt;/strong&gt;, and Gemini 2.5 Flash.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;We are going to write a Python application that acts as an autonomous agent. We'll give it three abilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search the dev.to API for rising technical articles based on specific tags.&lt;/li&gt;
&lt;li&gt;Dynamically fetch the top comments of those articles to read real community sentiment.&lt;/li&gt;
&lt;li&gt;Automatically draft a newsletter-style article on your DEV.to account summarizing its findings.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.9+&lt;/strong&gt; installed on your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google ADK&lt;/strong&gt;. (Check out the &lt;a href="https://google.github.io/adk-docs/" rel="noopener noreferrer"&gt;Google ADK Docs&lt;/a&gt; if you need help installing).&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;DEV API Key&lt;/strong&gt;. Grab this from your DEV.to account settings under "Extensions" and throw it in a &lt;code&gt;.env&lt;/code&gt; file.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Giving the Agent its "Hands" (API Tools)
&lt;/h2&gt;

&lt;p&gt;Large Language Models (LLMs) are incredibly smart, but out of the box, they can't actually &lt;em&gt;do&lt;/em&gt; anything on your computer. &lt;/p&gt;

&lt;p&gt;The coolest part about Google ADK is that we can write standard Python functions, hand them to the LLM as "tools", and let the AI decide how and when to use them.&lt;/p&gt;

&lt;p&gt;Let's write our API functions. &lt;/p&gt;

&lt;h3&gt;
  
  
  Tool 1: Finding Rising Articles
&lt;/h3&gt;

&lt;p&gt;Here is our function to fetch rising articles. Pay close attention to the docstring (&lt;code&gt;"""Fetches the top..."""&lt;/code&gt;). We aren't writing this for other developers; the ADK actually passes this docstring directly to the LLM so it understands exactly what the tool does.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;DEV_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEV_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_rising_articles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Fetches the top rising articles for a specific tag on DEV.to.
    Returns a formatted string of the articles with their ID, title, and URL.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/api/articles?tag=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;state=rising&amp;amp;per_page=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Top &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; rising articles for &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error fetching articles: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tool 2: Fetching Community Comments
&lt;/h3&gt;

&lt;p&gt;We don't just want our agent to read article titles; we want it to know what the community thinks. This function fetches the comments for a given article.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_comments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;article_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Fetches the top comments for a specific DEV.to article by ID to gauge community sentiment.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/api/comments?a_id=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;article_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No comments found on this article.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;summary_blocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="c1"&gt;# Grab up to the top 5 comments
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Anonymous&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body_html&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;summary_blocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Comment &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; by &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Top Comments:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary_blocks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tool 3: The Ghostwriter
&lt;/h3&gt;

&lt;p&gt;Finally, we need a way for the agent to report back. This function takes the agent's research and POSTs it directly to your Dev.to dashboard as an unpublished draft.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_article_draft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;str, body_markdown: str, tags: list[str]) -&amp;gt; str:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Creates a new, unpublished article Draft on the user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s DEV.to account.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/api/articles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DEV_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;article&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;published&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Keeps it as a safe draft!
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body_markdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;body_markdown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Successfully created draft! URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to create draft.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Wiring up the Agent
&lt;/h2&gt;

&lt;p&gt;With our tools ready, we just need to initialize the Google ADK Agent. We give it a persona, drop in our functions, and let it go to work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.genai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;

&lt;span class="n"&gt;agent_instruction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a Trend-Spotting Research Agent.
Every morning, or when requested, you monitor specific tags on DEV (Forem) to find the most interesting emerging technologies or topics.

Your workflow:
1. Use the &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;get_rising_articles&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; tool to fetch the top rising articles.
2. Use the &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fetch_comments&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; tool on the most popular articles to evaluate the community&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s sentiment.
3. Synthesize the articles and the sentiment into an insightful trend report.
4. Use the &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;create_article_draft&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; tool to automatically generate an unpublished DEV.to article containing your full synthesized report.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;root_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trend_spotting_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Spots rising trends on DEV community and automatically drafts digest articles.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent_instruction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# Here is where we hand over our Python functions!
&lt;/span&gt;    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_rising_articles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fetch_comments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;create_article_draft&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="c1"&gt;# Optional: configure automatic HTTP retries just in case the API drops
&lt;/span&gt;    &lt;span class="n"&gt;generate_content_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerateContentConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;http_options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HttpOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;retry_options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HttpRetryOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initial_delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attempts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that is literally all the setup we need. &lt;/p&gt;




&lt;h2&gt;
  
  
  The "Aha!" Moment
&lt;/h2&gt;

&lt;p&gt;To test this out, I spun up the ADK interface in my terminal (&lt;code&gt;adk web&lt;/code&gt;) and gave the agent a fairly complex prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I need a complete trend analysis for the 'machinelearning' tag. Fetch the top 5 rising articles. Read the comments on the top article to gauge what the community actually thinks. Synthesize this research and draft a new DEV.to article for me titled 'The Community Pulse'."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I watched the terminal logs, and this is where the power of an &lt;strong&gt;Agentic workflow&lt;/strong&gt; really clicked for me. &lt;/p&gt;

&lt;p&gt;The agent easily retrieved the list of articles. It then grabbed the ID of the #1 article and called our &lt;code&gt;fetch_comments(id)&lt;/code&gt; tool. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But there was a problem.&lt;/strong&gt; Because it was a rapidly &lt;em&gt;rising&lt;/em&gt; article, nobody had actually commented on it yet. &lt;/p&gt;

&lt;p&gt;If this was a traditional scripted loop, the program would have just returned an empty array, moved on to the writing phase, and published a broken, empty newsletter. &lt;/p&gt;

&lt;p&gt;But because this is an &lt;em&gt;Agent&lt;/em&gt;, it analyzed the tool's response ("No comments found on this article.") and realized it couldn't complete my request. &lt;strong&gt;Without any prompting from me&lt;/strong&gt;, the logs showed the agent dynamically pivoting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Okay, no comments on that one. Let's try the next most interesting one, 'Chapter 1: The Value Class'."&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(Calls tool)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Okay, no comments there either. Let's try 'Building a GPT From Scratch'."&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(Calls tool)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Still no comments. Last try, let's check 'Prove You're 18 Without Showing Who You Are'."&lt;/em&gt;&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%2Fgefabwx9nm7q8uehqm4t.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%2Fgefabwx9nm7q8uehqm4t.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It iterated through the list, dynamically feeding the output of our tool back into its own reasoning loop until it successfully found a lively debate! It then analyzed the sentiment and proceeded to the final step.&lt;/p&gt;

&lt;p&gt;With the research complete, the agent executed its final tool: &lt;code&gt;create_article_draft()&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;When I opened my DEV.to dashboard, I had a fully formatted Markdown article sitting as an unpublished draft, ready for me to review.&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%2Ff4ur4p97w5dmwubsudly.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%2Ff4ur4p97w5dmwubsudly.png" alt=" " width="800" height="938"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Connecting normal REST APIs to the Google ADK framework completely changes how you think about automation. You don't need to write exhaustive edge-case logic or endless &lt;code&gt;try/except&lt;/code&gt; blocks anymore. &lt;/p&gt;

&lt;p&gt;You just build reliable, single-purpose tools, hand them over, and let the LLM figure out how to navigate the road bumps.&lt;/p&gt;

&lt;p&gt;If you want to see the full source code for this project, you can check it out on my GitHub here: &lt;a href="https://github.com/aryanirani123/Agent-Development-Kit/tree/main/trend-spotting-agent" rel="noopener noreferrer"&gt;Link to Repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let me know in the comments if you've built any interesting agents lately, and I'll see you in the next one!&lt;/p&gt;

</description>
      <category>agentdevelopmentkit</category>
      <category>googlecloud</category>
      <category>devto</category>
      <category>gemini</category>
    </item>
    <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://dev.to/gde/google-workspace-studio-tutorial-turn-google-forms-into-a-full-crm-auto-lead-capture-2og6</link>
      <guid>https://dev.to/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:&amp;nbsp;&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&amp;nbsp;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="799" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Building the Ledger (Add a&amp;nbsp;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&amp;nbsp;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&amp;nbsp;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]&amp;nbsp;&lt;br&gt;
Email Draft: [Step 4: Email Body]&amp;nbsp;&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://dev.to/gde/google-workspace-studio-tutorial-auto-organize-your-inbox-with-smart-labels-priority-3493</link>
      <guid>https://dev.to/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;.&amp;nbsp;&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&amp;nbsp;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="799" 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&amp;nbsp;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&amp;nbsp;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="799" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Check if the Decision is&amp;nbsp;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&amp;nbsp;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&amp;nbsp;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&amp;nbsp;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="799" 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&amp;nbsp;. 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://dev.to/gde/google-workspace-studio-tutorial-building-an-ai-meeting-prep-agent-43ij</link>
      <guid>https://dev.to/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&amp;nbsp;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&amp;nbsp;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="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Setting the Meeting&amp;nbsp;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&amp;nbsp;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="450"&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="799" 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="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Generating the Permanent Record (Create a&amp;nbsp;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:&amp;nbsp;: 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="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: The Final Push (Notify me in&amp;nbsp;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="444"&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="444"&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="445"&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&amp;nbsp;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="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Professional Briefing&amp;nbsp;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="540"&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&amp;nbsp;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://dev.to/gde/reflections-on-my-trainings-gemini-for-google-workspace-4fj3</link>
      <guid>https://dev.to/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.&amp;nbsp;&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&amp;nbsp;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&amp;nbsp;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&amp;nbsp;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;.&amp;nbsp;&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.&amp;nbsp;&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.&amp;nbsp;&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://dev.to/gde/building-deploying-a-google-cloud-storage-mcp-server-to-cloud-run-4bfn</link>
      <guid>https://dev.to/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.&amp;nbsp;&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&amp;nbsp;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&amp;nbsp;
&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&amp;nbsp;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.&amp;nbsp;&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.&amp;nbsp;&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>
  </channel>
</rss>
