From acedatacloud-content
Reads and edits Google Sheets via the Sheets v4 REST API using curl and jq. Supports reading ranges, appending/updating rows, creating spreadsheets, and adding tabs.
How this skill is triggered — by the user, by Claude, or both
Slash command
/acedatacloud-content:google-sheetsWhen to use
Trigger when the user wants to read a range from a Sheet, append or update rows, add a tab, or create a spreadsheet. The connector grants `spreadsheets.readonly` by default; the user opts in to the broader `spreadsheets` scope (read + write) at install — confirm before writes. Find the spreadsheet id from a Drive URL or a google-drive search.
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Drive **Google Sheets** via `curl + jq`. The user's OAuth bearer token is in
Drive Google Sheets via curl + jq. The user's OAuth bearer token is in
$GOOGLE_SHEETS_TOKEN; every call needs Authorization: Bearer $GOOGLE_SHEETS_TOKEN. Base URL: https://sheets.googleapis.com/v4/spreadsheets.
The token carries spreadsheets.readonly (+ identity); writes need the broader
spreadsheets scope.
Failures are {"error":{"code","message","status"}} — show verbatim. 401 =
re-install. 403 PERMISSION_DENIED on a write = read-only scope → re-connect
with read+write.
The spreadsheet id is the …/spreadsheets/d/<ID>/edit segment of the URL.
S="https://sheets.googleapis.com/v4/spreadsheets"; AUTH="Authorization: Bearer $GOOGLE_SHEETS_TOKEN"
# Tabs + title
curl -sS -H "$AUTH" "$S/SPREADSHEET_ID?fields=properties.title,sheets.properties(title,sheetId)" \
| jq '{title: .properties.title, tabs: [.sheets[].properties.title]}'
ID="SPREADSHEET_ID"
# Read a range (A1 notation; values are rows of cells)
curl -sS -H "$AUTH" "$S/$ID/values/Sheet1!A1:D20" | jq '.values'
# Append rows (confirm first). valueInputOption=USER_ENTERED parses formulas/dates.
curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json" \
-d '{"values":[["2026-06-21","Acme",4200]]}' \
"$S/$ID/values/Sheet1!A1:append?valueInputOption=USER_ENTERED" | jq '.updates'
# Update a fixed range: PUT /values/{range}?valueInputOption=USER_ENTERED
curl -sS -X PUT -H "$AUTH" -H "Content-Type: application/json" \
-d '{"values":[["done"]]}' \
"$S/$ID/values/Sheet1!E2?valueInputOption=USER_ENTERED" | jq '.updatedCells'
# New spreadsheet
curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json" \
-d '{"properties":{"title":"Report 2026"}}' "$S" | jq '{spreadsheetId, spreadsheetUrl}'
# Add a tab via batchUpdate (addSheet request)
curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json" \
-d '{"requests":[{"addSheet":{"properties":{"title":"Q3"}}}]}' \
"$S/$ID:batchUpdate" | jq '.replies'
Sheet1!A1:D20; quote tab names with spaces as 'My Tab'!A1.valueInputOption=RAW stores strings as-is; USER_ENTERED interprets them like
the UI (numbers, dates, =FORMULA). Pick deliberately.values is row-major ([[row1...],[row2...]]); a missing trailing cell just
comes back short — don't assume rectangular.npx claudepluginhub acedatacloud/skills --plugin acedatacloud-contentReads and writes Google Sheets spreadsheets via Python scripts. Supports OAuth, range queries, appending rows, and metadata retrieval. Useful for automating spreadsheet data tasks.
Provides gws CLI for Google Sheets API: read/append values, create/get spreadsheets, batch updates. For scripting data ops.
Reads, writes, and manages Google Sheets data via CLI scripts with standalone OAuth authentication.