google-sheets
SkillFiles & storageGoogle Sheets API integration with managed OAuth. Read and write spreadsheet data, create sheets, apply formatting, and manage ranges. Use this skill when users want to read from or write to Google Sheets. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the google-sheets skill
What this skill tells your AI
The instructions your AI receives, as published by craftos-dev/craftbot in skills/google-sheets/SKILL.md and read by ahel’s review.
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]}'
Read / append / update values
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'
Create a spreadsheet / add a tab
# 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'
Gotchas
- A1 notation:
Sheet1!A1:D20; quote tab names with spaces as'My Tab'!A1. valueInputOption=RAWstores strings as-is;USER_ENTEREDinterprets them like the UI (numbers, dates,=FORMULA). Pick deliberately.valuesis row-major ([[row1...],[row2...]]); a missing trailing cell just comes back short — don't assume rectangular.
Signals
- GitHub stars
- 382
- Forks
- 45
- Last commit
- Sep 2026
ahel review
S4info
community integration — published by craftos-dev, not google
Automated review, not a security audit. Ruleset v1.
Advanced
- Catalog kind
- skill
- Gateway key
google-sheets- Source
- github.com/craftos-dev/craftbot