GEMINI LABJP
V0.60.0 — The gemini-cli stable release is still v0.60.0. Almost all of it is security work: web fetch destination checks, MCP OAuth issuer validation, sandbox isolation9/30 — gemini-omni-flash-preview shuts down on September 30, nine days from now. The replacement is gemini-omni-1.1-flashCODE13 — Uploading the same video repeatedly returns success and a code 13 failure in turn. With no visible trigger, it is worth deciding your retry policy up frontNEW — Three lines that decide image features in the Gemini app: thirteen, eighteen, and your administrator2.5GA — Gemini 2.5 Pro, Flash and Flash-Lite still have no announced shutdown date. The deprecation table reads No shutdown date announced3.8FLASH — Gemini 3.8 Flash pricing is introductory. It holds until December 31, 2026, and both input and output double on January 1, 2027V0.60.0 — The gemini-cli stable release is still v0.60.0. Almost all of it is security work: web fetch destination checks, MCP OAuth issuer validation, sandbox isolation9/30 — gemini-omni-flash-preview shuts down on September 30, nine days from now. The replacement is gemini-omni-1.1-flashCODE13 — Uploading the same video repeatedly returns success and a code 13 failure in turn. With no visible trigger, it is worth deciding your retry policy up frontNEW — Three lines that decide image features in the Gemini app: thirteen, eighteen, and your administrator2.5GA — Gemini 2.5 Pro, Flash and Flash-Lite still have no announced shutdown date. The deprecation table reads No shutdown date announced3.8FLASH — Gemini 3.8 Flash pricing is introductory. It holds until December 31, 2026, and both input and output double on January 1, 2027
Articles/Advanced
Advanced/2026-03-25Advanced

Gemini Workspace AI Expanded Access: Advanced Automation Guide 2026

Master Gemini Workspace's March 2026 AI Expanded Access add-on. Build multi-app automations with Gemini 3 Pro, Workspace Studio, and Apps Script for enterprise workflows.

gemini-workspace5automation54apps-script10integration202614

Setup and context

In March 2026, Google launched AI Expanded Access—a premium add-on for Gemini Workspace that brings Gemini 3 Pro's advanced reasoning directly into Docs, Sheets, Slides, and Gmail. This shifts automation from "simple assists" (spell check, summaries) to enterprise-grade intelligent workflows that handle complex decision-making, data transformation, and multi-app orchestration.


What Changed: Before vs. AI Expanded Access

Previous Workspace Model (through Feb 2026)

  • Limited to basic tasks: text editing, simple summaries, formula suggestions
  • Single-app only—no cross-document flows
  • Mostly Gemini Flash (lightweight model)
  • Complex workflows required full Apps Script development

AI Expanded Access (March 2026+)

  • Gemini 3 Pro throughout Workspace: Deep reasoning in every app
  • Cross-app pipelines: Automatically flow data from Sheets → Docs → Slides → Gmail
  • Intelligent workflows: Conditional logic, multi-step reasoning, decision trees
  • Apps Script supercharged: Direct API access to Gemini 3 Pro with Deep Think
  • Workspace Studio: Visual workflow builder with AI-powered automation

Pricing & Access

  • Available with Business Standard, Business Plus, and Enterprise plans
  • $10/user/month additional for AI Expanded Access
  • Includes full Gemini 3 Pro access (no per-token charges for basic inference)

Pattern 1: Workspace Studio Automation Flows

Workspace Studio is Google's no-code automation builder. With AI Expanded Access, you can build sophisticated flows without writing code—though Apps Script still powers the heavy lifting.

Scenario: Automated Sales Proposal Generation

A complete workflow that takes customer data from Sheets, generates a personalized proposal in Docs, and converts it to a Slides deck—all triggered by a new row in a customer database.

Trigger: New row in "Customers" Sheet
   ↓
Extract: Customer ID, company size, budget, industry
   ↓
[Gemini 3 Pro Analysis]
   → Analyze customer profile
   → Generate product recommendations (JSON)
   ↓
Google Docs Template
   → Populate with customer details
   → Add recommended solutions
   → Generate executive summary
   ↓
Google Slides
   → Convert Docs to presentation format
   → Auto-arrange with branding
   → Add charts from Sheets data
   ↓
Gmail Notification
   → Send to sales team with document links

Workspace Studio Configuration

In the Studio UI, you'd create:

Step 1: Trigger
├─ Type: Sheet trigger
├─ Event: New row added to "Customers"
└─ Fields: customer_id, company_name, industry, budget

Step 2: Read Data
├─ Sheet: "Customers"
├─ Row: Last inserted row
└─ Output: customer_object

Step 3: AI Analysis (Gemini 3 Pro)
├─ Model: Gemini 3 Pro
├─ Prompt Template: "Analyze this customer and recommend top 3 products..."
├─ Input: customer_object
└─ Output: recommendations_json

Step 4: Create Document
├─ Template: "Proposal_Template"
├─ Fields to populate:
│  ├─ {{customer_name}}
│  ├─ {{company_size}}
│  └─ {{recommendations}}
└─ Save to: "Sales Proposals" folder

Step 5: Create Presentation
├─ Convert Docs to Slides
├─ Add customer logo (from Sheet)
├─ Add metrics charts
└─ Save to: "Client Presentations" folder

Step 6: Send Email
├─ To: sales_team@company.com
├─ Subject: "New Proposal Ready: {{customer_name}}"
├─ Body: "Review and send proposal using this link..."
└─ Attachments: Doc and Slides URLs

Pattern 2: Apps Script + Gemini 3 Pro Deep Integration

While Workspace Studio handles visual flows, Apps Script is where you implement complex logic. AI Expanded Access exposes Gemini 3 Pro directly via the Apps Script Gemini API.

Scenario: Intelligent Sales Pipeline Analyzer

An automated system that evaluates large deals (>$100K or >60 days open) using Gemini 3 Pro reasoning, then logs risk assessments and next steps back to Sheets.

/**
 * Advanced Sales Pipeline Analysis with Gemini 3 Pro
 * Triggered daily to evaluate all open deals
 */
 
class SalesPipelineAnalyzer {
  constructor() {
    this.ss = SpreadsheetApp.getActiveSpreadsheet();
    this.dealsSheet = this.ss.getSheetByName("Sales Pipeline");
    this.resultsSheet = this.ss.getSheetByName("AI Analysis");
  }
 
  run() {
    // Step 1: Extract complex deals
    const deals = this.extractDeals();
    const complexDeals = deals.filter(d => this.isComplex(d));
 
    Logger.log(`Found ${complexDeals.length} complex deals for analysis`);
 
    // Step 2: Analyze each deal with Gemini 3 Pro
    const analyses = complexDeals.map(deal => {
      const analysis = this.analyzeWithGemini(deal);
      return {
        dealId: deal.id,
        dealName: deal.company,
        analysis: analysis,
        timestamp: new Date().toISOString()
      };
    });
 
    // Step 3: Log results to Sheets
    this.logResults(analyses);
 
    // Step 4: Alert on high-risk deals
    this.alertHighRisk(analyses);
  }
 
  extractDeals() {
    const data = this.dealsSheet.getDataRange().getValues();
    const headers = data[0];
    const deals = [];
 
    for (let i = 1; i < data.length; i++) {
      const obj = {};
      headers.forEach((h, idx) => {
        obj[h] = data[i][idx];
      });
      if (obj.Status !== "LOST" && obj.Status !== "WON") {
        deals.push(obj);
      }
    }
 
    return deals;
  }
 
  isComplex(deal) {
    const amountThreshold = 100000;
    const daysThreshold = 60;
    const daysOpen = Math.floor((Date.now() - deal.Created) / (1000 * 60 * 60 * 24));
 
    return deal.Amount > amountThreshold || daysOpen > daysThreshold;
  }
 
  analyzeWithGemini(deal) {
    const prompt = `
You are an expert sales director. Analyze this complex deal:
 
DEAL SUMMARY:
- Prospect: ${deal.company}
- Amount: $${deal.Amount.toLocaleString()}
- Stage: ${deal.Stage}
- Days Open: ${Math.floor((Date.now() - deal.Created) / (1000 * 60 * 60 * 24))}
- Last Activity: ${deal.LastActivity}
- Key Stakeholders: ${deal.Stakeholders}
- Competitive Situation: ${deal.Competition}
 
ANALYSIS REQUIRED:
1. Close probability (0-100%)
2. Top 3 risk factors (with mitigation)
3. Immediate next steps (max 5)
4. Recommended closing strategy
 
Respond in JSON format:
{
  "close_probability": number,
  "risk_level": "LOW" | "MEDIUM" | "HIGH",
  "risk_factors": [{ factor: string, mitigation: string }],
  "next_steps": [string],
  "recommended_strategy": string
}
`;
 
    try {
      const response = this.callGemini3Pro(prompt, {
        temperature: 0.3,  // Lower temp for analytical consistency
        max_tokens: 1500
      });
 
      // Try to parse JSON response
      const jsonMatch = response.match(/\{[\s\S]*\}/);
      if (jsonMatch) {
        return JSON.parse(jsonMatch[0]);
      }
 
      // Fallback: return raw response
      return {
        close_probability: 0,
        risk_level: "UNKNOWN",
        analysis_text: response
      };
    } catch (e) {
      Logger.log(`Gemini error for deal ${deal.id}: ${e.message}`);
      return {
        close_probability: 0,
        risk_level: "ERROR",
        error: e.message
      };
    }
  }
 
  callGemini3Pro(prompt, options = {}) {
    const apiKey = PropertiesService.getScriptProperties()
      .getProperty("GEMINI_API_KEY");
 
    if (!apiKey) {
      throw new Error("GEMINI_API_KEY not found in Script Properties");
    }
 
    const payload = {
      contents: [{
        parts: [{
          text: prompt
        }]
      }],
      generationConfig: {
        temperature: options.temperature || 0.7,
        maxOutputTokens: options.max_tokens || 2000
      }
    };
 
    const requestOptions = {
      method: "post",
      contentType: "application/json",
      payload: JSON.stringify(payload),
      muteHttpExceptions: true
    };
 
    const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro:generateContent?key=${apiKey}`;
 
    const response = UrlFetchApp.fetch(url, requestOptions);
    const result = JSON.parse(response.getContentText());
 
    if (result.candidates?.[0]?.content?.parts?.[0]?.text) {
      return result.candidates[0].content.parts[0].text;
    }
 
    if (response.getResponseCode() !== 200) {
      throw new Error(`API error: ${response.getContentText()}`);
    }
 
    throw new Error("No response text from Gemini");
  }
 
  logResults(analyses) {
    const resultsData = analyses.map(a => [
      a.dealId,
      a.dealName,
      a.analysis.close_probability,
      a.analysis.risk_level,
      a.analysis.risk_factors?.map(f => f.factor).join("; "),
      a.analysis.next_steps?.join("; "),
      a.timestamp
    ]);
 
    this.resultsSheet.getRange(2, 1, resultsData.length, 7)
      .setValues(resultsData);
  }
 
  alertHighRisk(analyses) {
    const highRisk = analyses.filter(a => a.analysis.risk_level === "HIGH");
 
    if (highRisk.length > 0) {
      const recipients = PropertiesService.getScriptProperties()
        .getProperty("ALERT_EMAILS").split(",");
 
      const message = `High-risk deals detected (${highRisk.length}):\n\n` +
        highRisk.map(a =>
          `${a.dealName}: ${a.analysis.risk_level} risk, ${a.analysis.close_probability}% close prob`
        ).join("\n");
 
      recipients.forEach(email => {
        GmailApp.sendEmail(email, "Sales Pipeline Alert", message);
      });
    }
  }
}
 
// Trigger: Daily at 8am
function scheduledPipelineAnalysis() {
  const analyzer = new SalesPipelineAnalyzer();
  analyzer.run();
}

Expected Output (Sheets):

Deal ID | Company | Close % | Risk | Factors | Next Steps | Timestamp
--------+---------+---------+------+---------+------------+----------
D-1234  | Acme    | 75%     | MED  | Internal approval; budget finalized | Schedule exec demo; Get legal review | 2026-03-25T14:30Z
D-1567  | TechCo  | 35%     | HIGH | No exec sponsor; competing solution | Escalate to CEO; Technical POC | 2026-03-25T14:35Z

Pattern 3: Multi-App Data Pipelines

Connect Sheets → Docs → Slides → Gmail in an integrated workflow. Data flows automatically, with Gemini 3 Pro reasoning at each stage.

Scenario: Automated Customer Success Report

Every week, pull customer usage metrics from Sheets, analyze with Gemini, generate a detailed report in Docs, convert to executive Slides, and email stakeholders.

/**
 * Automated Customer Success Reporting Pipeline
 * Runs weekly; generates Docs report + Slides deck + Email distribution
 */
 
class CustomerSuccessPipeline {
  constructor() {
    this.driveFolder = DriveApp.getFolderById(
      PropertiesService.getScriptProperties().getProperty("REPORTS_FOLDER_ID")
    );
    this.dataSheet = SpreadsheetApp.getSheetByName("Customer Metrics");
    this.docTemplate = DocumentApp.openById(
      PropertiesService.getScriptProperties().getProperty("DOC_TEMPLATE_ID")
    );
  }
 
  run() {
    // Step 1: Extract and aggregate customer data
    const customers = this.getCustomerMetrics();
    const aggregatedData = this.aggregateMetrics(customers);
 
    // Step 2: Analyze with Gemini 3 Pro
    const analysis = this.performAnalysis(aggregatedData);
 
    // Step 3: Generate Docs report
    const docUrl = this.generateDocReport(analysis);
 
    // Step 4: Create Slides presentation
    const slidesUrl = this.generateSlidesDeck(analysis);
 
    // Step 5: Send distribution
    this.sendDistribution(docUrl, slidesUrl, analysis);
  }
 
  getCustomerMetrics() {
    const data = this.dataSheet.getDataRange().getValues();
    const headers = data[0];
 
    return data.slice(1).map(row => {
      const obj = {};
      headers.forEach((h, i) => obj[h] = row[i]);
      return obj;
    }).filter(c => c.Status !== "INACTIVE");
  }
 
  aggregateMetrics(customers) {
    // Group by segment
    const bySegment = {};
 
    customers.forEach(c => {
      const seg = c.Segment;
      if (!bySegment[seg]) bySegment[seg] = [];
      bySegment[seg].push(c);
    });
 
    // Calculate metrics per segment
    const aggregated = {};
    Object.entries(bySegment).forEach(([seg, custs]) => {
      aggregated[seg] = {
        count: custs.length,
        avgUsage: custs.reduce((sum, c) => sum + c.UsageScore, 0) / custs.length,
        churnRisk: custs.filter(c => c.NPS < 5).length / custs.length,
        mrrContribution: custs.reduce((sum, c) => sum + c.MRR, 0),
        topCustomers: custs.sort((a, b) => b.MRR - a.MRR).slice(0, 3)
      };
    });
 
    return aggregated;
  }
 
  performAnalysis(aggregatedData) {
    const prompt = `
Analyze our customer success metrics and provide strategic recommendations:
 
SEGMENT PERFORMANCE:
${JSON.stringify(aggregatedData, null, 2)}
 
Provide:
1. Growth opportunities (fastest-growing segments)
2. Churn risks (segments needing intervention)
3. Upsell recommendations (under-utilizing features)
4. Strategic actions (top 5 priorities)
 
Return JSON with keys: growth_segs, churn_risks, upsell_opps, priorities
`;
 
    const response = this.callGemini3Pro(prompt);
 
    try {
      const json = JSON.parse(response);
      return {
        ...aggregatedData,
        analysis: json
      };
    } catch (e) {
      Logger.log(`JSON parse failed: ${e.message}`);
      return { ...aggregatedData, analysis: { raw: response } };
    }
  }
 
  generateDocReport(analysis) {
    // Copy template
    const doc = this.docTemplate.copy(
      `CS Report - ${new Date().toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric' })}`
    );
    const body = doc.getBody();
 
    // Clear template placeholders
    const paragraphs = body.getParagraphs();
    paragraphs.forEach(p => {
      if (p.getText().includes("{{")) {
        p.setText("");
      }
    });
 
    // Add content
    body.appendParagraph("Executive Summary").setHeading(DocumentApp.ParagraphHeading.HEADING_1);
    body.appendParagraph(analysis.analysis.priorities?.[0] || "Analysis complete");
 
    Object.entries(analysis).forEach(([segment, metrics]) => {
      if (segment !== "analysis") {
        body.appendParagraph(`${segment} - ${metrics.count} customers`)
          .setHeading(DocumentApp.ParagraphHeading.HEADING_2);
        body.appendParagraph(`Avg Usage: ${metrics.avgUsage?.toFixed(2)}, Churn Risk: ${(metrics.churnRisk * 100).toFixed(1)}%`);
      }
    });
 
    doc.saveAndClose();
    return doc.getUrl();
  }
 
  generateSlidesDeck(analysis) {
    const pres = SlidesApp.create(
      `Customer Success Report - ${new Date().toLocaleDateString('en-US')}`
    );
 
    // Slide 1: Title
    const slide1 = pres.getSlides()[0];
    slide1.getShapes()[0].getText().setText("Customer Success Report");
    slide1.getShapes()[1].getText().setText(new Date().toLocaleDateString('en-US'));
 
    // Slide 2: Key Findings
    const slide2 = pres.appendSlide(SlidesApp.PredefinedLayout.TITLE_AND_BODY);
    slide2.getShapes()[0].getText().setText("Key Findings");
    const body = slide2.getShapes()[1].getText();
    analysis.analysis.priorities?.forEach((p, i) => {
      if (i < 3) body.appendText(`• ${p}\n`);
    });
 
    // Slide 3: Segment Breakdown
    const slide3 = pres.appendSlide(SlidesApp.PredefinedLayout.TITLE_AND_BODY);
    slide3.getShapes()[0].getText().setText("Segment Performance");
 
    pres.saveAndClose();
    return pres.getUrl();
  }
 
  sendDistribution(docUrl, slidesUrl, analysis) {
    const recipients = PropertiesService.getScriptProperties()
      .getProperty("CS_DISTRIBUTION_LIST").split(",");
 
    const subject = `Customer Success Report - ${new Date().toLocaleDateString('en-US')}`;
    const body = `
Weekly Customer Success Report
 
Executive Summary:
${analysis.analysis.priorities?.[0] || "See attached reports"}
 
Report: ${docUrl}
Presentation: ${slidesUrl}
 
---
Generated on ${new Date().toISOString()}
`;
 
    recipients.forEach(email => {
      GmailApp.sendEmail(email.trim(), subject, body);
    });
  }
 
  callGemini3Pro(prompt) {
    const apiKey = PropertiesService.getScriptProperties()
      .getProperty("GEMINI_API_KEY");
 
    const payload = {
      contents: [{
        parts: [{
          text: prompt
        }]
      }],
      generationConfig: {
        temperature: 0.5,
        maxOutputTokens: 2000
      }
    };
 
    const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro:generateContent?key=${apiKey}`;
 
    const response = UrlFetchApp.fetch(url, {
      method: "post",
      contentType: "application/json",
      payload: JSON.stringify(payload),
      muteHttpExceptions: true
    });
 
    const result = JSON.parse(response.getContentText());
    return result.candidates?.[0]?.content?.parts?.[0]?.text || "";
  }
}
 
// Trigger: Every Monday at 9am
function weeklyCSReport() {
  const pipeline = new CustomerSuccessPipeline();
  pipeline.run();
}

Pattern 4: Native Sheet Editor Integration

AI Expanded Access brings Gemini directly into the cell editor. Right-click a cell and choose "Get AI help" to invoke Gemini 3 Pro without leaving Sheets.

Example: Formula Generation from Natural Language

User enters in cell: "Calculate year-over-year growth percentage"

Gemini 3 Pro interprets:
  → Identifies neighboring cells with "last year" and "this year" data
  → Generates formula: =((B2-A2)/A2)*100
  → Suggests cell formatting (percentage, 1 decimal place)

Example: Conditional Analysis

/**
 * Sheet menu item: Analyze This Row
 * Runs Gemini 3 Pro on the selected row data
 */
 
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu("AI Analyze")
    .addItem("Analyze row with Gemini", "analyzeSelectedRow")
    .addToUi();
}
 
function analyzeSelectedRow() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getActiveRange();
  const rowNum = range.getRow();
 
  // Get entire row
  const rowData = sheet.getRange(rowNum, 1, 1, sheet.getLastColumn())
    .getValues()[0];
  const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn())
    .getValues()[0];
 
  // Format as key-value
  const rowObj = {};
  headers.forEach((h, i) => {
    rowObj[h] = rowData[i];
  });
 
  // Call Gemini
  const prompt = `Analyze this data row and provide a one-line insight:\n${JSON.stringify(rowObj)}`;
  const insight = callGemini3Pro(prompt);
 
  // Write to column next to row
  sheet.getRange(rowNum, sheet.getLastColumn() + 1)
    .setValue(insight);
 
  SpreadsheetApp.getUi().alert("Analysis complete!");
}

Conclusion

AI Expanded Access transforms Workspace from a productivity suite into an intelligent automation platform. By combining Workspace Studio for orchestration, Apps Script for custom logic, and Gemini 3 Pro for reasoning, you can build workflows that rival expensive enterprise tools—entirely within the tools your team already uses.

Start small: automate one recurring report or sales process. Measure time saved. Scale from there.

Related Articles:

  • Gemini 3 Flash Practical Guide
  • Gemini Workspace March 2026 Major Update
  • Gemini Function Calling in Production
Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

Advanced2026-06-27
When Gemini Computer Use Acts on a Stale Screen and Fails Quietly — Field Notes on Guarding the Loop
A Computer Use agent will click based on a screenshot taken moments ago, miss the real target, and throw no error. These are field notes on measuring those silent misclicks and stopping them with an observe-act-verify loop.
Advanced2026-05-05
Building a B2B Business Automation SaaS with Gemini 2.5 Pro Function Calling — Revenue Blueprint
A complete guide to building and selling B2B business automation SaaS using Gemini 2.5 Pro Function Calling. Covers API architecture, multi-tenant design, pricing strategy, and the sales process that closed first contracts within 3 weeks of demo.
Advanced2026-03-24
NotebookLM API × Gemini API — Automate Your Research Workflow with Python
Build an automated research pipeline by combining the NotebookLM Enterprise API and Gemini API in Python. Complete with working code examples for paper collection, summarization, podcast generation, and report creation.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links