Portal Community

When to Use

Configuration

FieldRequiredDescription
CredentialIdRequiredInteger ID referencing a stored Google credential in the BizFirst Credentials Manager.
SpreadsheetIdRequiredThe Google Sheets spreadsheet ID where the new tab should be created. The spreadsheet must already exist.
TitleRequiredThe 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.
HiddenOptionalBoolean. 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.
TabColorOptionalInteger 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 CodeCause
VAL_MISSING_SPREADSHEET_IDSpreadsheetId is empty or whitespace.
VAL_MISSING_TITLETitle is empty or whitespace.
VAL_TITLE_TOO_LONGTitle exceeds 100 characters.
SHEET_ALREADY_EXISTSA tab with the specified Title already exists in the spreadsheet.
VAL_INVALID_CREDENTIALCredentialId does not resolve to a valid Google credential.

Output Fields

FieldTypeDescription
sheetIdintegerThe internal numeric ID assigned to the new sheet tab by Google Sheets. Required for operations that reference sheets by ID (e.g. sheet/deleteRowsOrColumns).
sheetNamestringThe name of the newly created tab — same as the Title provided.
sheetIndexintegerThe 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.
spreadsheetIdstringEchoed spreadsheet ID.
statusstring"success".
resourcestringAlways "sheet".
operationstringAlways "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:

ExpressionReturnsDescription
{{ $output.createMonthTab.sheetId }}integerInternal Google sheet ID — use for deleteRowsOrColumns or other ID-based operations.
{{ $output.createMonthTab.sheetName }}stringName of the new tab — pass to subsequent sheet/append or sheet/update nodes.
{{ $output.createMonthTab.sheetIndex }}integerPosition of the new tab in the tab bar (0-based).
{{ $output.createMonthTab.spreadsheetId }}stringSpreadsheet ID for chaining to write nodes.

Node Policies & GuardRails

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.