GEMINI LABJP
SIRI — WWDC 2026 confirms the revamped Siri runs on a Google Gemini model, though it won't ship in the EU at iOS 27 due to the DMAFLASH3.5 — Gemini 3.5 Flash is now GA, the top Flash model for sustained frontier performance on agentic and coding tasksIMAGE-GA — Gemini 3.1 Flash Image and 3.1 Pro Image are GA as native visual models; the preview versions shut down Jun 25MANAGED-AGENTS — Managed Agents launch in public preview in the Gemini API, running autonomous agents in Google-hosted isolated Linux sandboxesFILE-SEARCH — File Search now supports multimodal search, with native image embedding and retrieval via gemini-embedding-2DEPRECATION — gemini-3.1-flash-image-preview and gemini-3-pro-image-preview shut down Jun 25 — migrate to the GA models soonSIRI — WWDC 2026 confirms the revamped Siri runs on a Google Gemini model, though it won't ship in the EU at iOS 27 due to the DMAFLASH3.5 — Gemini 3.5 Flash is now GA, the top Flash model for sustained frontier performance on agentic and coding tasksIMAGE-GA — Gemini 3.1 Flash Image and 3.1 Pro Image are GA as native visual models; the preview versions shut down Jun 25MANAGED-AGENTS — Managed Agents launch in public preview in the Gemini API, running autonomous agents in Google-hosted isolated Linux sandboxesFILE-SEARCH — File Search now supports multimodal search, with native image embedding and retrieval via gemini-embedding-2DEPRECATION — gemini-3.1-flash-image-preview and gemini-3-pro-image-preview shut down Jun 25 — migrate to the GA models soon
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-workspace6automation57apps-script9integration2202621

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 $10 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-03-20
Gemini × Google Workspace Deep Integration 2026 Guide— Mastering AI in Docs, Sheets, Slides & Drive
A comprehensive guide to the March 2026 Gemini × Google Workspace deep integration. Learn AI-powered document creation in Docs, automated data analysis in Sheets (70.48% success rate), cross-file search in Drive, and AI-assisted presentations in Slides.
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-04-20
Analyzing Your Entire Codebase with Gemini 2.5 Pro — Automated Architecture Reviews, Tech Debt Detection, and Refactoring Suggestions
Use Gemini 2.5 Pro's 1M-token context window to analyze an entire codebase at once. This guide walks through building a Python pipeline for automated architecture reviews, tech debt scoring, and refactoring suggestions.
📚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
See all →