--- name: google-sheets-automation description: "Lightweight Google Sheets integration with standalone OAuth authentication. No MCP server required. Full read/write access." risk: safe --- # Google Sheets Lightweight Google Sheets integration with standalone OAuth authentication. No MCP server required. Full read/write access. ## Prerequisites ```bash uv sync source .venv/bin/activate ``` ## First-Time Setup Authenticate with Google (opens browser): ```bash python .agents/skills/google-sheets-automation/scripts/auth.py login ``` Check authentication status: ```bash python .agents/skills/google-sheets-automation/scripts/auth.py status ``` Logout when needed: ```bash python .agents/skills/google-sheets-automation/scripts/auth.py logout ``` ## Read Commands ```bash # 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 ```bash # 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 ```json { "Q1": [ ["Name", "Revenue", "Units"], ["Product A", "10000", "50"] ] } ``` ## A1 Notation Examples - `Sheet1!A1:B10` - Range A1 to B10 on Sheet1 - `Sheet1!A:A` - All of column A - `Sheet1!1:1` - All of row 1 - `A1: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.