google-workspace · v1.0.0 · 2026-05-06 · sha256 f5b016b28370db3a
google-workspace v1.0.0A
Immutable. This exact content is served forever at /api/v1/blob/f5b016b28370db3a.
---
name: google-workspace
description: Gmail, Calendar, Drive, Sheets, Docs via Google API (SA / OAuth)
category: productivity
version: 1.0.0
origin: aiden
license: Apache-2.0
tags: google, gmail, calendar, drive, sheets, docs, workspace, api, oauth, email
---
# Google Workspace Integration
Access Gmail, Google Calendar, Drive, Sheets, and Docs through the Google REST APIs. Requires either a service account JSON key (`GOOGLE_APPLICATION_CREDENTIALS`) or an OAuth2 access token.
## When to Use
- User wants to read or send Gmail messages
- User wants to list or create Google Calendar events
- User wants to read/write a Google Sheet
- User wants to list Google Drive files
- User wants to read or update a Google Doc
## How to Use
### 1. Authenticate — OAuth token (quickest)
Get a short-lived access token via `gcloud` CLI (requires Google Cloud SDK installed):
```powershell
# One-time login (opens browser)
gcloud auth login
# Get token for API calls
$token = (gcloud auth print-access-token)
$headers = @{ "Authorization" = "Bearer $token" }
```
For service accounts, set `GOOGLE_APPLICATION_CREDENTIALS` to the JSON key path and use `gcloud auth application-default print-access-token`.
### 2. List recent Gmail messages
```powershell
$resp = Invoke-RestMethod -Uri "https://gmail.googleapis.com/gmail/v1/users/me/messages?maxResults=10" -Headers $headers
$resp.messages | ForEach-Object {
$msg = Invoke-RestMethod -Uri "https://gmail.googleapis.com/gmail/v1/users/me/messages/$($_.id)?format=metadata&metadataHeaders=Subject,From,Date" -Headers $headers
$msg.payload.headers | Where-Object { $_.name -in @("Subject","From","Date") } | Select-Object name,value
}
```
### 3. List today's Calendar events
```powershell
$now = [System.DateTime]::UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")
$end = [System.DateTime]::UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ")
$resp = Invoke-RestMethod -Uri "https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=$now&timeMax=$end&singleEvents=true&orderBy=startTime" -Headers $headers
$resp.items | Select-Object summary, @{N="start";E={$_.start.dateTime}}
```
### 4. Read a Google Sheet
```powershell
$spreadsheetId = "your-sheet-id" # from URL: /spreadsheets/d/<id>/
$range = "Sheet1!A1:E20"
$resp = Invoke-RestMethod -Uri "https://sheets.googleapis.com/v4/spreadsheets/$spreadsheetId/values/$range" -Headers $headers
$resp.values | ForEach-Object { $_ -join "`t" }
```
### 5. Write to a Google Sheet
```powershell
$spreadsheetId = "your-sheet-id"
$range = "Sheet1!A1"
$writeHeaders = $headers.Clone(); $writeHeaders["Content-Type"] = "application/json"
$payload = @{ values = @(@("Name","Score"),@("Alice","95"),@("Bob","87")) } | ConvertTo-Json
Invoke-RestMethod -Uri "https://sheets.googleapis.com/v4/spreadsheets/$spreadsheetId/values/$range`?valueInputOption=RAW" -Method Put -Headers $writeHeaders -Body $payload
```
### 6. List Google Drive files
```powershell
$resp = Invoke-RestMethod -Uri "https://www.googleapis.com/drive/v3/files?pageSize=20&fields=files(id,name,mimeType,modifiedTime)" -Headers $headers
$resp.files | Select-Object name, mimeType, modifiedTime | Format-Table -AutoSize
```
### 7. Read a Google Doc
```powershell
$docId = "your-doc-id" # from URL: /document/d/<id>/
$resp = Invoke-RestMethod -Uri "https://docs.googleapis.com/v1/documents/$docId" -Headers $headers
$resp.body.content | Where-Object { $_.paragraph } |
ForEach-Object { $_.paragraph.elements.textRun.content } | Where-Object { $_ } | Out-String
```
## Examples
**"Show me my unread Gmail emails from today"**
→ Use step 2 with query parameter `q=is:unread after:2026/04/17`.
**"What meetings do I have tomorrow?"**
→ Use step 3 with tomorrow's date range for `timeMin`/`timeMax`.
**"Read the sales data from my Google Sheet"**
→ Use step 4 with the sheet ID from the URL and the relevant range.
## Cautions
- OAuth tokens expire after 1 hour — refresh with `gcloud auth print-access-token` as needed
- Service account must be granted Workspace domain-wide delegation to impersonate users
- Google Sheets API ranges use A1 notation — specify exact range to avoid reading entire sheet
- Drive API returns a maximum of 1000 files per page; use `nextPageToken` for pagination
- Sending emails requires the `gmail.send` scope — confirm scope during OAuth setup