- opencode agent (fitness-trainer) for personal training conversations - fitness-workout skill with programming methodology guidelines - workout.py script (1RM, volume, cycle helpers) - logs/ directory for workout and check-in markdown files - inputs/ with user profile (equipment, goals, medical, Juggernaut history) - google-sheets-automation skill for optional Sheets integration - AGENTS.md with setup documentation
3.5 KiB
3.5 KiB
name, description, risk
| name | description | risk |
|---|---|---|
| google-sheets-automation | Lightweight Google Sheets integration with standalone OAuth authentication. No MCP server required. Full read/write access. | safe |
Google Sheets
Lightweight Google Sheets integration with standalone OAuth authentication. No MCP server required. Full read/write access.
Prerequisites
uv sync
source .venv/bin/activate
First-Time Setup
Authenticate with Google (opens browser):
python .agents/skills/google-sheets-automation/scripts/auth.py login
Check authentication status:
python .agents/skills/google-sheets-automation/scripts/auth.py status
Logout when needed:
python .agents/skills/google-sheets-automation/scripts/auth.py logout
Read Commands
# Get spreadsheet content as plain text (default)
python .agents/skills/google-sheets-automation/scripts/sheets.py get-text SPREADSHEET_ID
# Get spreadsheet content as CSV
python .agents/skills/google-sheets-automation/scripts/sheets.py get-text SPREADSHEET_ID --format csv
# Get spreadsheet content as JSON
python .agents/skills/google-sheets-automation/scripts/sheets.py get-text SPREADSHEET_ID --format json
# Get values from a specific range (A1 notation)
python .agents/skills/google-sheets-automation/scripts/sheets.py get-range SPREADSHEET_ID "Sheet1!A1:D10"
# Find spreadsheets by search query
python .agents/skills/google-sheets-automation/scripts/sheets.py find "budget 2024"
# Get spreadsheet metadata
python .agents/skills/google-sheets-automation/scripts/sheets.py get-metadata SPREADSHEET_ID
Write Commands
# Update a range of cells with values (JSON 2D array)
python .agents/skills/google-sheets-automation/scripts/sheets.py update-range SPREADSHEET_ID "Sheet1!A1:B2" '[["Hello","World"],["Foo","Bar"]]'
# Update with RAW input (no formula parsing)
python .agents/skills/google-sheets-automation/scripts/sheets.py update-range SPREADSHEET_ID "Sheet1!A1:B1" '[["=SUM(A1:A5)","text"]]' --raw
# Append rows after the last data row
python .agents/skills/google-sheets-automation/scripts/sheets.py append-rows SPREADSHEET_ID "Sheet1!A:Z" '[["New Row Col A","New Row Col B"]]'
# Clear values from a range (keeps formatting)
python .agents/skills/google-sheets-automation/scripts/sheets.py clear-range SPREADSHEET_ID "Sheet1!A1:B10"
# Batch update (advanced - for formatting, merging, etc.)
python .agents/skills/google-sheets-automation/scripts/sheets.py batch-update SPREADSHEET_ID '[{"updateCells":{"range":{"sheetId":0},"fields":"userEnteredValue"}}]'
Spreadsheet ID
You can use either:
- The spreadsheet ID:
1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms - The full URL:
https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
The script automatically extracts the ID from URLs.
Output Formats
Text (default)
Name | Revenue | Units
Product A | 10000 | 50
CSV
Name,Revenue,Units
Product A,10000,50
JSON
{
"Q1": [
["Name", "Revenue", "Units"],
["Product A", "10000", "50"]
]
}
A1 Notation Examples
Sheet1!A1:B10- Range A1 to B10 on Sheet1Sheet1!A:A- All of column ASheet1!1:1- All of row 1A1:C5- Range on the first sheet
Token Management
Tokens stored securely using the system keyring:
- macOS: Keychain
- Windows: Windows Credential Locker
- Linux: Secret Service API (GNOME Keyring, KDE Wallet, etc.)
Service name: google-sheets-skill-oauth
Tokens automatically refresh when expired.