Access the Google Sheets API with managed OAuth authentication. Read and write spreadsheet values, create sheets, apply formatting, and perform batch operations.
CLI:
maton google-sheets values get <spreadsheetId> --range 'Sheet1!A1:D10'
maton api '/google-sheets/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1%21A1%3AD10'
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-sheets/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1%21A1%3AD10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/google-sheets/{native-api-path}
Maton proxies requests to sheets.googleapis.com and automatically injects your OAuth token.
NPM:
npm install -g @maton-ai/cli
Homebrew:
brew install maton-ai/cli/maton
CLI:
maton login # Opens browser for API key
maton login --interactive # Skip browser, paste API key directly
maton whoami # Show current auth state
Manual:
MATON_API_KEY:export MATON_API_KEY="YOUR_API_KEY"
Manage your Google OAuth connections at https://api.maton.ai.
CLI:
maton connection list google-sheets --status ACTIVE
maton api -X GET /connections -f app=google-sheets -f status=ACTIVE
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=google-sheets&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
CLI:
maton connection create google-sheets
maton api /connections -f app=google-sheets
Python:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'google-sheets'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
CLI:
maton connection view {connection_id}
maton api /connections/{connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "google-sheets",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
CLI:
maton connection delete {connection_id}
maton api -X DELETE /connections/{connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Google accounts connected, specify which one to use:
CLI:
maton google-sheets spreadsheet view <spreadsheetId> --connection {connection_id}
maton api /google-sheets/v4/spreadsheets/SPREADSHEET_ID --connection {connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-sheets/v4/spreadsheets/SPREADSHEET_ID')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always specify the connection to ensure requests go to the intended account.
GET /google-sheets/v4/spreadsheets/{spreadsheetId}
Example:
maton google-sheets spreadsheet view <spreadsheetId>
GET /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}
Example:
maton google-sheets values get <spreadsheetId> --range 'Sheet1!A1:D10'
GET /google-sheets/v4/spreadsheets/{spreadsheetId}/values:batchGet?ranges=Sheet1%21A1%3AB10&ranges=Sheet2%21A1%3AC5
Example:
maton google-sheets values batch-get <spreadsheetId> --range 'Sheet1!A1:B10,Sheet2!A1:C5'
PUT /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}?valueInputOption=USER_ENTERED
Content-Type: application/json
{
"values": [
["A1", "B1", "C1"],
["A2", "B2", "C2"]
]
}
Example:
maton google-sheets values update <spreadsheetId> --range 'Sheet1!A1:C2' --json-values '[["A1","B1","C1"],["A2","B2","C2"]]'
POST /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}:append?valueInputOption=USER_ENTERED
Content-Type: application/json
{
"values": [
["New Row 1", "Data", "More Data"],
["New Row 2", "Data", "More Data"]
]
}
Example:
maton google-sheets values append <spreadsheetId> --range 'Sheet1!A1' --json-values '[["New Row 1","Data","More Data"],["New Row 2","Data","More Data"]]'
POST /google-sheets/v4/spreadsheets/{spreadsheetId}/values:batchUpdate
Content-Type: application/json
{
"valueInputOption": "USER_ENTERED",
"data": [
{"range": "Sheet1!A1:B2", "values": [["A1", "B1"], ["A2", "B2"]]},
{"range": "Sheet1!D1:E2", "values": [["D1", "E1"], ["D2", "E2"]]}
]
}
Example:
maton google-sheets values batch-update <spreadsheetId> --data '[{"range":"Sheet1!A1:B2","values":[["A1","B1"],["A2","B2"]]},{"range":"Sheet1!D1:E2","values":[["D1","E1"],["D2","E2"]]}]'
POST /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}:clear
Example:
maton google-sheets values clear <spreadsheetId> --range 'Sheet1!A1:D10'
POST /google-sheets/v4/spreadsheets
Content-Type: application/json
{
"properties": {"title": "New Spreadsheet"},
"sheets": [{"properties": {"title": "Sheet1"}}]
}
Example:
maton google-sheets spreadsheet create --title 'New Spreadsheet' --sheet-title 'Sheet1'
POST /google-sheets/v4/spreadsheets/{spreadsheetId}:batchUpdate
Content-Type: application/json
{
"requests": [
{"addSheet": {"properties": {"title": "New Sheet"}}}
]
}
Example:
maton google-sheets spreadsheet batch-update <spreadsheetId> --requests '[{"addSheet":{"properties":{"title":"New Sheet"}}}]'
{
"updateCells": {
"rows": [
{"values": [{"userEnteredValue": {"stringValue": "Name"}}, {"userEnteredValue": {"numberValue": 100}}]}
],
"fields": "userEnteredValue",
"start": {"sheetId": 0, "rowIndex": 0, "columnIndex": 0}
}
}
{
"repeatCell": {
"range": {"sheetId": 0, "startRowIndex": 0, "endRowIndex": 1, "startColumnIndex": 0, "endColumnIndex": 3},
"cell": {
"userEnteredFormat": {
"backgroundColor": {"red": 0.2, "green": 0.6, "blue": 0.9},
"textFormat": {"bold": true}
}
},
"fields": "userEnteredFormat(backgroundColor,textFormat)"
}
}
{
"autoResizeDimensions": {
"dimensions": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 0, "endIndex": 3}
}
}
{
"updateSheetProperties": {
"properties": {"sheetId": 0, "title": "NewName"},
"fields": "title"
}
}
{
"insertDimension": {
"range": {"sheetId": 0, "dimension": "ROWS", "startIndex": 1, "endIndex": 3},
"inheritFromBefore": true
}
}
{
"sortRange": {
"range": {"sheetId": 0, "startRowIndex": 1, "endRowIndex": 10, "startColumnIndex": 0, "endColumnIndex": 3},
"sortSpecs": [{"dimensionIndex": 1, "sortOrder": "DESCENDING"}]
}
}
{
"setBasicFilter": {
"filter": {
"range": {"sheetId": 0, "startRowIndex": 0, "endRowIndex": 100, "startColumnIndex": 0, "endColumnIndex": 5}
}
}
}
{
"deleteSheet": {"sheetId": 123456789}
}
RAW - Values are stored as-isUSER_ENTERED - Values are parsed as if typed into the UI (formulas executed, numbers parsed)Sheet1!A1:D10 - Specific rangeSheet1!A:D - Entire columns A through DSheet1!1:10 - Entire rows 1 through 10Sheet1 - Entire sheetA1:D10 - Range in first sheet# Read values from a spreadsheet
maton google-sheets values get <spreadsheetId> --range 'Sheet1!A1:B10'
# Filter with jq — e.g., extract just the values array
maton google-sheets values get <spreadsheetId> --range 'Sheet1!A1:B10' --json --jq '.values'
# Append a row
maton google-sheets values append <spreadsheetId> --range A1 --values 'Alice,100,true'
// Read values
const response = await fetch(
'https://api.maton.ai/google-sheets/v4/spreadsheets/SHEET_ID/values/Sheet1!A1:D10',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
// Write values
await fetch(
'https://api.maton.ai/google-sheets/v4/spreadsheets/SHEET_ID/values/Sheet1!A1:B2?valueInputOption=USER_ENTERED',
{
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
},
body: JSON.stringify({
values: [['A1', 'B1'], ['A2', 'B2']]
})
}
);
import os
import requests
# Read values
response = requests.get(
'https://api.maton.ai/google-sheets/v4/spreadsheets/SHEET_ID/values/Sheet1!A1:D10',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
# Write values
response = requests.put(
'https://api.maton.ai/google-sheets/v4/spreadsheets/SHEET_ID/values/Sheet1!A1:B2',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'valueInputOption': 'USER_ENTERED'},
json={'values': [['A1', 'B1'], ['A2', 'B2']]}
)
valueInputOption=USER_ENTERED to parse formulas and numberscurl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.| Status | Meaning |
|---|---|
| -------- | --------- |
| 400 | Missing Google Sheets connection |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Google Sheets API |
CLI:
maton whoami
maton connection list
Manual:
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
google-sheets. For example:https://api.maton.ai/google-sheets/v4/spreadsheets/SPREADSHEET_IDhttps://api.maton.ai/v4/spreadsheets/SPREADSHEET_ID共 3 个版本