Documents

Google Sheets

Try it

Read and write Google Sheets data with managed OAuth authentication through a single API gateway.

What it does

Provides HTTP-based access to Google Sheets for reading values, writing data, appending rows, and performing batch updates. Supports cell formatting, sheet creation, column resizing, sorting, and filtering. Authentication uses a bearer token with managed OAuth connections, so spreadsheet IDs are paired with user-authorized Google accounts. Includes JavaScript and Python examples and supports both RAW and USER_ENTERED value input modes.

When to use it

  • Reading spreadsheet ranges into an application
  • Updating or appending rows to a Google Sheet
  • Applying formatting or adding sheets via batch updates
  • Connecting multiple Google accounts for sheet operations

The skill document

Google Sheets

Access the Google Sheets API with managed OAuth authentication. Read and write spreadsheet values, create sheets, apply formatting, and perform batch operations.

Quick Start

# Read values from a spreadsheet
curl -s -X GET 'https://gateway.maton.ai/google-sheets/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1!A1:D10' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Base URL

https://gateway.maton.ai/google-sheets/v4/spreadsheets/{spreadsheetId}/{endpoint}

The gateway proxies requests to sheets.googleapis.com and automatically injects your OAuth token.

Authentication

All requests require the Maton API key in the Authorization header:

Authorization: Bearer YOUR_API_KEY

Environment Variable: Set your API key as MATON_API_KEY:

export MATON_API_KEY="YOUR_API_KEY"

Getting Your API Key

  1. Sign in at maton.ai
  2. Go to maton.ai/settings
  3. Copy your API key

Connection Management

Manage your Google OAuth connections at https://ctrl.maton.ai.

List Connections

curl -s -X GET 'https://ctrl.maton.ai/connections?app=google-sheets&status=ACTIVE' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Create Connection

curl -s -X POST 'https://ctrl.maton.ai/connections' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{"app": "google-sheets"}'

Get Connection

curl -s -X GET 'https://ctrl.maton.ai/connections/{connection_id}' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Response:

{
  "connection": {
    "connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
    "status": "ACTIVE",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "google-sheets"
  }
}

Open the returned url in a browser to complete OAuth authorization.

Delete Connection

curl -s -X DELETE 'https://ctrl.maton.ai/connections/{connection_id}' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Using Multiple Connections

If you have multiple Google accounts connected, specify which to use:

curl -s -X GET 'https://gateway.maton.ai/google-sheets/v4/spreadsheets/SPREADSHEET_ID' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Maton-Connection: {connection_id}'

API Reference

Get Spreadsheet Metadata

GET /google-sheets/v4/spreadsheets/{spreadsheetId}

Get Values

GET /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}

Example:

GET /google-sheets/v4/spreadsheets/SHEET_ID/values/Sheet1!A1:D10

Get Multiple Ranges

GET /google-sheets/v4/spreadsheets/{spreadsheetId}/values:batchGet?ranges=Sheet1!A1:B10&ranges=Sheet2!A1:C5

Update Values

PUT /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}?valueInputOption=USER_ENTERED
Content-Type: application/json

{
  "values": [
    ["A1", "B1", "C1"],
    ["A2", "B2", "C2"]
  ]
}

Append Values

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"]
  ]
}

Batch Update Values

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"]]}
  ]
}

Clear Values

POST /google-sheets/v4/spreadsheets/{spreadsheetId}/values/{range}:clear

Create Spreadsheet

POST /google-sheets/v4/spreadsheets
Content-Type: application/json

{
  "properties": {"title": "New Spreadsheet"},
  "sheets": [{"properties": {"title": "Sheet1"}}]
}

Batch Update (formatting, add sheets, etc.)

POST /google-sheets/v4/spreadsheets/{spreadsheetId}:batchUpdate
Content-Type: application/json

{
  "requests": [
    {"addSheet": {"properties": {"title": "New Sheet"}}}
  ]
}

Common batchUpdate Requests

Update Cells with Formatting

{
  "updateCells": {
    "rows": [
      {"values": [{"userEnteredValue": {"stringValue": "Name"}}, {"userEnteredValue": {"numberValue": 100}}]}
    ],
    "fields": "userEnteredValue",
    "start": {"sheetId": 0, "rowIndex": 0, "columnIndex": 0}
  }
}

Format Header Row (Bold + Background Color)

{
  "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)"
  }
}

Auto-Resize Columns

{
  "autoResizeDimensions": {
    "dimensions": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 0, "endIndex": 3}
  }
}

Rename Sheet

{
  "updateSheetProperties": {
    "properties": {"sheetId": 0, "title": "NewName"},
    "fields": "title"
  }
}

Insert Rows/Columns

{
  "insertDimension": {
    "range": {"sheetId": 0, "dimension": "ROWS", "startIndex": 1, "endIndex": 3},
    "inheritFromBefore": true
  }
}

Sort Range

{
  "sortRange": {
    "range": {"sheetId": 0, "startRowIndex": 1, "endRowIndex": 10, "startColumnIndex": 0, "endColumnIndex": 3},
    "sortSpecs": [{"dimensionIndex": 1, "sortOrder": "DESCENDING"}]
  }
}

Add Filter

{
  "setBasicFilter": {
    "filter": {
      "range": {"sheetId": 0, "startRowIndex": 0, "endRowIndex": 100, "startColumnIndex": 0, "endColumnIndex": 5}
    }
  }
}

Delete Sheet

{
  "deleteSheet": {"sheetId": 123456789}
}

Value Input Options

  • RAW - Values are stored as-is
  • USER_ENTERED - Values are parsed as if typed into the UI (formulas executed, numbers parsed)

Range Notation

  • Sheet1!A1:D10 - Specific range
  • Sheet1!A:D - Entire columns A through D
  • Sheet1!1:10 - Entire rows 1 through 10
  • Sheet1 - Entire sheet
  • A1:D10 - Range in first sheet

Code Examples

JavaScript

// Read values
const response = await fetch(
  'https://gateway.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://gateway.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']]
    })
  }
);

Python

import os
import requests

# Read values
response = requests.get(
    'https://gateway.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://gateway.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']]}
)

Notes

  • Range in URL path must be URL-encoded (!%21, :%3A)
  • Use valueInputOption=USER_ENTERED to parse formulas and numbers
  • Delete spreadsheets via the Google Drive API, not Sheets API
  • Sheet IDs are numeric and found in the spreadsheet metadata

Error Handling

StatusMeaning
400Missing Google Sheets connection
401Invalid or missing Maton API key
429Rate limited (10 req/sec per account)
4xx/5xxPassthrough error from Google Sheets API

Resources

Questions people ask

How does authentication work?
Requests use a bearer token (MATON_API_KEY) sent in the Authorization header. The gateway proxies calls to sheets.googleapis.com and injects the OAuth token for the connected Google account.
Can I delete a spreadsheet through this skill?
No. The documentation states that spreadsheets must be deleted through the Google Drive API, not the Sheets API.
What rate limits apply?
The gateway enforces a limit of 10 requests per second per account; higher loads receive HTTP 429 responses.

Related skills

Use this skill when you need to create, inspect, update, append to, or reorganize Google Sheets from a locally installed `gog` CLI. It is for local Google ac...

24 installs

Google Docs Connector: Google Docs: create, edit, format documents. Tables, images, headers, page breaks. Export to PDF/DOCX/HTML. Share and manage permissions. Use when an agent needs google docs connector, document automation, report generation, template creation, collaborative editing, batch update, document id, requests through AgentPMT-hosted remote tool calls. Discovery terms: google docs connector, document automation, report generation, template creation, collaborative editing.

1 installs

Connect agents to Google Drive through managed OAuth for file and folder operations.

by byungkyu

Create and manage Google Slides presentations via the Slides API through a managed OAuth proxy.

by byungkyu1 installs

Design Gmail, Drive, Sheets, and Calendar automations with scope-aware plans. Use for repeatable daily task automation with explicit OAuth scopes and audit-r...

56 installs1 stars

Plaud Recordings to Google Drive Sync: Automatically backs up your Plaud recordings to Google Drive and keeps a tracking spreadsheet in Google Sheets. Each time you run this workflow, it downloads any new recordings from your Plaud account to a "Plaud Recordings" folder in Drive, creates a transcript for each recording (using Plaud's built-in transcripts when available, or automatic speech-to-text otherwise), saves the transcript alongside the audio file, identifies what each recording is about.

More from byungkyu

Browse all skills

Send SMS, place voice calls, and manage Twilio phone resources through an OAuth-authenticated proxy.

by byungkyu173 installs8 stars

Connect agents to Google Drive through managed OAuth for file and folder operations.

by byungkyu

Manage Google Meet spaces, records, participants, recordings, and transcripts with managed OAuth.

by byungkyu

Read, send, and manage Outlook mail, folders, calendar events, and contacts through Microsoft Graph with managed OAuth.

by byungkyu

Create and manage Google Slides presentations via the Slides API through a managed OAuth proxy.

by byungkyu1 installs

Route calls to third-party APIs through a managed gateway without handling OAuth or API keys yourself.

by byungkyu