productivity
Google Sheets Lua API for KosmoKrator Agents
Agent-facing Lua documentation and function reference for the Google Sheets KosmoKrator integration.Lua Namespace
Agents call this integration through app.integrations.google_sheets.*.
Use lua_read_doc("integrations.google-sheets") inside KosmoKrator to discover the same reference at runtime.
Call Lua from the Headless CLI
Use kosmo integrations:lua when a shell script, CI job, cron job, or another coding CLI should run a deterministic
Google Sheets workflow without starting an interactive agent session.
kosmo integrations:lua --eval 'dump(app.integrations.google_sheets.add_filter({spreadsheet_id = "example_spreadsheet_id", range = "example_range"}))' --json kosmo integrations:lua --eval 'print(docs.read("google-sheets"))' --json
kosmo integrations:lua --eval 'print(docs.read("google-sheets.add_filter"))' --json Workflow file
Put repeatable logic in a Lua file, then execute it with JSON output for the calling process.
local google_sheets = app.integrations.google_sheets
local result = google_sheets.add_filter({spreadsheet_id = "example_spreadsheet_id", range = "example_range"})
dump(result) kosmo integrations:lua workflow.lua --json
kosmo integrations:lua workflow.lua --force --json integrations:lua exposes app.integrations.google_sheets, app.mcp.*, docs.*, json.*, and regex.*. Use app.integrations.google_sheets.default.* or app.integrations.google_sheets.work.* when you configured named credential accounts.
MCP-only Lua
If the script only needs configured MCP servers and does not need Google Sheets, use the narrower mcp:lua command.
# Use mcp:lua for MCP-only scripts; use integrations:lua for this integration namespace.
kosmo mcp:lua --eval 'dump(mcp.servers())' --json Agent-Facing Lua Docs
This is the rendered version of the full Lua documentation exposed to agents when they inspect the integration namespace.
Google Integration — Lua API Supplement
Google services are registered as separate namespaces: integrations.gmail, integrations["google-sheets"], integrations["google-calendar"], integrations["google-drive"], etc. All share the same OAuth credentials.
Gmail
Send email with CC/BCC:
app.integrations.gmail.gmail_send_email({
to = "alice@example.com",
subject = "Q1 Report",
body = "Please find the report attached.",
cc = "bob@example.com, carol@example.com",
bcc = "manager@example.com",
})
Search, read, then reply workflow:
-- Step 1: Search for messages
local results = app.integrations.gmail.gmail_search_emails({
query = "from:alice subject:meeting is:unread",
max_results = 5,
})
-- Step 2: Read the full message
local msg = app.integrations.gmail.gmail_read({ message_id = results.messages[1].id })
-- Step 3: Reply in the same thread
app.integrations.gmail.gmail_reply({
message_id = msg.id,
thread_id = msg.threadId,
body = "Thanks, I'll be there.",
cc = "team@example.com",
})
Draft vs direct send — use create_draft to stage an email without sending, then send_draft to send it later:
-- Create a draft (not sent)
local draft = app.integrations.gmail.gmail_create_draft({
to = "client@example.com",
subject = "Proposal",
body = "Draft content here...",
})
-- Send it later using the draft ID
app.integrations.gmail.gmail_send_draft({ draft_id = draft.draftId })
Google Sheets
Values use 2D Lua tables — each inner table is one row:
local values = {
{"Name", "Age", "City"},
{"Alice", 30, "NYC"},
{"Bob", 25, "LA"},
}
A1 notation examples:
"Sheet1!A1:D10"— specific range"Sheet1!A:A"— entire column"Sheet1"— entire sheet"'My Sheet'!A1:B2"— sheet names with spaces need quotes
Input modes: "user_entered" (default) parses formulas and dates, "raw" stores literal strings.
Create a spreadsheet, add a sheet, write data:
-- Create a new spreadsheet
local ss = app.integrations["google-sheets"].google_sheets_create({ title = "Q1 Sales" })
local id = ss.spreadsheetId
-- Add a second sheet/tab
app.integrations["google-sheets"].google_sheets_add_sheet({
spreadsheet_id = id,
title = "By Region",
})
-- Write data with headers
app.integrations["google-sheets"].google_sheets_write_range({
spreadsheet_id = id,
range = "Sheet1!A1:C3",
values = {
{"Region", "Revenue", "Growth"},
{"North", 50000, "=B2/50000-1"},
{"South", 42000, "=B3/42000-1"},
},
input = "user_entered", -- parses the formulas
})
Read data back:
local data = app.integrations["google-sheets"].google_sheets_read_range({
spreadsheet_id = id,
range = "Sheet1!A1:C3",
render = "formatted", -- "formatted" (default), "unformatted", or "formula"
})
-- data.values is a 2D table: {{"Region","Revenue","Growth"}, {"North","50000","0%"}, ...}
Append vs write — append_rows auto-detects the last row and adds below it:
app.integrations["google-sheets"].google_sheets_append({
spreadsheet_id = id,
range = "Sheet1",
values = {
{"East", 38000, "=B4/38000-1"},
},
input = "user_entered",
})
Google Calendar
Create a timed event with attendees:
app.integrations["google-calendar"].google_calendar_create_event({
summary = "Sprint Planning",
description = "Bi-weekly sprint planning session",
location = "Conference Room B",
start_date_time = "2026-04-01T10:00:00-05:00",
end_date_time = "2026-04-01T11:00:00-05:00",
time_zone = "America/New_York",
attendees = "alice@example.com, bob@example.com",
recurrence = "RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=10",
})
Create an all-day event:
app.integrations["google-calendar"].google_calendar_create_event({
summary = "Company Holiday",
start_date = "2026-07-04",
end_date = "2026-07-05",
})
Date/time format: ISO 8601 with timezone offset for timed events (2026-04-01T10:00:00-05:00), plain YYYY-MM-DD for all-day events. Use time_zone for IANA names like "America/New_York".
Google Drive
Search for files, then get details:
-- Search by name and type
local results = app.integrations["google-drive"].google_drive_search_files({
query = "name contains 'report' and mimeType = 'application/vnd.google-apps.spreadsheet'",
max_results = 10,
order_by = "modifiedTime desc",
})
-- Get full file info (and optionally export content)
local file = app.integrations["google-drive"].google_drive_get_file({
file_id = results.files[1].id,
export_as = "csv", -- "text", "csv", or "markdown" (Google Workspace files only)
})
Common Drive query patterns:
"name contains 'budget'"— by name"mimeType = 'application/vnd.google-apps.spreadsheet'"— Sheets"mimeType = 'application/vnd.google-apps.document'"— Docs"mimeType = 'application/vnd.google-apps.folder'"— folders"modifiedTime > '2026-01-01'"— recently modified"sharedWithMe = true"— shared files"'FOLDER_ID' in parents"— files in a folder
Share a file:
-- Share with a specific user
app.integrations["google-drive"].google_drive_share_file({
file_id = "abc123",
role = "writer", -- "reader", "writer", or "commenter"
email = "alice@example.com",
notify = "true",
})
-- Share with anyone via link
app.integrations["google-drive"].google_drive_share_file({
file_id = "abc123",
role = "reader",
type = "anyone",
})
Google Analytics
The GA4 namespace is app.integrations["google-analytics"]. Start with property discovery, then run metadata or report tools against the numeric property ID.
local properties = app.integrations["google-analytics"].google_analytics_list_properties({})
Run a standard report:
local report = app.integrations["google-analytics"].google_analytics_report({
property_id = "123456789",
metrics = {"sessions", "totalUsers"},
dimensions = {"sessionDefaultChannelGroup"},
start_date = "28daysAgo",
end_date = "yesterday",
order_by = "sessions",
order_direction = "desc",
limit = 20,
})
Check compatibility before combining unfamiliar dimensions and metrics:
local compatibility = app.integrations["google-analytics"].google_analytics_check_compatibility({
property_id = "123456789",
metrics = {"sessions"},
dimensions = {"country", "deviceCategory"},
})
Run pivot and batch reports when you need the exact Google Analytics Data API response shape:
local pivot = app.integrations["google-analytics"].google_analytics_pivot_report({
property_id = "123456789",
metrics = {"sessions"},
dimensions = {"country", "deviceCategory"},
pivots = {
{ fieldNames = {"country"}, limit = 10 },
{ fieldNames = {"deviceCategory"}, limit = 5 },
},
})
local batch = app.integrations["google-analytics"].google_analytics_batch_run_reports({
property_id = "123456789",
requests = {
{
metrics = {{ name = "sessions" }},
dimensions = {{ name = "country" }},
dateRanges = {{ startDate = "7daysAgo", endDate = "yesterday" }},
},
},
})
Tips
- All Google APIs share the same OAuth token — if Gmail is connected, the same credentials work for Sheets, Drive, Calendar, etc.
- Use
input = "user_entered"when writing Sheets data that contains formulas (e.g.,"=SUM(A1:A10)") or dates. Use"raw"for literal strings. - Sheet names with spaces must be quoted in A1 notation:
"'My Sheet'!A1:B2". append_rowsis better thanwrite_rangewhen adding rows to an existing table — it auto-detects where the data ends.- Calendar event times use ISO 8601 with timezone offset. Always include the offset or set
time_zoneexplicitly. - Drive search excludes trashed files by default.
Multi-Account Usage
If you have multiple Google service accounts configured, use account-specific namespaces:
-- Default account (always works)
app.integrations["google-sheets"].function_name({...})
-- Explicit default (portable across setups)
app.integrations["google-sheets"].default.function_name({...})
-- Named accounts
app.integrations["google-sheets"].work.function_name({...})
app.integrations["google-sheets"].personal.function_name({...})
All functions are identical across accounts — only the credentials differ.
Raw agent markdown
# Google Integration — Lua API Supplement
Google services are registered as separate namespaces: `integrations.gmail`, `integrations["google-sheets"]`, `integrations["google-calendar"]`, `integrations["google-drive"]`, etc. All share the same OAuth credentials.
## Gmail
Send email with CC/BCC:
```lua
app.integrations.gmail.gmail_send_email({
to = "alice@example.com",
subject = "Q1 Report",
body = "Please find the report attached.",
cc = "bob@example.com, carol@example.com",
bcc = "manager@example.com",
})
```
Search, read, then reply workflow:
```lua
-- Step 1: Search for messages
local results = app.integrations.gmail.gmail_search_emails({
query = "from:alice subject:meeting is:unread",
max_results = 5,
})
-- Step 2: Read the full message
local msg = app.integrations.gmail.gmail_read({ message_id = results.messages[1].id })
-- Step 3: Reply in the same thread
app.integrations.gmail.gmail_reply({
message_id = msg.id,
thread_id = msg.threadId,
body = "Thanks, I'll be there.",
cc = "team@example.com",
})
```
Draft vs direct send -- use `create_draft` to stage an email without sending, then `send_draft` to send it later:
```lua
-- Create a draft (not sent)
local draft = app.integrations.gmail.gmail_create_draft({
to = "client@example.com",
subject = "Proposal",
body = "Draft content here...",
})
-- Send it later using the draft ID
app.integrations.gmail.gmail_send_draft({ draft_id = draft.draftId })
```
## Google Sheets
Values use 2D Lua tables -- each inner table is one row:
```lua
local values = {
{"Name", "Age", "City"},
{"Alice", 30, "NYC"},
{"Bob", 25, "LA"},
}
```
A1 notation examples:
- `"Sheet1!A1:D10"` -- specific range
- `"Sheet1!A:A"` -- entire column
- `"Sheet1"` -- entire sheet
- `"'My Sheet'!A1:B2"` -- sheet names with spaces need quotes
Input modes: `"user_entered"` (default) parses formulas and dates, `"raw"` stores literal strings.
Create a spreadsheet, add a sheet, write data:
```lua
-- Create a new spreadsheet
local ss = app.integrations["google-sheets"].google_sheets_create({ title = "Q1 Sales" })
local id = ss.spreadsheetId
-- Add a second sheet/tab
app.integrations["google-sheets"].google_sheets_add_sheet({
spreadsheet_id = id,
title = "By Region",
})
-- Write data with headers
app.integrations["google-sheets"].google_sheets_write_range({
spreadsheet_id = id,
range = "Sheet1!A1:C3",
values = {
{"Region", "Revenue", "Growth"},
{"North", 50000, "=B2/50000-1"},
{"South", 42000, "=B3/42000-1"},
},
input = "user_entered", -- parses the formulas
})
```
Read data back:
```lua
local data = app.integrations["google-sheets"].google_sheets_read_range({
spreadsheet_id = id,
range = "Sheet1!A1:C3",
render = "formatted", -- "formatted" (default), "unformatted", or "formula"
})
-- data.values is a 2D table: {{"Region","Revenue","Growth"}, {"North","50000","0%"}, ...}
```
Append vs write -- `append_rows` auto-detects the last row and adds below it:
```lua
app.integrations["google-sheets"].google_sheets_append({
spreadsheet_id = id,
range = "Sheet1",
values = {
{"East", 38000, "=B4/38000-1"},
},
input = "user_entered",
})
```
## Google Calendar
Create a timed event with attendees:
```lua
app.integrations["google-calendar"].google_calendar_create_event({
summary = "Sprint Planning",
description = "Bi-weekly sprint planning session",
location = "Conference Room B",
start_date_time = "2026-04-01T10:00:00-05:00",
end_date_time = "2026-04-01T11:00:00-05:00",
time_zone = "America/New_York",
attendees = "alice@example.com, bob@example.com",
recurrence = "RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=10",
})
```
Create an all-day event:
```lua
app.integrations["google-calendar"].google_calendar_create_event({
summary = "Company Holiday",
start_date = "2026-07-04",
end_date = "2026-07-05",
})
```
Date/time format: ISO 8601 with timezone offset for timed events (`2026-04-01T10:00:00-05:00`), plain `YYYY-MM-DD` for all-day events. Use `time_zone` for IANA names like `"America/New_York"`.
## Google Drive
Search for files, then get details:
```lua
-- Search by name and type
local results = app.integrations["google-drive"].google_drive_search_files({
query = "name contains 'report' and mimeType = 'application/vnd.google-apps.spreadsheet'",
max_results = 10,
order_by = "modifiedTime desc",
})
-- Get full file info (and optionally export content)
local file = app.integrations["google-drive"].google_drive_get_file({
file_id = results.files[1].id,
export_as = "csv", -- "text", "csv", or "markdown" (Google Workspace files only)
})
```
Common Drive query patterns:
- `"name contains 'budget'"` -- by name
- `"mimeType = 'application/vnd.google-apps.spreadsheet'"` -- Sheets
- `"mimeType = 'application/vnd.google-apps.document'"` -- Docs
- `"mimeType = 'application/vnd.google-apps.folder'"` -- folders
- `"modifiedTime > '2026-01-01'"` -- recently modified
- `"sharedWithMe = true"` -- shared files
- `"'FOLDER_ID' in parents"` -- files in a folder
Share a file:
```lua
-- Share with a specific user
app.integrations["google-drive"].google_drive_share_file({
file_id = "abc123",
role = "writer", -- "reader", "writer", or "commenter"
email = "alice@example.com",
notify = "true",
})
-- Share with anyone via link
app.integrations["google-drive"].google_drive_share_file({
file_id = "abc123",
role = "reader",
type = "anyone",
})
```
## Google Analytics
The GA4 namespace is `app.integrations["google-analytics"]`. Start with property discovery, then run metadata or report tools against the numeric property ID.
```lua
local properties = app.integrations["google-analytics"].google_analytics_list_properties({})
```
Run a standard report:
```lua
local report = app.integrations["google-analytics"].google_analytics_report({
property_id = "123456789",
metrics = {"sessions", "totalUsers"},
dimensions = {"sessionDefaultChannelGroup"},
start_date = "28daysAgo",
end_date = "yesterday",
order_by = "sessions",
order_direction = "desc",
limit = 20,
})
```
Check compatibility before combining unfamiliar dimensions and metrics:
```lua
local compatibility = app.integrations["google-analytics"].google_analytics_check_compatibility({
property_id = "123456789",
metrics = {"sessions"},
dimensions = {"country", "deviceCategory"},
})
```
Run pivot and batch reports when you need the exact Google Analytics Data API response shape:
```lua
local pivot = app.integrations["google-analytics"].google_analytics_pivot_report({
property_id = "123456789",
metrics = {"sessions"},
dimensions = {"country", "deviceCategory"},
pivots = {
{ fieldNames = {"country"}, limit = 10 },
{ fieldNames = {"deviceCategory"}, limit = 5 },
},
})
local batch = app.integrations["google-analytics"].google_analytics_batch_run_reports({
property_id = "123456789",
requests = {
{
metrics = {{ name = "sessions" }},
dimensions = {{ name = "country" }},
dateRanges = {{ startDate = "7daysAgo", endDate = "yesterday" }},
},
},
})
```
## Tips
- All Google APIs share the same OAuth token -- if Gmail is connected, the same credentials work for Sheets, Drive, Calendar, etc.
- Use `input = "user_entered"` when writing Sheets data that contains formulas (e.g., `"=SUM(A1:A10)"`) or dates. Use `"raw"` for literal strings.
- Sheet names with spaces must be quoted in A1 notation: `"'My Sheet'!A1:B2"`.
- `append_rows` is better than `write_range` when adding rows to an existing table -- it auto-detects where the data ends.
- Calendar event times use ISO 8601 with timezone offset. Always include the offset or set `time_zone` explicitly.
- Drive search excludes trashed files by default.
---
## Multi-Account Usage
If you have multiple Google service accounts configured, use account-specific namespaces:
```lua
-- Default account (always works)
app.integrations["google-sheets"].function_name({...})
-- Explicit default (portable across setups)
app.integrations["google-sheets"].default.function_name({...})
-- Named accounts
app.integrations["google-sheets"].work.function_name({...})
app.integrations["google-sheets"].personal.function_name({...})
```
All functions are identical across accounts — only the credentials differ. local result = app.integrations.google_sheets.add_filter({spreadsheet_id = "example_spreadsheet_id", range = "example_range"})
print(result) Functions
add_filter Write
Apply filter dropdowns to a range in a Google Sheets sheet/tab.
- Lua path
app.integrations.google_sheets.add_filter- Full name
google-sheets.google_sheets_add_filter
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
range | string | yes | A1 notation range including header row (e.g., "Sheet1!A1:D10"). |
add Write
Add a new sheet/tab to a Google Spreadsheet.
- Lua path
app.integrations.google_sheets.add- Full name
google-sheets.google_sheets_add_sheet
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
title | string | yes | Name for the new sheet/tab. |
append Read
Append rows after the last data row in a Google Spreadsheet. Auto-detects the table boundary. Provide the range (e.g., "Sheet1" or "Sheet1!A:D") and a 2D array of rows to append.
- Lua path
app.integrations.google_sheets.append- Full name
google-sheets.google_sheets_append
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
range | string | yes | A1 notation range (e.g., "Sheet1" or "Sheet1!A:D"). |
values | array | yes | 2D array of rows to append (e.g., [["Alice", 30], ["Bob", 25]]). |
input | string | no | Input mode: "user_entered" (default, parses formulas/dates) or "raw" (literal strings). |
batch_read Read
Read multiple ranges from a Google Spreadsheet in one call. Provide an array of A1 notation ranges (e.g., ["Sheet1!A1:B5", "Sheet2!C1:D10"]). Returns results keyed by range.
- Lua path
app.integrations.google_sheets.batch_read- Full name
google-sheets.google_sheets_batch_read
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
ranges | array | yes | Array of A1 notation ranges (e.g., ["Sheet1!A1:B5", "Sheet2!C1:D10"]). |
render | string | no | Value rendering: "formatted" (default, as displayed), "unformatted" (raw numbers), or "formula" (shows formulas). |
batch_write Read
Write to multiple ranges in a Google Spreadsheet in one call. Provide an array of {range, values} objects to update several areas at once.
- Lua path
app.integrations.google_sheets.batch_write- Full name
google-sheets.google_sheets_batch_write
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
data | array | yes | Array of {range, values} objects (e.g., [{"range": "Sheet1!A1:B2", "values": [["a", "b"]]}]). |
input | string | no | Input mode: "user_entered" (default, parses formulas/dates) or "raw" (literal strings). |
clear Read
Clear all values from a Google Sheets range (keeps formatting intact). Specify the range in A1 notation.
- Lua path
app.integrations.google_sheets.clear- Full name
google-sheets.google_sheets_clear
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
range | string | yes | A1 notation range to clear (e.g., "Sheet1!A1:D10"). |
create Read
Create a new empty Google Spreadsheet with a given title. Returns the new spreadsheet ID and URL.
- Lua path
app.integrations.google_sheets.create- Full name
google-sheets.google_sheets_create
| Parameter | Type | Required | Description |
|---|---|---|---|
title | string | yes | Title for the new spreadsheet. |
delete_columns Write
Delete columns from a Google Sheets sheet/tab. Uses 0-based indexing.
- Lua path
app.integrations.google_sheets.delete_columns- Full name
google-sheets.google_sheets_delete_columns
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
sheet | string | yes | Sheet/tab name. |
start_index | integer | yes | 0-based column index to start deleting from. |
count | integer | no | Number of columns to delete (default 1). |
delete_rows Write
Delete rows from a Google Sheets sheet/tab. Uses 0-based indexing.
- Lua path
app.integrations.google_sheets.delete_rows- Full name
google-sheets.google_sheets_delete_rows
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
sheet | string | yes | Sheet/tab name. |
start_index | integer | yes | 0-based row index to start deleting from. |
count | integer | no | Number of rows to delete (default 1). |
delete Write
Delete a sheet/tab from a Google Spreadsheet.
- Lua path
app.integrations.google_sheets.delete- Full name
google-sheets.google_sheets_delete_sheet
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
sheet | string | yes | Sheet/tab name to delete. |
duplicate Write
Copy a sheet/tab within the same Google Spreadsheet.
- Lua path
app.integrations.google_sheets.duplicate- Full name
google-sheets.google_sheets_duplicate_sheet
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
sheet | string | yes | Source sheet/tab name to duplicate. |
title | string | no | Name for the copy (defaults to "Copy of {name}"). |
find Read
Search for text within a Google Spreadsheet. Searches all sheets by default, or specify a sheet name to narrow the search. Returns match count and number of sheets containing matches.
- Lua path
app.integrations.google_sheets.find- Full name
google-sheets.google_sheets_find
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
query | string | yes | Text to search for. |
sheet | string | no | Sheet name to search in. Omit to search all sheets. |
match_case | boolean | no | Case-sensitive search. Default false. |
match_entire_cell | boolean | no | Match entire cell content only. Default false. |
get_metadata Read
Get spreadsheet title and list of sheets/tabs with their names, IDs, and dimensions. Use this first to discover sheet names and structure before reading or writing data.
- Lua path
app.integrations.google_sheets.get_metadata- Full name
google-sheets.google_sheets_get_metadata
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
insert_columns Read
Insert blank columns into a Google Sheets sheet/tab. Uses 0-based indexing.
- Lua path
app.integrations.google_sheets.insert_columns- Full name
google-sheets.google_sheets_insert_columns
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
sheet | string | yes | Sheet/tab name. |
start_index | integer | yes | 0-based column index to insert at. |
count | integer | no | Number of columns to insert (default 1). |
insert_rows Read
Insert blank rows into a Google Sheets sheet/tab. Uses 0-based indexing.
- Lua path
app.integrations.google_sheets.insert_rows- Full name
google-sheets.google_sheets_insert_rows
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
sheet | string | yes | Sheet/tab name. |
start_index | integer | yes | 0-based row index to insert at. |
count | integer | no | Number of rows to insert (default 1). |
read_range Read
Read cell values from a Google Sheets range using A1 notation. A1 notation examples: `Sheet1!A1:D10` (range), `Sheet1!A:A` (whole column), `Sheet1` (entire sheet). Sheet names with spaces need quotes: `'My Sheet'!A1:B2`.
- Lua path
app.integrations.google_sheets.read_range- Full name
google-sheets.google_sheets_read_range
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
range | string | yes | A1 notation range (e.g., "Sheet1!A1:D10", "Sheet1!A:A", "Sheet1"). |
render | string | no | Value rendering: "formatted" (default, as displayed), "unformatted" (raw numbers), or "formula" (shows formulas). |
remove_filter Write
Remove the filter from a Google Sheets sheet/tab.
- Lua path
app.integrations.google_sheets.remove_filter- Full name
google-sheets.google_sheets_remove_filter
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
sheet | string | yes | Sheet/tab name to remove the filter from. |
rename Read
Rename a sheet/tab in a Google Spreadsheet.
- Lua path
app.integrations.google_sheets.rename- Full name
google-sheets.google_sheets_rename_sheet
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
sheet | string | yes | Current sheet/tab name. |
title | string | yes | New name for the sheet/tab. |
sort_range Read
Sort data by column(s) in a Google Sheets range.
- Lua path
app.integrations.google_sheets.sort_range- Full name
google-sheets.google_sheets_sort_range
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
range | string | yes | A1 notation range to sort (e.g., "Sheet1!A1:D10"). |
sort_column | integer | yes | 0-based column index within the range to sort by. |
ascending | boolean | no | Sort ascending (true, default) or descending (false). |
write_range Read
Write values to a Google Sheets range. Values format: `[["Name", "Age"], ["Alice", 30]]` — each inner array is one row. Formulas work with user_entered input mode (default): `[["=SUM(A1:A10)"]]`.
- Lua path
app.integrations.google_sheets.write_range- Full name
google-sheets.google_sheets_write_range
| Parameter | Type | Required | Description |
|---|---|---|---|
spreadsheet_id | string | yes | Spreadsheet ID (from the URL). |
range | string | yes | A1 notation range (e.g., "Sheet1!A1:D10"). |
values | array | yes | 2D array of values. Each inner array is a row (e.g., [["Name", "Age"], ["Alice", 30]]). |
input | string | no | Input mode: "user_entered" (default, parses formulas/dates) or "raw" (literal strings). |