Spreadsheet Integrations
Log form submissions as rows in Google Sheets and Excel Online from your Buildorado workflows.
Spreadsheet integrations are the simplest way to collect and organize structured data from your Buildorado forms. Every form submission can append a new row to a Google Sheet or Excel Online workbook, with each form field mapped to a column. This gives your team a familiar interface for reviewing, filtering, and analyzing submissions without learning a new tool. Both integrations authenticate via OAuth 2.0 and store credentials with AES-256 encryption through AWS KMS.
Google Sheets
Google Sheets is the most popular spreadsheet integration in Buildorado. Append form submissions as rows, read existing data, and build live dashboards that update in real time.
Setting Up Google Sheets
- Navigate to Settings > Integrations in your Buildorado dashboard.
- Find Google Sheets and click Connect.
- Sign in with your Google account in the authorization popup.
- Grant the following permissions:
spreadsheets-- Read and write Google Sheets datauserinfo.email-- Identify the connected accountuserinfo.profile-- Read your profile
- Once authorized, Google Sheets shows as Connected with your Google account email.
Both personal Google accounts and Google Workspace accounts are supported. For Workspace accounts, your administrator may need to approve the Buildorado app.
Operations
appendRow
Add a new row of data to a Google Sheet. This is the most commonly used operation -- it logs every form submission as a new row.
| Field | Type | Required | Description |
|---|---|---|---|
spreadsheetId | string | Yes | The ID of the Google Sheet |
sheetName | string | No | Name of the specific sheet tab (defaults to the first sheet) |
range | string | No | Cell range to append to (e.g., A:Z). Defaults to auto-detect |
values | JSON | No | Column mapping as JSON object (e.g., {"Name": "{{name}}", "Email": "{{email}}"}). Leave empty to auto-send all form fields |
valueInputOption | select | No | RAW (store as-is) or USER_ENTERED (parse as if typed by user). Default: USER_ENTERED |
Output:
| Field | Type | Description |
|---|---|---|
spreadsheetId | string | The spreadsheet ID |
updatedRange | string | The cell range that was updated (e.g., Sheet1!A5:F5) |
updatedRows | number | Number of rows updated (typically 1) |
updatedColumns | number | Number of columns in the appended row |
updatedCells | number | Total number of cells written |
getSpreadsheet
Retrieve metadata about a spreadsheet, including sheet names and properties.
| Field | Type | Required | Description |
|---|---|---|---|
spreadsheetId | string | Yes | The ID of the Google Sheet |
Output:
| Field | Type | Description |
|---|---|---|
spreadsheetId | string | The spreadsheet ID |
title | string | Spreadsheet title |
sheets | string | Sheet names and properties as JSON |
readRange
Read data from a specific range of cells.
| Field | Type | Required | Description |
|---|---|---|---|
spreadsheetId | string | Yes | The ID of the Google Sheet |
range | string | Yes | Cell range to read (e.g., Sheet1!A1:D10) |
Output:
| Field | Type | Description |
|---|---|---|
range | string | The range that was read |
majorDimension | string | Major dimension (ROWS or COLUMNS) |
values | string | Cell values as JSON |
Finding the Spreadsheet ID
The spreadsheet ID is the long string of characters in the Google Sheets URL:
https://docs.google.com/spreadsheets/d/SPREADSHEET_ID_HERE/editCopy the SPREADSHEET_ID_HERE portion and use it as the spreadsheetId value in your action node.
Mapping Form Fields to Columns
You can map form fields to columns in two ways:
Option A: Column mapping (recommended)
Use the values field with a JSON object that maps column headers to form field values:
{"Name": "{{form.fullName}}", "Email": "{{form.email}}", "Phone": "{{form.phone}}", "Message": "{{form.message}}", "Submitted At": "{{submission.createdAt}}"}Buildorado matches the keys to your column headers and creates headers automatically if they do not exist.
Option B: Auto-send all fields
Leave the values field empty to automatically send all form fields. Buildorado creates headers from field keys on the first submission.
Value Input Options
The valueInputOption setting controls how Google Sheets interprets the values you send:
| Option | Behavior | Best For |
|---|---|---|
USER_ENTERED | Parses values as if typed into the sheet. Numbers become numbers, dates become dates, formulas execute | Most use cases. Dates and numbers display correctly |
RAW | Stores values exactly as provided with no parsing. Everything is treated as a string | Preserving exact formatting, preventing formula injection |
For most workflows, USER_ENTERED is the right choice. It ensures that numeric form fields (like budget or quantity) are stored as numbers in the sheet, making them usable in formulas and charts.
Security note: If your form collects user-provided text that might contain characters like =, +, or - at the start, use RAW to prevent unintended formula execution. Alternatively, prefix text values with a single quote character.
Common Pattern: Log Every Submission as a Row
The most popular Google Sheets workflow is a simple form-to-spreadsheet pipeline:
[Form: Contact Request]
-- [Google Sheets: appendRow]
spreadsheetId: "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms"
sheetName: "Submissions"
values: {"Name": "{{form.name}}", "Email": "{{form.email}}", "Phone": "{{form.phone}}", "Message": "{{form.message}}", "Submitted At": "{{submission.createdAt}}"}
valueInputOption: "USER_ENTERED"Set up the spreadsheet with column headers in row 1 (Name, Email, Phone, Message, Submitted At), and every form submission will appear as a new row below the headers.
Advanced Patterns
Separate sheets by form type:
Use different sheetName values to route submissions to different tabs within the same spreadsheet:
[Form: Multi-purpose]
-- Branch: formType
-- "Support" -- [Google Sheets: appendRow to "Support Tickets" sheet]
-- "Sales" -- [Google Sheets: appendRow to "Sales Leads" sheet]
-- "Feedback" -- [Google Sheets: appendRow to "Feedback" sheet]Read data for validation:
Use readRange to check existing data before appending. For example, verify that an email address has not already been submitted:
[Form: Registration]
-- [Google Sheets: readRange "Registrations!B:B"]
-- [Branch: Check if {{form.email}} exists in column B]
-- not found -- [Google Sheets: appendRow]
-- found -- [Email: "You are already registered"]Include upstream node outputs:
Combine form data with outputs from other workflow nodes:
{"Name": "{{form.name}}", "Email": "{{form.email}}", "Payment ID": "{{stripe_1.paymentId}}", "Amount": "{{stripe_1.amount}}", "Lead Score": "{{ai_1.leadScore}}", "Submitted At": "{{submission.createdAt}}"}Tips for Google Sheets
- Create column headers in row 1 before connecting the workflow. The
appendRowoperation appends after the last row with data, so headers ensure proper alignment. - Google Sheets has a limit of 10 million cells per spreadsheet. For very high-volume forms, consider creating a new sheet tab monthly or using a dedicated database.
- The connected Google account must have Edit access to the spreadsheet. Viewer or Commenter access will cause the operation to fail.
- Google Sheets API has a quota of 60 requests per minute. Buildorado batches writes when possible to stay within limits.
- Use
USER_ENTEREDfor dates so Google Sheets recognizes them as date values, enabling date-based filtering and sorting.
Excel Online
Excel Online integration works with Microsoft 365 workbooks stored in OneDrive or SharePoint. It follows the same append-row pattern as Google Sheets.
Setting Up Excel Online
- Navigate to Settings > Integrations and click Connect next to Excel Online.
- Sign in with your Microsoft 365 account in the authorization popup.
- Grant the following permissions:
User.Read-- Read your profileFiles.ReadWrite.All-- Read and write Excel workbooksoffline_access-- Maintain the connection
- Once authorized, Excel Online shows as Connected.
Operations
appendRow
Append a row to an Excel table.
| Field | Type | Required | Description |
|---|---|---|---|
workbookId | string | Yes | OneDrive item ID of the Excel workbook |
tableIdOrName | string | Yes | Table ID or name within the workbook |
values | JSON | Yes | Row values as a 2D array (e.g., [["val1","val2"]]) |
Output:
| Field | Type | Description |
|---|---|---|
index | number | The row index of the appended row |
values | string | The values that were written as JSON |
readRange
Read data from a specific range in an Excel worksheet.
| Field | Type | Required | Description |
|---|---|---|---|
workbookId | string | Yes | OneDrive item ID of the Excel workbook |
sheetName | string | Yes | Worksheet name |
range | string | Yes | A1-notation range (e.g., A1:D10) |
Output:
| Field | Type | Description |
|---|---|---|
address | string | The cell range address |
values | string | Cell values as JSON |
rowCount | number | Number of rows |
columnCount | number | Number of columns |
getWorkbook
Get workbook metadata and list of worksheets.
| Field | Type | Required | Description |
|---|---|---|---|
workbookId | string | Yes | OneDrive item ID of the Excel workbook |
Output:
| Field | Type | Description |
|---|---|---|
worksheets | string | Worksheets as JSON |
Finding the Workbook ID
For workbooks stored in OneDrive, the workbook ID is available through the OneDrive API. The simplest approach:
- Open the Excel workbook in your browser.
- In Buildorado, use the file picker in the Excel Online action node to browse and select your workbook.
For workbooks in SharePoint, you may need the SharePoint site ID and the file's drive item ID.
Differences from Google Sheets
| Feature | Google Sheets | Excel Online |
|---|---|---|
| Authentication | Google OAuth | Microsoft OAuth |
| File location | Google Drive | OneDrive or SharePoint |
| API rate limits | 60 req/min | Microsoft Graph limits (varies by plan) |
| Cell limit | 10 million cells | 17 billion cells (desktop), varies online |
| Formula syntax | Google Sheets formulas | Excel formulas |
| Read operations | readRange | readRange |
| Real-time collaboration | Yes | Yes |
Tips for Excel Online
- The workbook must be stored in OneDrive or SharePoint. Local Excel files on your computer are not accessible through the integration.
- Excel Online workbooks in SharePoint inherit SharePoint permissions. The connected user must have Edit access.
- For large workbooks with many sheets, specify the
sheetNameexplicitly to avoid reading from the wrong sheet. - Microsoft Graph API rate limits apply. High-volume workflows may need throttling.
Best Practices for Spreadsheet Integrations
Set Up Headers First
Always create column headers in row 1 of your spreadsheet before connecting the workflow. This ensures that appended rows align correctly with your columns and makes the spreadsheet human-readable.
Include Metadata Columns
Add a "Submitted At" column with the {{submission.createdAt}} variable and a "Submission ID" column with {{submission.id}}. This creates an audit trail and makes it easy to cross-reference spreadsheet rows with Buildorado execution logs.
Error Handling
Spreadsheet operations can fail if the spreadsheet is deleted, the connected account loses access, or API limits are exceeded. Attach an error handler node to your spreadsheet action:
[Google Sheets: appendRow]
-- error -- [Slack: "#ops Spreadsheet logging failed for submission {{submission.id}}"]Combine with Other Actions
Spreadsheet logging works well as a secondary action alongside primary integrations:
[Form: Lead Capture]
-- [Salesforce: createLead]
-- [Google Sheets: appendRow] // backup log
-- [Slack: Notify sales team]This ensures you have a spreadsheet backup of all submissions even if your primary CRM is the system of record.