sheet/create FormID SH04
Add a new tab (sheet) to an existing Google Sheets spreadsheet. Supports setting the tab name, optional color coding, and hidden visibility. Use to dynamically provision report tabs, client-specific views, or monthly archive sheets inside a shared workbook.
When to Use
- Reporting — monthly tab generation: A scheduled workflow runs on the first of each month and creates a new tab named "Jan 2026", "Feb 2026", etc. in a shared annual report spreadsheet. After creating the tab, it writes headers and populates data — all in a single automated workflow run.
- Finance — per-department budget tabs: When a new department is added to the org chart, a workflow triggers and creates a new budget tab named after the department inside the master "Budgets 2026" spreadsheet. The tab is color-coded by business unit using the
TabColorfield. - HR — per-cohort onboarding sheets: Each month's new-hire cohort gets a dedicated tab in the "Onboarding Tracker" spreadsheet. A workflow creates the tab with the cohort name ("May 2026 Cohort"), writes the header row, then appends one row per new hire from the HRIS data.
- Operations — per-project tracking tabs: When a project is approved in the project management system, a workflow creates a project-specific tab in the "Projects Tracker" spreadsheet. The tab is initially hidden until the project kick-off date, then made visible via a scheduled unmask workflow.
- Client portals — isolated data views: In a multi-client analytics spreadsheet, a workflow creates a new client-specific tab (named by client ID) when a new client is onboarded. Each client's data is written to their own isolated tab, keeping data separated without requiring multiple spreadsheet files.
Configuration
| Field | Required | Description |
|---|---|---|
CredentialId | Required | Integer ID referencing a stored Google credential in the BizFirst Credentials Manager. |
SpreadsheetId | Required | The Google Sheets spreadsheet ID where the new tab should be created. The spreadsheet must already exist. |
Title | Required | The name for the new tab. Must be unique within the spreadsheet — Google Sheets does not allow two tabs with identical names. Supports dynamic expressions: {{ $now | date('MMM YYYY') }}. Maximum 100 characters. |
Hidden | Optional | Boolean. Default false. When true, the tab is created but hidden from view in the Sheets UI. The tab still exists and can be read/written by the API. Hidden tabs are useful for staging areas or tabs revealed only at a future date by a separate workflow. |
TabColor | Optional | Integer representing the tab color. The value is a packed RGB integer: (R * 65536) + (G * 256) + B. Examples: Red = 16711680 (0xFF0000), Green = 65280 (0x00FF00), Blue = 255 (0x0000FF). When omitted, the default tab color is applied. |
Tab name uniqueness: If you attempt to create a tab with a name that already exists in the spreadsheet, the API returns a
400 Bad Request error. Use a Code node upstream to check whether the tab already exists (via sheet/get catching the SHEET_NOT_FOUND error) before calling sheet/create.
Validation Errors
| Error Code | Cause |
|---|---|
VAL_MISSING_SPREADSHEET_ID | SpreadsheetId is empty or whitespace. |
VAL_MISSING_TITLE | Title is empty or whitespace. |
VAL_TITLE_TOO_LONG | Title exceeds 100 characters. |
SHEET_ALREADY_EXISTS | A tab with the specified Title already exists in the spreadsheet. |
VAL_INVALID_CREDENTIAL | CredentialId does not resolve to a valid Google credential. |
Output Fields
| Field | Type | Description |
|---|---|---|
sheetId | integer | The internal numeric ID assigned to the new sheet tab by Google Sheets. Required for operations that reference sheets by ID (e.g. sheet/deleteRowsOrColumns). |
sheetName | string | The name of the newly created tab — same as the Title provided. |
sheetIndex | integer | The 0-based position of the new tab in the spreadsheet's tab bar. The first tab is index 0. New tabs are typically added at the end. |
spreadsheetId | string | Echoed spreadsheet ID. |
status | string | "success". |
resource | string | Always "sheet". |
operation | string | Always "create". |
Sample Configuration
{
"resource": "sheet",
"operation": "create",
"CredentialId": 12,
"SpreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms",
"Title": "{{ $now | date('MMM YYYY') }} Report",
"Hidden": false,
"TabColor": 4034338
}
The TabColor value 4034338 corresponds to RGB(61, 133, 198) — a medium blue, matching the BizFirstAI brand color.
Sample Output
{
"sheetId": 1847392041,
"sheetName": "May 2026 Report",
"sheetIndex": 4,
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms",
"status": "success",
"resource": "sheet",
"operation": "create"
}
Expression Reference
Assuming this node is named createMonthTab in the workflow:
| Expression | Returns | Description |
|---|---|---|
{{ $output.createMonthTab.sheetId }} | integer | Internal Google sheet ID — use for deleteRowsOrColumns or other ID-based operations. |
{{ $output.createMonthTab.sheetName }} | string | Name of the new tab — pass to subsequent sheet/append or sheet/update nodes. |
{{ $output.createMonthTab.sheetIndex }} | integer | Position of the new tab in the tab bar (0-based). |
{{ $output.createMonthTab.spreadsheetId }} | string | Spreadsheet ID for chaining to write nodes. |
Node Policies & GuardRails
- Duplicate tab prevention: Always check whether the target tab already exists before calling
sheet/createin workflows that may re-run (e.g. scheduled workflows that could fire more than once in an error-retry scenario). Use ansheet/getin a try-catch pattern or add an IF node gated on a flag stored in a Variable node. - TabColor calculation: The color integer is computed as
R * 65536 + G * 256 + B. Common values: Red (16711680), Orange (16737843), Yellow (16776960), Green (5025616), Blue (4034338), Purple (7340032), Gray (9211020). - Chaining to write nodes: After creating a tab, use
{{ $output.createMonthTab.sheetName }}as theSheetNameinput to the subsequentsheet/appendorsheet/updatenodes. This ensures the write goes to the freshly created tab even if theTitleexpression was dynamic. - Hidden tabs: Hidden tabs are still accessible via the API. Workflows can read and write to hidden tabs. Use this for staging, pre-population, or controlled release patterns.
- Credential scope: Requires Editor or Owner permission on the spreadsheet. Viewer credentials cannot create new tabs.
- Quota: One write request per tab creation.
Workflow Examples
Example 1 — Monthly Report Tab Provisioning
// Trigger: Scheduled — 1st of each month at 6 AM
// Node 1 — sheet/create (createMonthTab)
{
"resource": "sheet", "operation": "create",
"CredentialId": 12,
"SpreadsheetId": "{{ $env.ANNUAL_REPORT_SHEET_ID }}",
"Title": "{{ $now | date('MMM YYYY') }}",
"Hidden": false,
"TabColor": 4034338
}
// Node 2 — sheet/append (writeHeaders)
// Appends the header row to the new tab
{
"resource": "sheet", "operation": "append",
"CredentialId": 12,
"SpreadsheetId": "{{ $output.createMonthTab.spreadsheetId }}",
"SheetName": "{{ $output.createMonthTab.sheetName }}",
"DataMode": "DefineBelow",
"ColumnMappings": [
{ "Column": "Date", "Value": "Date" },
{ "Column": "Revenue", "Value": "Revenue" },
{ "Column": "Orders", "Value": "Orders" }
]
}
// Node 3 — HttpRequest: fetch this month's data
// Node 4 — sheet/append: write data rows
Example 2 — New Client Onboarding Tab
// Trigger: Webhook — new client created in CRM
{
"resource": "sheet", "operation": "create",
"CredentialId": 15,
"SpreadsheetId": "{{ $env.CLIENT_ANALYTICS_SHEET_ID }}",
"Title": "{{ $json.clientCode }} — {{ $json.clientName }}",
"Hidden": true,
"TabColor": 9211020
}
// Tab starts hidden. A separate scheduled workflow reveals it at go-live date.