Smartsheet Form Intake to Row and Routing
When a Smartsheet form is submitted (or a row is added), the flow validates the data, routes the row to the correct sheet/section, assigns an owner, sets a status, and notifies the assignee in Teams plus emails the requester a confirmation. Turns Smartsheet form intake into governed, routed work.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This flow turns Smartsheet form intake into governed, routed work. When a new row is created in the intake sheet (e.g. by a Smartsheet form submission), the flow reads the row, validates it, looks up the correct owner from a routing map, writes the assigned owner and a status back to the row, notifies the assignee in a Microsoft Teams channel, and emails the requester a confirmation. Rows that can't be matched to an owner are stamped Needs Triage and flagged in Teams for manual handling.
Why it matters: Raw form rows pile up unsorted. Automating validation, routing, assignment, and acknowledgement removes manual triage and gives requesters an instant, governed response.
Use Case
A team collecting requests through a Smartsheet form wants each submission automatically validated, routed to the right owner, assigned, status-stamped, and acknowledged — with unroutable submissions surfaced for a human to triage.
Flow Architecture
When a new Smartsheet row is created
Smartsheet — OnRowCreatedBatch trigger (splitOn rows) — fires per new intake row.
Init var... (1-13)
Initialize VariableBind env vars (sheet id, API token, column ids, Teams ids, routing map) and configurable labels (column titles, status labels), plus the trigger row id.
Get Sheet Rows
Smartsheet — GetSheetDataReads all rows keyed by column title (the trigger only returns a cell array).
Filter To New Row
Filter array (Query)Narrows to the single new row by matching its id.
Compose Matched Row
ComposeThe matched row object.
Compose RequestType / RequesterEmail / Description
ComposeExtract cell values by configurable column title.
Compose OwnerEmail
ComposeLooks up the owner email for the Request Type in the Routing Map (empty = unroutable).
Check If Routable
Condition (If / Else)Validation + routing branch.
Mark Row Routed In Smartsheet (If)
HTTP PUT (Smartsheet REST)Writes owner + Routed status back to the row.
Notify Assignee In Teams (If)
Microsoft Teams — PostMessageToConversationAssignment notice in the triage channel.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_SmartsheetSheetId | String | REPLACE_WITH_SMARTSHEET_SHEET_ID | Intake sheet id (trigger + read + HTTP write). |
| flowlibs_SmartsheetApiToken | String | <configure> | Smartsheet API bearer token for the HTTP row write. |
| flowlibs_SmartsheetStatusColumnId | String | <configure> | Numeric columnId of the Status column. |
| flowlibs_SmartsheetOwnerColumnId | String | REPLACE_WITH_OWNER_COLUMN_ID | Numeric columnId of the Assigned Owner column. |
| flowlibs_RoutingMap | String | {"IT":"it-team@yourcompany.com","HR":"hr-team@yourcompany.com","Facilities":"facilities@yourcompany.com"} | JSON map of Request Type to owner email. |
| flowlibs_TeamsGroupId | String | <your-team-id> | Teams team (group) id for the triage channel. |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Teams channel id for notifications. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Smartsheet | shared_smartsheet | OnRowCreated GetSheetData |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| Office 365 Outlook | shared_office365 | SendEmailV2 |
| HTTP | http | PUT /2.0/sheets/{id}/rows |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Sheet & columns
- Set flowlibs_SmartsheetSheetId, the two ColumnId env vars (numeric Smartsheet column ids), and the API token. Update the varRequestTypeColumn / varRequesterEmailColumn / varDescriptionColumn Init variables to match your sheet's column titles.
- Routing rules
- Edit flowlibs_RoutingMap JSON to map each Request Type value to the owner email it should route to. Unmatched types fall to the Needs Triage branch.
- Teams target
- Point flowlibs_TeamsGroupId / flowlibs_TeamsChannelId at your triage channel.
- Validation depth
- Add a pre-routing Condition to reject rows missing required fields (e.g. blank Requester Email) before the routing check.
- Multi-sheet routing
- Extend the If branch with a Smartsheet InsertRow/HTTP copy to move the row into a destination sheet per category.
- Polling vs trigger
- OnRowCreated is a batch trigger (default poll 3 min). To read column-keyed values directly, swap to a Recurrence trigger + GetSheetData + a Query filter on an unprocessed status.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Trigger row id
Captures the new row id.
EXPR.02Locate the new row in the sheet read
Filter to the single new row.
EXPR.03Read a cell by configurable column title
Dynamic cell read.
EXPR.04Owner lookup (routing)
Resolves the owner from the routing map.
EXPR.05Routable test
True when an owner was matched.
EXPR.06HTTP row write body
Writes owner + status back to the row.
EXPR.07HTTP auth header
Smartsheet REST Bearer auth header.
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.