Entry Sheet — Column Reference

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 HeaderDescriptionExample 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. 1, 2, 3
name The field label displayed to users Employee Name, Date, Shift
ui_smarttable_element The input type for this field — see Field Types & Properties text, textarea, number, date, month, time, dropdown, multi_select_dropdown, radio_button, button_group, checkbox, attachment
optional 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 HeaderDescriptionExample 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:

  1. 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).
  2. Add one entry-sheet row per column, same as any other field — its own name and ui_smarttable_element.
  3. On every one of those rows, set table to TRUE.
  4. On every one of those rows, set the same table_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.
  5. 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.
  6. 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.
  7. 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:

name ui_smarttable_element table table_no properties
MaterialtextTRUE1{"max_rows": 10, "table_name": "Materials Used", "columnWidth": 50}
QuantitynumberTRUE1{"columnWidth": 25}
UnittextTRUE1{"columnWidth": 25}
ℹ️ 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 HeaderDescriptionExample 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 HeaderDescriptionExample 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 HeaderDescriptionExample 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 HeaderDescriptionExample 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

ValueBehavior
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
1DatedateFALSEGeneral1
2ShiftdropdownFALSEGeneral1Morning, Evening, Night
3OperatortextFALSEGeneral2pa_CURRENT_USER
4TemperaturenumberFALSEReadings3
5PressurenumberFALSEReadings3
6Statusradio_buttonFALSEReadings4OK, Not OK, N/A
7PhotoattachmentTRUEReadings5

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.