Property Calculator Calculation Modes

Overview

Reference for all 16 calculation modes available on a Property Calculator property-calculation rule, from evaluating NCalc expressions to creating objects, sending email, and manipulating multi-select lookups.

Each property calculation rule has a Mode that determines what kind of operation it performs. There are 16 available modes:

Quick Start: New to Property Calculator? Most configurations only need a handful of these modes. Start with Calculate Expression (computing values from other properties), Set Static Values (setting a fixed value on a condition), and Count Date Or Time (deadline/date math) — together these cover the majority of everyday calculation rules. The rest are for more specific needs.

Calculate Expression

The most commonly used mode. Evaluates a text expression and saves the result to the target property.

Use when: You need to compute or combine a value from other properties — the default choice for most calculated properties, whether that’s arithmetic, string building, or conditional logic via NCalc functions.

Setting Description
Expression The expression to evaluate — supports placeholders and NCalc functions
Evaluate as Expression When ON: uses NCalc engine for full expression evaluation. When OFF: simple text replacement (placeholders are replaced with values but no calculation occurs)
Keep Previous Content When ON: appends the new result to the property’s existing content instead of overwriting it (multiline text / MSLU targets)

Simple placeholder mode (Evaluate as Expression = OFF):

Invoice %PROPERTY_{PD.InvoiceNumber}% - %PROPERTY_{PD.CustomerName}%

Result: Invoice 12345 - Acme Corp

NCalc expression mode (Evaluate as Expression = ON):

%PROPERTY_{PD.Quantity}% * %PROPERTY_{PD.UnitPrice}% * (1 + 0.24)

Result: 6200 (if quantity=20, price=250)

See NCalc Expressions for complete expression syntax and Examples for practical examples.


Set Static Values

Directly sets a specific value to a property — no expression evaluation needed.

Use when: You need to set a fixed lookup value, a specific date, or a constant text value based on conditions.

Setting Type Description
Keep Previous Content Toggle When ON: appends to existing MSLU values instead of replacing
Value TypedValueSetter The value to set — select “Set to NULL” to clear the property, or “Static” to set a fixed value. The input type adapts to the target property (text, number, date, lookup ID, etc.)

Example — Set reviewer on approval: When a document reaches “Approved” state, set PD.ApprovedBy to user lookup ID 42.

Example — Clear a property: When status changes to “Draft”, set PD.Manager to NULL (remove the assignment).

Example — Append to MSLU: With Keep Previous Content ON, add a lookup value to an existing multi-select list without clearing previous selections.


Pick Substring

Extracts portions of text using regular expressions and saves them to one or more target properties. Can also modify the source string by removing extracted parts.

Use when: You need to parse structured text into separate properties (e.g., split a filename, extract codes from a title, parse imported text fields).

Setting Type Description
Pick Substrings From Text Source text — supports placeholders (e.g., %PROPERTY_{PD.Title}%)
Remove Substring from Main String Toggle When ON: extracted text is removed from the source property value
Substrings List One or more extraction rules (see below)
In Error Case Dropdown What happens when regex doesn’t match: Show error for user, Write error to log, Do nothing

Substring extraction rules:

Setting Description
Save Substring To Target property where the extracted text is saved
Condition Type Pick text until RegExp — extracts everything before the match. Pick first founded RegExp — extracts the match itself.
RegExp C# regular expression pattern
Pick Only Subexpression When ON: extracts only the named group (?<value>...) instead of the full match

Example — Parse “INV-2026-0042 Acme Corp”:

Source:     %PROPERTY_{PD.RawTitle}%

Substring 1:
  Condition: Pick first founded RegExp
  RegExp:    INV-\d{4}-\d+
  Save To:   PD.InvoiceNumber
  → Result:  "INV-2026-0042"

Substring 2:
  Condition: Pick text until RegExp
  RegExp:    $  (end of string)
  Save To:   PD.CustomerName
  → Result:  " Acme Corp"

Example — Extract with named group:

Source:     %PROPERTY_{PD.Code}%
RegExp:    PRJ-(?<value>\d+)-[A-Z]+
Pick Only Subexpression: 
→ From "PRJ-2026-FIN" extracts "2026"

Remove Property

Removes a property definition from the object entirely — not just clearing the value, but removing the property from the metadata card so it’s no longer visible.

Use when: A property should only exist under certain conditions and should be completely absent otherwise (e.g., remove “Rejection Reason” when status is not “Rejected”).

The target property is the one that gets removed. No additional settings — just the target property and conditions.

Example — Remove rejection fields when approved:

Target Property: PD.RejectionReason
Conditions:
  - Type: Basic Conditions
    Property "PD.Status" NOT equals "Rejected"
→ RejectionReason property disappears from the metadata card for non-rejected objects

Example — Remove optional properties by document type:

Target Property: PD.InvoiceNumber
Conditions:
  - Type: Advanced Conditions
    Expression: lookupName(%PROPERTY_{PD.DocumentType}%) != 'Invoice'
→ InvoiceNumber property is removed from non-invoice documents

The property is removed from the object’s metadata card, not from the vault’s property definition. It can reappear on future check-ins if conditions change.


Convert Date

Converts between text and Date/Time property types using configurable format strings and culture settings.

Use when: You have a date stored as text (e.g., from imported/scanned data) and need it as a proper Date/Time value, or you need to format a date into a specific text representation.

Setting Type Description
Conversion Type Dropdown String to Date — parse text into DateTime. Date to String — format DateTime as text.
Value From Property The source property to convert
String Format Text .NET date format string (default: dd.MM.yyyy HH.mm:ss). Examples: yyyy-MM-dd, MM/dd/yyyy, d.M.yyyy
Language Text CultureInfo name for locale-specific parsing (e.g., fi-FI, en-US, de-DE). Affects month names, separators, etc.
Set Timezone Toggle When ON: applies timezone conversion
Text Timezone Text Source/target timezone (default: FLE Standard Time = UTC+2 Helsinki). Uses Windows timezone IDs.

Example — Parse Finnish date:

Conversion Type: String to Date
Value From:      PD.DateText        → "15.01.2026"
String Format:   dd.MM.yyyy
Language:        fi-FI
→ Result:        2026-01-15T00:00:00 (DateTime)

Example — Format date for display:

Conversion Type: Date to String
Value From:      PD.Created          → 2026-05-07T14:30:00
String Format:   d. MMMM yyyy
Language:        fi-FI
→ Result:        "7. toukokuuta 2026"

For simple date arithmetic, use Count Date Or Time or Calculate Expression with dateAdd() instead.


Count Date Or Time

Adds or subtracts time units from a base date/time. Supports multiple chained operations and can use either fixed values or values from other properties.

Use when: You need to calculate deadlines, expiration dates, or scheduled dates with straightforward add/subtract logic.

Setting Type Description
Base Date or Time Property Starting date/time property
Date/Time Operations List One or more add/subtract operations applied sequentially

Each operation:

Setting Type Description
Increase/Decrease Dropdown Increase — add time, Decrease — subtract time, Set — set component directly
Unit Dropdown Year, Month, Day, Business Days, Hour, Minute, Second
Data Type Dropdown Fixed — use a constant value, From Metadata — read value from a property
Fixed Value Integer Number of units (visible when Data Type = Fixed)
Property Property Source property for the amount (visible when Data Type = From Metadata)

Example — Due date 30 days after invoice:

Base Date:  PD.InvoiceDate
Operations:
  1. Increase by 30 Days (Fixed)
→ Invoice date 2026-01-15 → Due date 2026-02-14

Example — Business days deadline:

Base Date:  PD.ReceivedDate
Operations:
  1. Increase by 5 Business Days (Fixed)
→ Received Friday 2026-01-10 → Deadline Friday 2026-01-17
  (skips Saturday + Sunday)

Example — Dynamic from metadata:

Base Date:  PD.ContractStart
Operations:
  1. Increase by [PD.ContractMonths] Months (From Metadata)
→ Start 2026-01-01, ContractMonths=12 → End 2027-01-01

Example — Multiple operations chained:

Base Date:  PD.ProjectStart
Operations:
  1. Increase by 6 Months (Fixed)
  2. Decrease by 5 Business Days (Fixed)
→ Deadline = 6 months after start, minus 5 business days buffer

For more complex date logic (conditional dates, comparisons), use Calculate Expression with dateAdd() function.


Period Length

Calculates the numerical difference between two date properties in configurable time units.

Setting Type Description
Start Date Property First date property
End Date Property Second date property
Unit Dropdown Day (default), Hour, Minute, Second
Modifier Integer Added to the result (default: 1). Formula: (end − start) + modifier. Set to 0 for exact difference.

Example — Contract duration in days:

Start Date: PD.ContractStart   → 2026-01-01
End Date:   PD.ContractEnd     → 2026-12-31
Unit:       Day
Modifier:   1
→ Result:   366 days (inclusive of both end dates)

Example — Exact duration (no modifier):

Start Date: PD.StartDate
End Date:   PD.EndDate
Unit:       Day
Modifier:   0
→ End 2026-01-31 − Start 2026-01-01 = 30 days

Example — Hours between timestamps:

Start Date: PD.CheckInTime
End Date:   PD.CheckOutTime
Unit:       Hour
Modifier:   0
→ 14:00 − 08:00 = 6 hours

For period calculations in months or years, use Calculate Expression mode with dateDiff() function.


Filter Lookup Values

Removes lookup values from a Multi-Select Lookup property that don’t match specified filtering conditions. The conditions are evaluated against each linked object — those that fail are removed from the MSLU.

Use when: You want to automatically clean up MSLU values based on the current state of referenced objects (e.g., keep only active items).

Setting Type Description
Lookup Values From Property The MSLU property to filter
Conditions List<ConditionsConfig> Conditions evaluated against each linked object — objects that match are KEPT

Example — Keep only active contracts:

Lookup Values From: PD.RelatedContracts
Conditions:
  - Type: Basic Conditions
    Property "Status" equals "Active"
→ Removes any contract from the MSLU whose Status ≠ Active

Example — Keep only items with value > 0:

Lookup Values From: PD.InvoiceLines
Conditions:
  - Type: Advanced Conditions
    Expression: %PROPERTY_{PD.Amount}% > 0
→ Removes zero-value line items from the list

Order Lookup Values

Reorders items in a Multi-Select Lookup property according to configurable sort criteria. Can sort alphabetically or numerically, by any property of the linked objects.

Use when: The display order of MSLU items matters (e.g., sorted by date, name, priority, or amount).

Setting Type Description
Lookup Values From Property The MSLU property to reorder
Order Type Dropdown Alphabetical or Numerical
Reverse Order Toggle When ON: descending order (Z→A or high→low)
Order By Text Expression/placeholder for the sort key — reads a property from each linked object (e.g., %PROPERTY_{PD.Name}%)
Amount of Lookups Integer Maximum number of items to keep after sorting (0 = keep all)

Example — Sort line items by amount (highest first):

Lookup Values From: PD.InvoiceLines
Order Type:         Numerical
Reverse Order:      
Order By:           %PROPERTY_{PD.Amount}%
Amount of Lookups:  0
→ Lines sorted from highest to lowest amount

Example — Keep top 5 by date:

Lookup Values From: PD.RelatedDocuments
Order Type:         Alphabetical  (dates sort alphabetically in ISO format)
Reverse Order:      
Order By:           %PROPERTY_{PD.Created}%
Amount of Lookups:  5
→ Keeps only the 5 most recently created documents

Values From MSLU

Collects property values from all objects referenced in a Multi-Select Lookup and writes the aggregated result to the target property. Can filter which linked objects contribute.

Use when: You need to gather data from multiple related objects into a single property (e.g., collect all descriptions, concatenate names, merge lookup values).

Setting Type Description
Multi-Select Lookup Property The MSLU property containing object references
Conditions for Listed Object List<ConditionsConfig> Optional filter — only objects matching these conditions contribute values

The target property receives the collected values. For text properties, values are concatenated. For MSLU properties, lookup values are merged.

Example — Collect all task names into a text field:

Multi-Select Lookup:          PD.ProjectTasks
Target Property:              PD.TaskSummary
Conditions for Listed Object: (none — include all)
→ Result: "Design, Development, Testing, Deployment"

Example — Collect active members only:

Multi-Select Lookup:          PD.TeamMembers
Target Property:              PD.ActiveMembers
Conditions for Listed Object:
  - Type: Basic Conditions
    Property "Status" equals "Active"
→ Only active team members appear in the result

For numeric aggregation (sum, average, etc.) over MSLU values, use Calculate Expression with chained placeholders and aggregation functions instead.


Search Objects

Searches the vault for objects or value list items matching specified conditions and saves the results as a lookup property value. Supports both object searches and value list item lookups.

Use when: You need to dynamically find and link objects based on property matches, or resolve value list items by name/external ID.

Setting Type Description
Search Value List Items Toggle When ON: searches value list items instead of objects
Search Value List Items By Dropdown Name, External ID, or Internal ID (visible when above is ON)
Value List Search Value Text The value to search for — supports placeholders (visible when above is ON)
Property Conditions List Property-based search conditions for object searches
Additional Conditions Search Conditions Standard M-Files search conditions for further filtering
Keep Previous Content Toggle When ON: appends results to existing MSLU values
Max Number of Results Integer Maximum number of results to return (0 = unlimited)

Example — Find invoices for the same customer:

Target Property:      PD.RelatedInvoices (MSLU)
Search Value List Items: 
Property Conditions:
  - Object Type = Invoice
  - PD.Customer equals %PROPERTY_{PD.Customer}%
Max Results:          10
→ Populates MSLU with up to 10 invoices for the same customer

Advanced options

Setting Type Description
Value Delimiter Text Delimiter for splitting the search value into multiple terms
Include Deleted Objects Toggle When ON: also searches deleted objects
Add version-specific reference Toggle When ON: each result references the exact version of the found object at calculation time, instead of always following its latest version. Applies to object search only (hidden when Search Value List Items is ON).

Concept — version-specific references: By default, a saved lookup follows the latest version of its target object as that object keeps changing. Enabling a version-specific option instead pins the reference to the exact version that existed when the calculation ran, so the metadata card keeps pointing at that historical version even after the target object is edited further. This mechanism is shared by Add version-specific reference here, Source Version Reference Is Version-Specific in History, and the lookupVersion() NCalc function.


Create Object

Creates a new M-Files object with configured property values. Can create from scratch or as a copy of an existing object. Supports creating multiple objects from value combinations.

Use when: You need to automatically generate new objects based on existing object data (e.g., create a task when a document reaches a specific state, generate sub-items from a template).

Setting Type Description
Create as Copy Toggle When ON: copies an existing object (including files). When OFF: creates a new blank object.
Source Object Text GUID or placeholder for the object to copy (visible when Create as Copy = ON)
Object Type ObjType Type of the new object (visible when Create as Copy = OFF)
Separate Object for Each Value Combination Toggle When ON: creates multiple objects, one per value combination
Value Combinations List Property mappings that define how to split into multiple objects. Each ValueCombination maps PropertyValuesFromPropertyValueTo.
Create Only If Does Not Exist Toggle When ON: checks for duplicates before creating
Conditions for Duplicate Detection List Property conditions for checking if a matching object already exists
Other Property Values List Additional properties to set on the new object (supports placeholders from source)
Create in Background Toggle When ON: creates the object in a background task instead of during check-in

Example — Create task from document:

Create as Copy: 
Object Type:    Task
Create Only If Does Not Exist: 
Duplicate Detection:
  - PD.SourceDocument = %PROPERTY_{PD.ObjectID}%
Other Property Values:
  - PD.TaskName       = "Review: %OBJTITLE%"
  - PD.AssignedTo     = %PROPERTY_{PD.Reviewer}%
  - PD.DueDate        = (calculated separately)
  - PD.SourceDocument = %PROPERTY_{PD.ObjectID}%
Conditions:
  - Status changes to "Pending Review"
→ Creates one task per document, prevents duplicates

This operation creates real objects in the vault. Use Create Only If Does Not Exist and test conditions carefully to avoid creating duplicate objects on repeated check-ins.

Advanced options

These settings apply to the less common “copy as template” and “split into multiple objects” variants of Create Object:

Setting Type Description
Properties to be Removed List Properties to remove from the copy (visible when Create as Copy = ON) — typically used with Create as Copy to clear fields like approvals from a copied template
Append Text to File Names Text Text (supports placeholders) appended to each copied file’s name; visible when Create as Copy = ON

History

Copies property values and/or files from a previous version of the current object. Can target a specific version based on conditions and map source properties to different target properties.

Use when: You need to preserve or restore values from previous versions (e.g., track original submission date, restore overwritten values, archive historical data).

Setting Type Description
Conditions for Source Version List<ConditionsConfig> Conditions that identify which previous version to copy from (e.g., “version where Status = Submitted”)
Replace Files Toggle When ON: replaces current files with files from the matched version
Throw Exception Toggle When ON: throws an error if no matching version is found
Property Mappings List Source → Target property mappings

Property Mapping:

Setting Type Description
Source Property Text Placeholder for the property to read from the historical version (e.g., %PROPERTY_{PD.Approver}%)
Target Property Property The property on the current version where the value is saved

Example — Preserve original submission date:

Conditions for Source Version:
  - Type: Basic Conditions
    Property "PD.Status" equals "Submitted"  (find first version in Submitted state)
Property Mappings:
  - Source: %PROPERTY_{PD.SubmissionDate}% → Target: PD.OriginalSubmissionDate
Throw Exception: 
→ Copies the submission date from the version when the object was first submitted

Advanced options

Setting Type Description
Copy from All Matching Versions Toggle When ON: copies from all versions that match (merges results). When OFF: copies from the first matching version.
Source Version References Property Optional lookup/MSLU/multiline-text property that references to the matched source version(s) are added to
Source Version Reference Is Version-Specific Toggle Only shown when Source Version References is set. Default ON: pins the reference to the exact historical version; OFF: follows the source object’s latest version — see the version-specific references concept box in Search Objects for how this mechanism works.

File Operation

Renames files attached to an object by adding a prefix and/or postfix to the filename. All naming fields support placeholders.

Use when: You need to rename files based on metadata values (e.g., add document number as prefix, append revision to filename).

Setting Type Description
Operation Type Fixed PrefixPostfix — adds prefix and/or postfix to filenames
Prefix Text Text to prepend to each filename — supports placeholders
Postfix Text Text to append to each filename (before extension) — supports placeholders
Always Add Prefix and Postfix Toggle When ON: always applies. When OFF: only applies if the filename doesn’t already have the prefix/postfix.

Example — Add document number as prefix:

Prefix:    %PROPERTY_{PD.DocumentNumber}% -
Postfix:   (empty)
Always Add: 
→ "Report.pdf" → "DOC-2026-0042 - Report.pdf"
→ Next check-in: unchanged (prefix already present)

Example — Add revision as postfix:

Prefix:    (empty)
Postfix:    _Rev%PROPERTY_{PD.Revision}%
Always Add: 
→ "Drawing.dwg" → "Drawing_RevC.dwg"
→ Next check-in with Rev D: "Drawing_RevC_RevD.dwg" (Always Add = ON)

Example — Full rename:

Prefix:    %PROPERTY_{PD.ProjectCode}% -
Postfix:    - v%PROPERTY_{PD.Version}%
Always Add: 
→ "Specification.docx" → "PRJ-2026 - Specification - v3.docx"

Send Email

Sends an email message with configurable recipients, subject, and body. All text fields support placeholders, allowing dynamic content from the current object.

Use when: You need automated email notifications triggered by object changes (e.g., approval notifications, deadline alerts).

Setting Type Description
Allow Email Sending Toggle Master switch — must be ON for emails to be sent
To Text Recipient email address(es) — supports placeholders (e.g., %PROPERTY_{PD.ContactEmail}%)
Subject Text Email subject line — supports placeholders
Body Text Email body content — supports placeholders and HTML markup

Example — Approval notification:

Allow Email Sending: 
To:      %PROPERTY_{PD.Approver}.PROPERTY_{PD.Email}%
Subject: Approval Required: %OBJTITLE%
Body:    <h2>Document Pending Approval</h2>
         <p>Document <b>%OBJTITLE%</b> requires your approval.</p>
         <p>Submitted by: %PROPERTY_{PD.SubmittedBy}%</p>
         <p>Amount: %PROPERTY_{PD.Amount}% EUR</p>
Conditions:
  - Status changes to "Pending Approval"

Example — Deadline warning:

To:      %PROPERTY_{PD.ProjectManager}.PROPERTY_{PD.Email}%
Subject: ⚠️ Contract expiring: %OBJTITLE%
Body:    Contract %OBJTITLE% expires on %PROPERTY_{PD.EndDate}%.
         Please review and take action.
Conditions:
  - Advanced Condition: dateDiff(today(), %PROPERTY_{PD.EndDate}%, 'days') <= 30

Email sending is a side effect. The Expression Builder does NOT send emails — they are only sent during actual check-in processing.


Grouping Level

Creates a named sub-group of property calculations for organizational purposes. The group itself does not perform any calculation — it acts as a container with its own conditions.

Use when: You have many related calculations that benefit from being grouped together with a descriptive name, or when you want shared conditions for a block of rules.

Setting Type Description
Group Name Text Name displayed in the configuration editor (used as the rule name)
Properties List Nested AutomaticValueProperty rules that execute within this group
Conditions List Conditions that apply to the entire group — if conditions fail, no nested rules execute

Example — Group invoice line calculations:

Grouping Level: "Line Item Calculations"
  Conditions:
    - Changed Propertyvalues: PD.Quantity, PD.UnitPrice
  Properties:
    ├─ Rule 1: Calculate Line Total
    ├─ Rule 2: Calculate Tax Amount
    └─ Rule 3: Calculate Line Grand Total
→ All three rules only execute when Quantity or UnitPrice changes

This is purely organizational — the same rules could be placed at the top level. But grouping keeps complex configurations readable and allows shared conditions.