Repeating Table

A table with repeating rows stored in a single item column, with typed columns and summaries.

Widget description: repeatingTable

The Repeating Table lets users enter any number of rows with the same columns—such as budget items or order lines—directly inside the form. The entire table is stored in one multiline text column of the item as JSON. Unlike other widgets, it is therefore not virtual: it is a display mode of a multiline text field (Multiline Text). The sum of a selected column can be automatically written into a number field.

Field settings in Table (JSON) mode: display mode switcher, column list, adding a column, and Sync sum to field

Adding to the Form

  1. In SharePoint, make sure your managed list has a Multiple lines of text column (plain text is recommended).
  2. In the designer palette on the Fields tab, drag this column into a section.
  3. In the inspector under Field display mode, switch from Multiline text to Table (JSON). The designer creates three sample columns (Item, Quantity, Price with sum).
  4. Edit the columns, add your own, and optionally configure sum syncing.

Switching back to Multiline text turns the field back into a regular text field. The table configuration remains saved in the config and is restored if you switch back.

Inspector Settings

OptionPropertyMeaningDefault
Field display modefieldTypemultiline (Multiline text) or repeatingTable (Table JSON).multiline
Table columnsrepeatingTableConfig.columns[]List of columns. Add a column by entering a name, choosing a type, and clicking "+"; remove it with the trash icon; reorder with arrows. At least one column is required.Item, Quantity, Price
Edit columncolumns[].label, type, required, width, summary, options, defaultValueThe pencil icon next to a column opens the editor: label, type, required flag, width (60 to 600 px), footer summary (number columns only), options (choice type, one per line), and default cell value. The column key (key) cannot be changed because data is stored under it.per column
Minimum and maximum rowsrepeatingTableConfig.minRows, maxRowsMinimum 0 to 100, maximum 1 to 500. Empty means unlimited. Maximum can never be set below minimum.unlimited
Add row button labelrepeatingTableConfig.addRowLabelIn another designer language, stored in translations (repeatingAddRowLabel), just like column headers (repeatingColumns).Add row
Sync sum to fieldrepeatingTableConfig.syncSumToFieldA form field of type Number, Currency, or Single line of text to receive the column sum. See Sum Syncing. Always visible in the inspector; if no suitable field exists on the form or the table has no number column, it is disabled with an explanation.none
Custom label, Description, Width in section, Visible, Required, Read-onlycustomLabel, description, colSpan, defaultVisible, defaultRequired, defaultReadOnlyCommon field options. Description appears under the label. A required table requires at least one row.

When adding a column, the designer derives a key (key) from the name—for example, "Total Price" becomes total_price—and ensures it is unique. A number column gets a footer sum by default.

Columns and Types

Each column has the following properties:

PropertyMeaning
idInternal column identifier in the designer.
keyKey in the row JSON. Must start with a letter or _ and contain only letters, digits, and _. Must be unique within the table. Renaming a key loses values in already-saved rows.
labelColumn header.
typetext (text input), number (number), date (date picker, stored as YYYY-MM-DD), boolean (Yes/No checkbox), choice (dropdown from options).
requiredRequired cell. An asterisk is shown in the header and validation rejects rows with an empty value.
widthColumn width in pixels (60 to 600).
optionsList of values for the choice type.
defaultValueCell value in a newly added row. When omitted: number 0, boolean false, choice first option, otherwise empty.
summaryFooter summary: none, sum, avg, min, max, count.

The inspector lets you add a column, edit all of its properties, reorder it, and remove it; it also sets minRows, maxRows, and addRowLabel. When there are multiple number columns, sum syncing lets you pick which one to sum.

Summaries

A summary row is displayed below the data when at least one column has a summary and the table has at least one row. The cell displays the summary name in uppercase and the value, such as SUM: 1250.

SummaryResult
sumsum of numeric values in the column
avgaverage, rounded to two decimal places
min, maxminimum, maximum value
countnumber of rows
noneno summary

Non-numeric values are ignored in summaries. If there are no numbers, the result is 0. The first column without a summary in the summary row displays the label "Total".

Sum Syncing (syncSumToField)

You can automatically write a column's sum to a form field of type Number, Currency, or Single line of text, such as TotalBudget. Configure it in the inspector using Sync sum to field. The designer selects the first number column of the table as the source; once a target is chosen, a Column to sum selector appears so you can pick a different number column. Corresponding JSON:

"syncSumToField": {
  "sourceColumnKey": "amount",
  "targetFieldInternalName": "TotalBudget"
}

Storage: JSON and Multiline Text

The field value is a JSON array of objects containing the column keys, for example:

[
  { "name": "License", "qty": 5, "price": 1200 },
  { "name": "Training", "qty": 1, "price": 8000 }
]

Invalid JSON in the column is displayed as an empty table. If a user adds a row and saves, the original text is overwritten. Therefore, do not write to the column manually.

Runtime Behavior

Table in the form in Edit mode: five columns of different types, row arrows and delete icons, summary row with SUM, and Add row button
Save validation error "In row 2, field … is required" below the table
The same table in Display mode: read-only, Yes/No text values, summary below the data, and the adjacent number field with the synced sum

Text Translations

You can translate the label (customLabel), description (description), add-row button text (repeatingAddRowLabel), and column headers (repeatingColumns, keyed by column key or id). Options of a choice column are not translated. See Translations & Multilingual Forms.

Rules and Scripts

The table is a regular field, so standard actions apply:

Configuration Example (JSON)

{
  "internalName": "BudgetItems",
  "customLabel": "Budget Items",
  "description": "The sum of the Amount column is synced to Total Budget.",
  "fieldType": "repeatingTable",
  "colSpan": 12,
  "repeatingTableConfig": {
    "addRowLabel": "Add item",
    "minRows": 1,
    "maxRows": 50,
    "syncSumToField": {
      "sourceColumnKey": "amount",
      "targetFieldInternalName": "TotalBudget"
    },
    "columns": [
      { "id": "col_name", "key": "name", "label": "Name", "type": "text", "required": true, "width": 260 },
      { "id": "col_type", "key": "type", "label": "Cost Type", "type": "choice",
        "options": ["Labor", "Vendor", "License"], "defaultValue": "Labor" },
      { "id": "col_amount", "key": "amount", "label": "Amount", "type": "number",
        "required": true, "defaultValue": 0, "summary": "sum" },
      { "id": "col_approved", "key": "approved", "label": "Approved", "type": "boolean" }
    ]
  }
}

Limitations and Tips