Google Sheets
Canonical tools, triggers, auth, schemas, and mock behavior for Google Sheets.
Run a valid google-sheets.append_row call through the same SDK surface used by every toolkit.
Minimal tool call
import { Eyeball } from "@eyeball/sdk";
const eyeball = new Eyeball({
apiKey: process.env.EYEBALL_API_KEY!,
baseUrl: process.env.EYEBALL_EXECUTOR_URL!,
});
const output = await eyeball.tools.run(
"google-sheets.append_row",
{
"documentId": "example_documentId",
"range": "example_range",
"values": []
},
{ userId: "demo_user",
idempotencyKey: "docs:google-sheets.append_row:demo-1" },
);
console.log(output);The model receives canonical output. Your application retains the execution envelope through tools.execute or the execution APIs when it needs IDs, status, versions, and latency.
Supported canonical tools
| Tool | Purpose | Execution | Effect | Version |
|---|---|---|---|---|
google-sheets.append_row | Append one or more ordered value rows at the end of a worksheet range. This adds externally visible spreadsheet data. | sync or async | mutation | 1.0.0 |
google-sheets.get_range | Read values from a rectangular spreadsheet range in row-major order. | sync or async | read | 1.0.0 |
google-sheets.list_rows | List rows or records from a database table, worksheet, or view. Use search_rows when a provider-side filter is required. | sync or async | read | 1.0.0 |
google-sheets.list_tables | List worksheets, tables, collections, or database views in a spreadsheet or database document. | sync or async | read | 1.0.0 |
google-sheets.search_rows | Filter rows using a provider-supported structured expression or free-text query and return normalized records. | sync or async | read | 1.0.0 |
google-sheets.update_range | Write row-major values to a rectangular spreadsheet range. Existing cells in the written area are overwritten. | sync or async | mutation | 1.0.0 |
Only the rows above are implemented. A capability tool omitted by this manifest returns not_supported; eyeball never synthesizes provider parity.
Supported canonical triggers
This manifest does not implement a canonical trigger.
Input and output schemas
google-sheets.append_row
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:append_row:1.0.0:google-sheets",
"type": "object",
"description": "Spreadsheet, A1-style range, and rows to append.",
"additionalProperties": false,
"required": [
"documentId",
"range",
"values"
],
"properties": {
"documentId": {
"type": "string",
"description": "Provider identifier of the database, base, workbook, or equivalent document.",
"minLength": 1
},
"range": {
"type": "string",
"description": "Worksheet range used to locate the append table.",
"minLength": 1
},
"values": {
"type": "array",
"description": "Rows of cell values to append.",
"items": {
"type": "array",
"items": {
"type": [
"null",
"boolean",
"number",
"string"
]
}
}
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:append_row:output:1.0.0:google-sheets",
"type": "object",
"description": "Range and counts written by the append.",
"additionalProperties": false,
"required": [
"documentId",
"updatedRange",
"updatedRows",
"updatedCells"
],
"properties": {
"documentId": {
"type": "string",
"description": "Provider identifier of the database, base, workbook, or equivalent document.",
"minLength": 1
},
"updatedRange": {
"type": "string",
"description": "Range containing the appended values.",
"minLength": 1
},
"updatedRows": {
"type": "integer",
"minimum": 0,
"description": "Rows appended."
},
"updatedCells": {
"type": "integer",
"minimum": 0,
"description": "Cells appended."
}
}
}google-sheets.get_range
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:get_range:1.0.0:google-sheets",
"type": "object",
"description": "Spreadsheet and A1-style range to read.",
"additionalProperties": false,
"required": [
"documentId",
"range"
],
"properties": {
"documentId": {
"type": "string",
"description": "Provider identifier of the database, base, workbook, or equivalent document.",
"minLength": 1
},
"range": {
"type": "string",
"description": "A1-style spreadsheet range.",
"minLength": 1
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:get_range:output:1.0.0:google-sheets",
"type": "object",
"description": "Normalized range and cell values.",
"additionalProperties": false,
"required": [
"range",
"values"
],
"properties": {
"range": {
"type": "string",
"description": "Normalized range returned by the provider.",
"minLength": 1
},
"values": {
"type": "array",
"description": "Cell values in row-major order.",
"items": {
"type": "array",
"items": {
"type": [
"null",
"boolean",
"number",
"string"
]
}
}
}
}
}google-sheets.list_rows
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:list_rows:1.0.0:google-sheets",
"type": "object",
"description": "Row container and pagination selectors.",
"additionalProperties": false,
"required": [
"documentId"
],
"properties": {
"documentId": {
"type": "string",
"description": "Provider identifier of the database, base, workbook, or equivalent document.",
"minLength": 1
},
"tableId": {
"type": "string",
"description": "Table, worksheet, collection, or view identifier when the provider requires one.",
"minLength": 1
},
"pageSize": {
"type": "integer",
"description": "Maximum number of rows to return in one page.",
"minimum": 1,
"maximum": 100,
"default": 50
},
"pageToken": {
"type": "string",
"description": "Opaque continuation token from a previous row page.",
"minLength": 1
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:list_rows:output:1.0.0:google-sheets",
"type": "object",
"description": "One page of normalized rows.",
"additionalProperties": false,
"required": [
"rows"
],
"properties": {
"rows": {
"type": "array",
"description": "Rows in this page.",
"items": {
"type": "object",
"description": "A normalized row or database record.",
"additionalProperties": false,
"required": [
"rowId",
"values"
],
"properties": {
"rowId": {
"type": "string",
"description": "Provider identifier of the row or record.",
"minLength": 1
},
"values": {
"type": "object",
"description": "Field names and values stored on the row.",
"additionalProperties": true
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "Creation timestamp when the provider exposes it."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "Most recent update timestamp when exposed."
}
}
}
},
"nextPageToken": {
"type": "string",
"description": "Opaque token to request the next page of rows; absent when the result is complete.",
"minLength": 1
}
}
}google-sheets.list_tables
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:list_tables:1.0.0:google-sheets",
"type": "object",
"description": "Document and pagination selectors.",
"additionalProperties": false,
"required": [
"documentId"
],
"properties": {
"documentId": {
"type": "string",
"description": "Provider identifier of the database, base, workbook, or equivalent document.",
"minLength": 1
},
"pageSize": {
"type": "integer",
"description": "Maximum number of tables to return in one page.",
"minimum": 1,
"maximum": 100,
"default": 50
},
"pageToken": {
"type": "string",
"description": "Opaque continuation token from a previous table page.",
"minLength": 1
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:list_tables:output:1.0.0:google-sheets",
"type": "object",
"description": "One page of tables, worksheets, collections, or views.",
"additionalProperties": false,
"required": [
"tables"
],
"properties": {
"tables": {
"type": "array",
"description": "Tables available in the selected document.",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"tableId",
"name"
],
"properties": {
"tableId": {
"type": "string",
"description": "Provider identifier of the table or worksheet.",
"minLength": 1
},
"name": {
"type": "string",
"description": "Table or worksheet display name.",
"minLength": 1
},
"index": {
"type": "integer",
"minimum": 0,
"description": "Zero-based display position when exposed."
},
"rowCount": {
"type": "integer",
"minimum": 0,
"description": "Configured or observed row count."
},
"columnCount": {
"type": "integer",
"minimum": 0,
"description": "Configured or observed column count."
}
}
}
},
"nextPageToken": {
"type": "string",
"description": "Opaque token to request the next page of tables; absent when the result is complete.",
"minLength": 1
}
}
}google-sheets.search_rows
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:search_rows:1.0.0:google-sheets",
"type": "object",
"description": "Target container, filter, and pagination selectors.",
"additionalProperties": false,
"required": [
"documentId"
],
"properties": {
"documentId": {
"type": "string",
"description": "Provider identifier of the database, base, workbook, or equivalent document.",
"minLength": 1
},
"tableId": {
"type": "string",
"description": "Table, worksheet, collection, or view identifier when the provider requires one.",
"minLength": 1
},
"query": {
"type": "string",
"description": "Free-text row search query.",
"minLength": 1
},
"filter": {
"type": "object",
"description": "Provider-supported structured filter expression.",
"additionalProperties": true
},
"pageSize": {
"type": "integer",
"description": "Maximum number of matching rows to return in one page.",
"minimum": 1,
"maximum": 100,
"default": 50
},
"pageToken": {
"type": "string",
"description": "Opaque continuation token from a previous matching row page.",
"minLength": 1
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:search_rows:output:1.0.0:google-sheets",
"type": "object",
"description": "One page of rows matching the query.",
"additionalProperties": false,
"required": [
"rows"
],
"properties": {
"rows": {
"type": "array",
"description": "Matching rows.",
"items": {
"type": "object",
"description": "A normalized row or database record.",
"additionalProperties": false,
"required": [
"rowId",
"values"
],
"properties": {
"rowId": {
"type": "string",
"description": "Provider identifier of the row or record.",
"minLength": 1
},
"values": {
"type": "object",
"description": "Field names and values stored on the row.",
"additionalProperties": true
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "Creation timestamp when the provider exposes it."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "Most recent update timestamp when exposed."
}
}
}
},
"nextPageToken": {
"type": "string",
"description": "Opaque token to request the next page of matching rows; absent when the result is complete.",
"minLength": 1
}
}
}google-sheets.update_range
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:update_range:1.0.0:google-sheets",
"type": "object",
"description": "Spreadsheet range and replacement cell values.",
"additionalProperties": false,
"required": [
"documentId",
"range",
"values"
],
"properties": {
"documentId": {
"type": "string",
"description": "Provider identifier of the database, base, workbook, or equivalent document.",
"minLength": 1
},
"range": {
"type": "string",
"description": "A1-style spreadsheet range.",
"minLength": 1
},
"values": {
"type": "array",
"description": "Cell values in row-major order.",
"items": {
"type": "array",
"items": {
"type": [
"null",
"boolean",
"number",
"string"
]
}
}
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:spreadsheets_databases:update_range:output:1.0.0:google-sheets",
"type": "object",
"description": "Range and counts written by the update.",
"additionalProperties": false,
"required": [
"documentId",
"updatedRange",
"updatedRows",
"updatedCells"
],
"properties": {
"documentId": {
"type": "string",
"description": "Provider identifier of the database, base, workbook, or equivalent document.",
"minLength": 1
},
"updatedRange": {
"type": "string",
"description": "Range containing the written values.",
"minLength": 1
},
"updatedRows": {
"type": "integer",
"minimum": 0,
"description": "Rows updated."
},
"updatedCells": {
"type": "integer",
"minimum": 0,
"description": "Cells updated."
}
}
}Authentication
| Property | Value |
|---|---|
| Auth class | oauth2 |
| Required scopes | None |
| Optional scopes | None |
| Credential fields | None |
Credentials are resolved inside the executor by CredentialProvider. They never belong in tool input, x_provider, model context, logs, or execution output.
Provider-specific extensions
This manifest declares no provider-specific schema extensions. Use only canonical fields.
Provider differences may appear only under x_provider.google-sheets and only when the schema above declares them.
Sync and async behavior
All tools are synchronous by nature, but callers may choose mode: "async" to queue them.
Mutations require a stable Idempotency-Key. The TypeScript SDK accepts it as idempotencyKey; it is never part of the JSON request body.
REST example
curl "$EYEBALL_EXECUTOR_URL/v1/execute" \
-H "Authorization: Bearer $EYEBALL_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: docs:google-sheets.append_row:demo-1' \
--data '{"tool":"google-sheets.append_row","userId":"demo_user","input":{"documentId":"example_documentId","range":"example_range","values":[]},"mode":"sync"}'Mock support
Point EYEBALL_EXECUTOR_URL at a mock-configured executor to run through the real catalog, validation, credential seam, adapter, normalized errors, and execution records with no Google Sheets account. Mock selection changes the executor endpoint and trusted provider base-URL configuration, never the execute request.
Limitations
- This page describes the manifest's explicit P0 subset, not every operation offered by the provider.
- Provider account policy, consent UI, quota details, and current wire compatibility still require a real-provider certification pass.
- Fields outside the canonical schemas and declared
x_providerextensions are rejected.
Versions
| Contract | Version |
|---|---|
| Runtime catalog | 1.1 |
| Manifest catalog | 1.0 |
| Manifest schema | 1.0 |
| Source | activepieces-bridge |
| Tier | P0 |
| Capabilities | spreadsheets_databases |
Next
Use Testing with mocks to exercise this toolkit before connecting a live provider account.