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