Google Sheets Automation via Rube MCP
Selective Reading Rule
Start with:
references/senior-master-standard.md
references/usage-routing.md
references/quality-checklist.md
Then load only the inherited docs, scripts, assets, or examples that match the user's actual task.
Automate Google Sheets workflows including reading/writing data, managing spreadsheets and tabs, formatting cells, filtering rows, and upserting records through Composio's Google Sheets toolkit.
Prerequisites
- Rube MCP must be connected (RUBE_SEARCH_TOOLS available)
- Active Google Sheets connection via
RUBE_MANAGE_CONNECTIONS with toolkit googlesheets
- Always call
RUBE_SEARCH_TOOLS first to get current tool schemas
Setup
Get Rube MCP: Add https://rube.app/mcp as an MCP server in your client configuration. No API keys needed — just add the endpoint and it works.
- Verify Rube MCP is available by confirming
RUBE_SEARCH_TOOLS responds
- Call
RUBE_MANAGE_CONNECTIONS with toolkit googlesheets
- If connection is not ACTIVE, follow the returned auth link to complete Google OAuth
- Confirm connection status shows ACTIVE before running any workflows
Core Workflows
1. Read and Write Data
When to use: User wants to read data from or write data to a Google Sheet
Tool sequence:
GOOGLESHEETS_SEARCH_SPREADSHEETS - Find spreadsheet by name if ID unknown [Prerequisite]
GOOGLESHEETS_GET_SHEET_NAMES - Enumerate tab names to target the right sheet [Prerequisite]
GOOGLESHEETS_BATCH_GET - Read data from one or more ranges [Required]
GOOGLESHEETS_BATCH_UPDATE - Write data to a range or append rows [Required]
GOOGLESHEETS_VALUES_UPDATE - Update a single specific range [Alternative]
GOOGLESHEETS_SPREADSHEETS_VALUES_APPEND - Append rows to end of table [Alternative]
Key parameters:
spreadsheet_id: Alphanumeric ID from the spreadsheet URL (between '/d/' and '/edit')
ranges: A1 notation array (e.g., 'Sheet1!A1:Z1000'); always use bounded ranges
sheet_name: Tab name (case-insensitive matching supported)
values: 2D array where each inner array is a row
first_cell_location: Starting cell in A1 notation (omit to append)
valueInputOption: 'USER_ENTERED' (parsed) or 'RAW' (literal)
Pitfalls:
- Mis-cased or non-existent tab names error "Sheet 'X' not found"
- Empty ranges may omit
valueRanges[i].values; treat missing as empty array
GOOGLESHEETS_BATCH_UPDATE values must be a 2D array (list of lists), even for a single row
- Unbounded ranges like 'A:Z' on sheets with >10,000 rows may cause timeouts; always bound with row limits
- Append follows the detected
tableRange; use returned updatedRange to verify placement
2. Create and Manage Spreadsheets
When to use: User wants to create a new spreadsheet or manage tabs within one
Tool sequence:
GOOGLESHEETS_CREATE_GOOGLE_SHEET1 - Create a new spreadsheet [Required]
GOOGLESHEETS_ADD_SHEET - Add a new tab/worksheet [Required]
GOOGLESHEETS_UPDATE_SHEET_PROPERTIES - Rename, hide, reorder, or color tabs [Optional]
GOOGLESHEETS_GET_SPREADSHEET_INFO - Get full spreadsheet metadata [Optional]
GOOGLESHEETS_FIND_WORKSHEET_BY_TITLE - Check if a specific tab exists [Optional]
Key parameters:
title: Spreadsheet or sheet tab name
spreadsheetId: Target spreadsheet ID
forceUnique: Auto-append suffix if tab name exists (default true)
properties.gridProperties: Set row/column counts, frozen rows
Pitfalls:
- Sheet names must be unique within a spreadsheet
- Default sheet names are locale-dependent ('Sheet1' in English, 'Hoja 1' in Spanish)
- Don't use
index when creating multiple sheets in parallel (causes 'index too high' errors)
GOOGLESHEETS_GET_SPREADSHEET_INFO can return 403 if account lacks access
3. Search and Filter Rows
When to use: User wants to find specific rows or apply filters to sheet data
Tool sequence:
GOOGLESHEETS_LOOKUP_SPREADSHEET_ROW - Find first row matching exact cell value [Required]
GOOGLESHEETS_SET_BASIC_FILTER - Apply filter/sort to a range [Alternative]
GOOGLESHEETS_CLEAR_BASIC_FILTER - Remove existing filter [Optional]
GOOGLESHEETS_BATCH_GET - Read filtered results [Optional]
Key parameters:
query: Exact text value to match (matches entire cell content)
range: A1 notation range to search within
case_sensitive: Boolean for case-sensitive matching (default false)
filter.range: Grid range with sheet_id for basic filter
filter.criteria: Column-based filter conditions
filter.sortSpecs: Sort specifications
Pitfalls:
GOOGLESHEETS_LOOKUP_SPREADSHEET_ROW matches entire cell content, not substrings
- Sheet names with spaces must be single-quoted in ranges (e.g., "'My Sheet'!A:Z")
- Bare sheet names without ranges are not supported for lookup; always specify a range
4. Upsert Rows by Key
When to use: User wants to update existing rows or insert new ones based on a unique key column
Tool sequence:
GOOGLESHEETS_UPSERT_ROWS - Update matching rows or append new ones [Required]
Key parameters:
spreadsheetId: Target spreadsheet ID
sheetName: Tab name
keyColumn: Column header name used as unique identifier (e.g., 'Email', 'SKU')
headers: List of column names for the data
rows: 2D array of data rows
strictMode: Error on mismatched column counts (default true)
Pitfalls:
keyColumn must be an actual header name, NOT a column letter (e.g., 'Email' not 'A')
- If
headers is NOT provided, first row of rows is treated as headers
- With
strictMode=true, rows with more values than headers cause an error
- Auto-adds missing columns to the sheet
5. Format Cells
When to use: User wants to apply formatting (bold, colors, font size) to cells
Tool sequence:
GOOGLESHEETS_GET_SPREADSHEET_INFO - Get numeric sheetId for target tab [Prerequisite]
GOOGLESHEETS_FORMAT_CELL - Apply formatting to a range [Required]
GOOGLESHEETS_UPDATE_SHEET_PROPERTIES - Change frozen rows, column widths [Optional]
Key parameters:
spreadsheet_id: Spreadsheet ID
worksheet_id: Numeric sheetId (NOT tab name); get from GET_SPREADSHEET_INFO
range: A1 notation (e.g., 'A1:F1') - preferred over index fields
bold, italic, underline, strikethrough: Boolean formatting options
red, green, blue: Background color as 0.0-1.0 floats (NOT 0-255 ints)
fontSize: Font size in points
Pitfalls:
- Requires numeric
worksheet_id, not tab title; get from spreadsheet metadata
- Color channels are 0-1 floats (e.g., 1.0 for full red), NOT 0-255 integers
- Responses may return empty reply objects ([{}]); verify formatting via readback
- Format one range per call; batch formatting requires separate calls
Common Patterns
ID Resolution
- Spreadsheet name -> ID:
GOOGLESHEETS_SEARCH_SPREADSHEETS with query
- Tab name -> sheetId:
GOOGLESHEETS_GET_SPREADSHEET_INFO, extract from sheets metadata
- Tab existence check:
GOOGLESHEETS_FIND_WORKSHEET_BY_TITLE
Rate Limits
Google Sheets enforces strict rate limits:
- Max 60 reads/minute and 60 writes/minute
- Exceeding limits causes errors; batch operations where possible
- Use
GOOGLESHEETS_BATCH_GET and GOOGLESHEETS_BATCH_UPDATE for efficiency
Data Patterns
- Always read before writing to understand existing layout
- Use
GOOGLESHEETS_UPSERT_ROWS for CRM syncs, inventory updates, and dedup scenarios
- Append mode (omit
first_cell_location) is safest for adding new records
- Use
GOOGLESHEETS_CLEAR_VALUES to clear content while preserving formatting
Known Pitfalls
- Tab names: Locale-dependent defaults; 'Sheet1' may not exist in non-English accounts
- Range notation: Sheet names with spaces need single quotes in A1 notation
- Unbounded ranges: Can timeout on large sheets; always specify row bounds (e.g., 'A1:Z10000')
- 2D arrays: All value parameters must be list-of-lists, even for single rows
- Color values: Floats 0.0-1.0, not integers 0-255
- Formatting IDs:
FORMAT_CELL needs numeric sheetId, not tab title
- Rate limits: 60 reads/min and 60 writes/min; batch to stay within limits
- Delete dimension:
GOOGLESHEETS_DELETE_DIMENSION is irreversible; double-check bounds
Quick Reference
| Task |
Tool Slug |
Key Params |
| Search spreadsheets |
GOOGLESHEETS_SEARCH_SPREADSHEETS |
query, search_type |
| Create spreadsheet |
GOOGLESHEETS_CREATE_GOOGLE_SHEET1 |
title |
| List tabs |
GOOGLESHEETS_GET_SHEET_NAMES |
spreadsheet_id |
| Add tab |
GOOGLESHEETS_ADD_SHEET |
spreadsheetId, title |
| Read data |
GOOGLESHEETS_BATCH_GET |
spreadsheet_id, ranges |
| Read single range |
GOOGLESHEETS_VALUES_GET |
spreadsheet_id, range |
| Write data |
GOOGLESHEETS_BATCH_UPDATE |
spreadsheet_id, sheet_name, values |
| Update range |
GOOGLESHEETS_VALUES_UPDATE |
spreadsheet_id, range, values |
| Append rows |
GOOGLESHEETS_SPREADSHEETS_VALUES_APPEND |
spreadsheetId, range, values |
| Upsert rows |
GOOGLESHEETS_UPSERT_ROWS |
spreadsheetId, sheetName, keyColumn, rows |
| Lookup row |
GOOGLESHEETS_LOOKUP_SPREADSHEET_ROW |
spreadsheet_id, query |
| Format cells |
GOOGLESHEETS_FORMAT_CELL |
spreadsheet_id, worksheet_id, range |
| Set filter |
GOOGLESHEETS_SET_BASIC_FILTER |
spreadsheetId, filter |
| Clear values |
GOOGLESHEETS_CLEAR_VALUES |
spreadsheet_id, range |
| Delete rows/cols |
GOOGLESHEETS_DELETE_DIMENSION |
spreadsheet_id, sheet_name, dimension |
| Spreadsheet info |
GOOGLESHEETS_GET_SPREADSHEET_INFO |
spreadsheet_id |
| Update tab props |
GOOGLESHEETS_UPDATE_SHEET_PROPERTIES |
spreadsheetId, properties |
When to Use
This skill is applicable to execute the workflow or actions described in the overview.
Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
1---2name: googlesheets-automation3description: ALWAYS use this when the request matches Googlesheets Automation: Automate Google Sheets operations (read, write, format, filter, manage spreadsheets) via Rube MCP (Composio).4---56# Google Sheets Automation via Rube MCP78## Selective Reading Rule910Start with:1112- `references/senior-master-standard.md`13- `references/usage-routing.md`14- `references/quality-checklist.md`1516Then load only the inherited docs, scripts, assets, or examples that match the user's actual task.1718Automate Google Sheets workflows including reading/writing data, managing spreadsheets and tabs, formatting cells, filtering rows, and upserting records through Composio's Google Sheets toolkit.1920## Prerequisites2122- Rube MCP must be connected (RUBE_SEARCH_TOOLS available)23- Active Google Sheets connection via `RUBE_MANAGE_CONNECTIONS` with toolkit `googlesheets`24- Always call `RUBE_SEARCH_TOOLS` first to get current tool schemas2526## Setup2728**Get Rube MCP**: Add `https://rube.app/mcp` as an MCP server in your client configuration. No API keys needed — just add the endpoint and it works.29301. Verify Rube MCP is available by confirming `RUBE_SEARCH_TOOLS` responds312. Call `RUBE_MANAGE_CONNECTIONS` with toolkit `googlesheets`323. If connection is not ACTIVE, follow the returned auth link to complete Google OAuth334. Confirm connection status shows ACTIVE before running any workflows3435## Core Workflows3637### 1. Read and Write Data3839**When to use**: User wants to read data from or write data to a Google Sheet4041**Tool sequence**:421. `GOOGLESHEETS_SEARCH_SPREADSHEETS` - Find spreadsheet by name if ID unknown [Prerequisite]432. `GOOGLESHEETS_GET_SHEET_NAMES` - Enumerate tab names to target the right sheet [Prerequisite]443. `GOOGLESHEETS_BATCH_GET` - Read data from one or more ranges [Required]454. `GOOGLESHEETS_BATCH_UPDATE` - Write data to a range or append rows [Required]465. `GOOGLESHEETS_VALUES_UPDATE` - Update a single specific range [Alternative]476. `GOOGLESHEETS_SPREADSHEETS_VALUES_APPEND` - Append rows to end of table [Alternative]4849**Key parameters**:50- `spreadsheet_id`: Alphanumeric ID from the spreadsheet URL (between '/d/' and '/edit')51- `ranges`: A1 notation array (e.g., 'Sheet1!A1:Z1000'); always use bounded ranges52- `sheet_name`: Tab name (case-insensitive matching supported)53- `values`: 2D array where each inner array is a row54- `first_cell_location`: Starting cell in A1 notation (omit to append)55- `valueInputOption`: 'USER_ENTERED' (parsed) or 'RAW' (literal)5657**Pitfalls**:58- Mis-cased or non-existent tab names error "Sheet 'X' not found"59- Empty ranges may omit `valueRanges[i].values`; treat missing as empty array60- `GOOGLESHEETS_BATCH_UPDATE` values must be a 2D array (list of lists), even for a single row61- Unbounded ranges like 'A:Z' on sheets with >10,000 rows may cause timeouts; always bound with row limits62- Append follows the detected `tableRange`; use returned `updatedRange` to verify placement6364### 2. Create and Manage Spreadsheets6566**When to use**: User wants to create a new spreadsheet or manage tabs within one6768**Tool sequence**:691. `GOOGLESHEETS_CREATE_GOOGLE_SHEET1` - Create a new spreadsheet [Required]702. `GOOGLESHEETS_ADD_SHEET` - Add a new tab/worksheet [Required]713. `GOOGLESHEETS_UPDATE_SHEET_PROPERTIES` - Rename, hide, reorder, or color tabs [Optional]724. `GOOGLESHEETS_GET_SPREADSHEET_INFO` - Get full spreadsheet metadata [Optional]735. `GOOGLESHEETS_FIND_WORKSHEET_BY_TITLE` - Check if a specific tab exists [Optional]7475**Key parameters**:76- `title`: Spreadsheet or sheet tab name77- `spreadsheetId`: Target spreadsheet ID78- `forceUnique`: Auto-append suffix if tab name exists (default true)79- `properties.gridProperties`: Set row/column counts, frozen rows8081**Pitfalls**:82- Sheet names must be unique within a spreadsheet83- Default sheet names are locale-dependent ('Sheet1' in English, 'Hoja 1' in Spanish)84- Don't use `index` when creating multiple sheets in parallel (causes 'index too high' errors)85- `GOOGLESHEETS_GET_SPREADSHEET_INFO` can return 403 if account lacks access8687### 3. Search and Filter Rows8889**When to use**: User wants to find specific rows or apply filters to sheet data9091**Tool sequence**:921. `GOOGLESHEETS_LOOKUP_SPREADSHEET_ROW` - Find first row matching exact cell value [Required]932. `GOOGLESHEETS_SET_BASIC_FILTER` - Apply filter/sort to a range [Alternative]943. `GOOGLESHEETS_CLEAR_BASIC_FILTER` - Remove existing filter [Optional]954. `GOOGLESHEETS_BATCH_GET` - Read filtered results [Optional]9697**Key parameters**:98- `query`: Exact text value to match (matches entire cell content)99- `range`: A1 notation range to search within100- `case_sensitive`: Boolean for case-sensitive matching (default false)101- `filter.range`: Grid range with sheet_id for basic filter102- `filter.criteria`: Column-based filter conditions103- `filter.sortSpecs`: Sort specifications104105**Pitfalls**:106- `GOOGLESHEETS_LOOKUP_SPREADSHEET_ROW` matches entire cell content, not substrings107- Sheet names with spaces must be single-quoted in ranges (e.g., "'My Sheet'!A:Z")108- Bare sheet names without ranges are not supported for lookup; always specify a range109110### 4. Upsert Rows by Key111112**When to use**: User wants to update existing rows or insert new ones based on a unique key column113114**Tool sequence**:1151. `GOOGLESHEETS_UPSERT_ROWS` - Update matching rows or append new ones [Required]116117**Key parameters**:118- `spreadsheetId`: Target spreadsheet ID119- `sheetName`: Tab name120- `keyColumn`: Column header name used as unique identifier (e.g., 'Email', 'SKU')121- `headers`: List of column names for the data122- `rows`: 2D array of data rows123- `strictMode`: Error on mismatched column counts (default true)124125**Pitfalls**:126- `keyColumn` must be an actual header name, NOT a column letter (e.g., 'Email' not 'A')127- If `headers` is NOT provided, first row of `rows` is treated as headers128- With `strictMode=true`, rows with more values than headers cause an error129- Auto-adds missing columns to the sheet130131### 5. Format Cells132133**When to use**: User wants to apply formatting (bold, colors, font size) to cells134135**Tool sequence**:1361. `GOOGLESHEETS_GET_SPREADSHEET_INFO` - Get numeric sheetId for target tab [Prerequisite]1372. `GOOGLESHEETS_FORMAT_CELL` - Apply formatting to a range [Required]1383. `GOOGLESHEETS_UPDATE_SHEET_PROPERTIES` - Change frozen rows, column widths [Optional]139140**Key parameters**:141- `spreadsheet_id`: Spreadsheet ID142- `worksheet_id`: Numeric sheetId (NOT tab name); get from GET_SPREADSHEET_INFO143- `range`: A1 notation (e.g., 'A1:F1') - preferred over index fields144- `bold`, `italic`, `underline`, `strikethrough`: Boolean formatting options145- `red`, `green`, `blue`: Background color as 0.0-1.0 floats (NOT 0-255 ints)146- `fontSize`: Font size in points147148**Pitfalls**:149- Requires numeric `worksheet_id`, not tab title; get from spreadsheet metadata150- Color channels are 0-1 floats (e.g., 1.0 for full red), NOT 0-255 integers151- Responses may return empty reply objects ([{}]); verify formatting via readback152- Format one range per call; batch formatting requires separate calls153154## Common Patterns155156### ID Resolution157- **Spreadsheet name -> ID**: `GOOGLESHEETS_SEARCH_SPREADSHEETS` with `query`158- **Tab name -> sheetId**: `GOOGLESHEETS_GET_SPREADSHEET_INFO`, extract from sheets metadata159- **Tab existence check**: `GOOGLESHEETS_FIND_WORKSHEET_BY_TITLE`160161### Rate Limits162Google Sheets enforces strict rate limits:163- Max 60 reads/minute and 60 writes/minute164- Exceeding limits causes errors; batch operations where possible165- Use `GOOGLESHEETS_BATCH_GET` and `GOOGLESHEETS_BATCH_UPDATE` for efficiency166167### Data Patterns168- Always read before writing to understand existing layout169- Use `GOOGLESHEETS_UPSERT_ROWS` for CRM syncs, inventory updates, and dedup scenarios170- Append mode (omit `first_cell_location`) is safest for adding new records171- Use `GOOGLESHEETS_CLEAR_VALUES` to clear content while preserving formatting172173## Known Pitfalls174175- **Tab names**: Locale-dependent defaults; 'Sheet1' may not exist in non-English accounts176- **Range notation**: Sheet names with spaces need single quotes in A1 notation177- **Unbounded ranges**: Can timeout on large sheets; always specify row bounds (e.g., 'A1:Z10000')178- **2D arrays**: All value parameters must be list-of-lists, even for single rows179- **Color values**: Floats 0.0-1.0, not integers 0-255180- **Formatting IDs**: `FORMAT_CELL` needs numeric sheetId, not tab title181- **Rate limits**: 60 reads/min and 60 writes/min; batch to stay within limits182- **Delete dimension**: `GOOGLESHEETS_DELETE_DIMENSION` is irreversible; double-check bounds183184## Quick Reference185186| Task | Tool Slug | Key Params |187|------|-----------|------------|188| Search spreadsheets | `GOOGLESHEETS_SEARCH_SPREADSHEETS` | `query`, `search_type` |189| Create spreadsheet | `GOOGLESHEETS_CREATE_GOOGLE_SHEET1` | `title` |190| List tabs | `GOOGLESHEETS_GET_SHEET_NAMES` | `spreadsheet_id` |191| Add tab | `GOOGLESHEETS_ADD_SHEET` | `spreadsheetId`, `title` |192| Read data | `GOOGLESHEETS_BATCH_GET` | `spreadsheet_id`, `ranges` |193| Read single range | `GOOGLESHEETS_VALUES_GET` | `spreadsheet_id`, `range` |194| Write data | `GOOGLESHEETS_BATCH_UPDATE` | `spreadsheet_id`, `sheet_name`, `values` |195| Update range | `GOOGLESHEETS_VALUES_UPDATE` | `spreadsheet_id`, `range`, `values` |196| Append rows | `GOOGLESHEETS_SPREADSHEETS_VALUES_APPEND` | `spreadsheetId`, `range`, `values` |197| Upsert rows | `GOOGLESHEETS_UPSERT_ROWS` | `spreadsheetId`, `sheetName`, `keyColumn`, `rows` |198| Lookup row | `GOOGLESHEETS_LOOKUP_SPREADSHEET_ROW` | `spreadsheet_id`, `query` |199| Format cells | `GOOGLESHEETS_FORMAT_CELL` | `spreadsheet_id`, `worksheet_id`, `range` |200| Set filter | `GOOGLESHEETS_SET_BASIC_FILTER` | `spreadsheetId`, `filter` |201| Clear values | `GOOGLESHEETS_CLEAR_VALUES` | `spreadsheet_id`, range |202| Delete rows/cols | `GOOGLESHEETS_DELETE_DIMENSION` | `spreadsheet_id`, `sheet_name`, dimension |203| Spreadsheet info | `GOOGLESHEETS_GET_SPREADSHEET_INFO` | `spreadsheet_id` |204| Update tab props | `GOOGLESHEETS_UPDATE_SHEET_PROPERTIES` | `spreadsheetId`, properties |205206## When to Use207This skill is applicable to execute the workflow or actions described in the overview.208209## Limitations210- Use this skill only when the task clearly matches the scope described above.211- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.212- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.