Every column header the entry sheet's first row accepts, and a complete worked example.
The first row of the entry sheet defines the configuration columns. Each subsequent row defines one smarttable field. Column headers below are verified directly against persivApps._smartTableTemplateEntryColumns (js/modules/smarttables.js) and the field-rendering code that actually reads each key (smarttableBuilder.js), not assumed from naming conventions.
Core Field Properties
Column Header
Description
Example Values
id
A unique integer identifying this field. Referenced by the display sheet's <pa_ID> placeholders (see Display & Header Sheets) and by formulas (pa_ID) — this is the link between the entry sheet and everything else.
Whether the field is mandatory (FALSE = mandatory)
TRUE, FALSE
hide
Hide this field from the smarttable (used for internal/system fields)
TRUE, FALSE
isDisabled
Lock the field so it can't be typed into. For a formula field this is opt-in — by default a formula field is still editable (its computed value just gets overwritten again next time a field it depends on changes); set this to lock it so only the computed value can ever appear. Written camelCase in the sheet, unlike every other boolean column here — there's no rename step for it.
TRUE, FALSE
show_in_entries_list
Whether this field appears as its own column in the main entries table (the list view). Defaults to shown (TRUE) if the column is left blank — set to FALSE for a field you only want visible inside the entry itself, not cluttering the list view.
TRUE, FALSE
Layout & Grouping
Column Header
Description
Example Values
accordion
Group fields into a collapsible accordion section
General Info, Measurements, Quality Check
smarttable_section
Higher-level section grouping (displayed as a heading above accordions)
Section A, Section B
step
Which data-entry step this field belongs to. Define two or more distinct steps and the SmartTable becomes a multi-step form, where each step can be assigned to different people — see SmartTable Steps. Leave blank on every field and the table has no steps at all. The header may also be written "Step No", "Step Number" or "Steps"; all map to the same thing.
1, 2, 3
step_name
The name shown on that step's tab. Repeat it on every field belonging to the step (the first non-blank one wins). Without it a step is labelled "Step 1", "Step 2" and so on. Also accepted as "Step Name".
Initials, Measurements, Verification
row
Place multiple fields on the same row (fields with the same row number appear side-by-side)
1, 2, 3
table
Mark this field as one column of a table (multi-row entry) instead of a normal one-off field.
TRUE, FALSE
table_no
Which table this column belongs to — this is what actually groups columns together, not row. Every table=TRUE field sharing the same table_no becomes one column of the same Handsontable grid; a sheet with two separate tables uses two different table_no values.
1, 2
💡 Setting a table's row limits, label, and column widths
None of these are their own entry-sheet column — they all live in properties JSON instead. min_rows/max_rows (row count cap) and table_name (a label shown above the grid) go on that table's first column only (the field entered first, by row order, among that table_no's columns). columnWidth (a percentage of the table's width) is the opposite — set it on each column that needs a specific width, not just the first. See Field Types & Properties for the full explanation of each key.
Setting Up a Table Field — Step by Step
A table is just a set of ordinary field rows in the entry sheet, tagged to repeat together as a grid instead of appearing once each. There's no separate "table" concept to configure elsewhere — it's entirely built from the columns you already know:
Decide which fields belong in the table — each one becomes one column of the grid (any field type from the Field Type Reference is allowed as a column).
Add one entry-sheet row per column, same as any other field — its own name and ui_smarttable_element.
On every one of those rows, set table to TRUE.
On every one of those rows, set the sametable_no value — this is what actually groups them into one table. Two different tables on the same sheet just need two different table_no values.
Optional: on the first column's row only, set min_rows/max_rows/table_name in its properties JSON to cap how many rows the table allows and/or give the grid a label.
Optional: on any column's row, set columnWidth (a percentage) in its properties JSON to give that specific column a fixed width instead of letting it auto-size.
Refresh the SmartTable — the columns sharing that table_no render as a single Handsontable grid, with an Add Row control up to any max_rows limit.
Worked Example — a "Materials Used" table
Three columns (Material, Quantity, Unit) grouped into one table via matching table_no, capped at 10 rows and labeled via the first column's properties, with Material given a wider column since it holds longer text:
ℹ️ Why the row limit lives on "Material" specifically
It's not because Material is special — it's simply the first of the three rows in sheet order. Had Quantity been entered first instead, {"max_rows": 10} would need to go on Quantity's row instead. The app only ever reads the first column's properties for the table-level limits; the same key on any other column in the group is silently ignored.
⚠️ A field's own properties still work normally inside a table
Each column keeps whatever properties its own type needs — e.g. give "Quantity" its own {"comma_separator": "indian", "num_fraction_digits": 2} for number formatting. Only min_rows/max_rows are special-cased to the first column; everything else in properties is read per-column as usual.
Validation & Constraints
Column Header
Description
Example Values
min_value_allowed
Minimum acceptable value (for number fields — also becomes the min attribute on date/month fields, where it can hold the literal string pa_TODAY instead of a fixed value)
0, 10, -5
max_value_allowed
Maximum acceptable value (for number fields; same pa_TODAY support on date/month fields)
100, 999
acceptance_criteria
Not a numeric range — a short free-text hint shown in muted text right next to the field's label while entering data (e.g. spec/tolerance wording a data-entry operator should keep in mind). Purely informational; the app never validates against it.
Should be 20-80, Ref. SOP-114
allowed_data
The selectable options for dropdown, multi_select_dropdown, radio_button, and button_group fields — not a properties JSON key. Either a plain comma-separated list, or a JSON array of {"value":..., "label":...} objects when the stored value and the displayed label need to differ.
Morning, Evening, Night
properties
A single JSON object holding every extra setting a field's type needs (number/date formatting, table row limits, etc. — not dropdown/radio/button-group options, those come from allowed_data above). See the full Properties Reference for every key, grouped by field type.
{"num_fraction_digits": 2}
Observations & Suggestions
Column Header
Description
Example Values
hide_for_observation_number
Hide this field on specific observation numbers only (see Overview for what an observation is). A comma-separated list of observation numbers this field should be hidden on; it still shows normally on every observation not listed.
2,3
autofill_from_observation1
Carries this field's observation 1 value across to every other observation shown in the entries list, unchanged — for a value that's logically shared across all observations of one entry (e.g. Shift, Date) but where only the first observation's form actually has it filled in.
TRUE, FALSE
auto_suggest_from_past_records
Shows a type-ahead dropdown of this field's own previously-entered distinct values across past entries on the same smarttable, as the user types — a quick-fill convenience, not a relational lookup (compare with Autofill Configuration in SmartTable Settings, which pulls from a different smarttable).
TRUE, FALSE
Attachments & Remarks
Column Header
Description
Example Values
attachment
Enable file attachment for this field
TRUE, FALSE
attachment_max_count
Maximum number of attachments allowed (defaults to 1 if left blank). There is no matching "minimum count" column — only a maximum is enforced.
5, 10
remarks
Enable a remarks/notes text area for this field
TRUE, FALSE
Default Values & Special Behavior
Column Header
Description
Example Values
default
Default value for the field. Supports dynamic values — see below.
pa_CURRENT_USER, pa_SMART_TABLE_SAVE_TIMESTAMP, pa_TIMER, or any static value
formula
Not a settings flag — the cell itself holds a literal Excel formula referencing other fields as pa_ID (e.g. =pa_5*pa_6). See Formulas & Computed Fields.
=pa_5*pa_6
barcode
Enable barcode/QR code scanning for this field, using the device camera. Supports EAN-13, EAN-8, UPC-A, UPC-E, Code 128, Code 39, Code 93, ITF, and QR codes. A manual text-entry fallback is always available if the camera can't read a code.
TRUE, FALSE
ℹ️ A column your sheet may still have: auto_increment
Some existing entry sheets carry an auto_increment column from an earlier iteration of the platform. It isn't read by any current field-rendering or field-config code — leaving it blank (or omitting it entirely on a new sheet) has no effect either way.
💡 Linking a field to another SmartTable isn't a sheet column
Pulling a field's value from another (relational) SmartTable, disambiguating between similar-looking related rows, and auto-populating other fields together are all configured entirely in the app after the SmartTable exists — SmartTable Settings → Autofill Configuration — not by adding any column to the entry sheet. See Autofill Configuration for the full setup, including the non-relational field-linking mode.
Dynamic Default Values
Value
Behavior
pa_CURRENT_USER
Auto-fills with the logged-in user's name
pa_SMART_TABLE_SAVE_TIMESTAMP
Auto-fills with the current date/time when the entry is submitted
pa_TIMER
Tracks time spent on the smarttable (in seconds)
Example Entry Sheet
id
name
ui_smarttable_element
optional
accordion
row
default
allowed_data
1
Date
date
FALSE
General
1
2
Shift
dropdown
FALSE
General
1
Morning, Evening, Night
3
Operator
text
FALSE
General
2
pa_CURRENT_USER
4
Temperature
number
FALSE
Readings
3
5
Pressure
number
FALSE
Readings
3
6
Status
radio_button
FALSE
Readings
4
OK, Not OK, N/A
7
Photo
attachment
TRUE
Readings
5
This example creates a smarttable with two accordion sections ("General" and "Readings"), where Date and Shift appear on the same row, Temperature and Pressure appear on the same row, and the Operator field auto-fills with the current user's name. A display sheet for this smarttable would reference these fields as <pa_1> through <pa_7> — see Display & Header Sheets.