🚀 JWT 3.0 is out 🚀 

The app was completely overhauled, and so was the documentation: Jira Workflow Toolbox (Server/Data Center) Home

The page you are viewing is still valid for all app versions prior to 3.0.

On this page


Examples of Parser expressions

This page presents a collection of expressions valid for the Expression Parser.

Text Composition and Format

ExpressionExample of Returned ValueNotes
"Current issue was reported on " + %{00009} + " by " + %{00005} + "."Current issue was reported on 2014-09-03 19:28 by John Nash.%{00009} = Date and time of creation
%{00005} = Reporter's full name
"Today is " + dayOfTheWeekToString({00057}, USER_LOCAL, USER_LANG) + "."Today is Monday.Tells current day of the way in users local timezone and language.
{00057} = Current day and time
"Number of hours since issue creation: " + round(({00057} - {00009}) / {HOUR}) + " hours."Number of hours since issue creation: 75 hours.{00057} = Current day and time
%{00009} = Date and time of creation
"Number of days to due date: " + floor(({00012} - {00057}) / {DAY}) + " days."Number of days to due date: 2 days.{00012} = Due Date
{00057} = Current day and time
"<ul>" + replaceAll(toString(textOnStringList(toStringList(%{nnnnn}), "<li>" + userFullName(^%) + "</li>")), ">,", ">") + "</ul>"Compose an HTML bulleted list (<ul><li>) with user's full name in a Multi-User Picker custom field.Replace %{nnnnn} with field code of a Multi-User Picker custom field.


Math Calculus

ExpressionReturned ValueNotes
max(count(subtasks(%{00041})) - 1, 0)

or since version 2.2.1: count(siblingSubtasks())
For a sub-task, the number of sibling sub-tasks.Function max(x, y) is used to avoid returning -1 when used with non sub-task issues.
%{00041} = Parent's issue key
{10000} = null ? 1 : {10000} + 1Formula to increment a numeric custom field, setting it to 1 if it's initially unset.{10000} is the field code for a supposed numeric custom fields.
{10000} + {10001} + {10003}Formula for summing 3 numeric custom fields when we are certain that all 3 the fields are initialized. In case any of these fields is not initialized, an error is raised and any of the following 2 expression examples should be used.{10000}, {10001} and {10003} are three numeric custom fields.
({10000} = null ? 0 : {10000}) + ({10001} = null ? 0 : {10001}) + ({10003} = null ? 0 : {10003})Formula for summing 3 numeric custom fields when some of them may be uninitialized. When any of this fields is not initialized a zero value is assumed.

{10000}, {10001} and {10003} are three numeric custom fields.
sum([{10000}, {10001}, {10003}])A more compact syntax for summing 3 numeric custom fields when some of them may be uninitialized.
Version 2.2.16 or higher is required.
{10000}, {10001} and {10003} are three numeric custom fields.
This syntax is available since version 2.2.16.


Date-Time Calculus

ExpressionReturned ValueNotes
{00012} - 6 * {DAY}Calculates a date 6 natural days earlier than Due Date{00012} = Due Date
addTimeSkippingWeekends({00009}, 36*{HOUR} + 45*{MINUTE}, LOCAL)Returns a date-time value equivalent to adding 36 hour and 45 minutes to date and time of issue creation, skipping the periods of time which correspond to weekend.{00009} = Date and time of creation
addTimeSkippingWeekends({00009}, 36*{HOUR} + 45*{MINUTE}, LOCAL, {FRIDAY}, {SATURDAY})Same as previous expression, but using Israeli weekend.Israeli weekend is on Friday and Saturday.
addDaysSkippingWeekends({00012}, -6, LOCAL)Calculates a date 6 work days earlier than Due Date for Jira Server's local timezone.{00012} = Due Date
Work days depend on timezone, since certain time moment maybe Sunday in certain timezones, and Monday in another ones.
subtractDatesSkippingWeekends({00012}, {00057}, LOCAL)/{DAY}Returns the number of working days from Current Date and Time to Due Date, i.e., skipping weekends in Jira server's timezone.{00012} = Due Date
{00057} = Current day and time
round(({00057} - {00009}) / {HOUR})Number of hours since issue creationFunction round() approximates the number of hours to the nearer integer.
{00057} = Current day and time
%{00009} = Date and time of creation
floor(({00012} - {00057}) / {DAY})Number of days to Due DateFunction floor() approximates the number of days by removing the fractional part.
{00012} = Due Date
{00057} = Current day and time
datePart({00057}, LOCAL) + (dayOfTheWeek({00057}, LOCAL) = 7 ? 6 : 6 - dayOfTheWeek({00057}, LOCAL)) * {DAY}Returns a date value for next Friday, or for today if it's Friday{00057} = Current day and time
Example
datePart({00057}, LOCAL) + (dayOfTheWeek({00057}, LOCAL) = 6 ? 7 : (dayOfTheWeek({00057}, LOCAL) = 7 ? 6 : 6 - dayOfTheWeek({00057}, LOCAL))) * {DAY}Returns a date value for next Friday, even if today is Friday.{00057} = Current day and time
Example
floor(subtractDatesSkippingWeekends({00057}, {00009}, LOCAL) / {DAY}) + " days " + floor(modulus(subtractDatesSkippingWeekends({00057}, {00009}, LOCAL), {DAY}) / {HOUR}) + " hours " + round(modulus(subtractDatesSkippingWeekends({00057}, {00009}, LOCAL), {HOUR}) / {MINUTE}) + " minutes"Calculates the time since issue creation skipping weekends, and shows it as a text like this: 12 days 6 hours 34 minutes.{00057} = Current day and time
%{00009} = Date and time of creation
floor(({00057} - {00009}) / {DAY}) + " days " + floor(modulus(({00057} - {00009}), {DAY}) / {HOUR}) + " hours " + round(modulus(({00057} - {00009}), {HOUR}) / {MINUTE}) + " minutes"Calculates the time since issue creation, and shows it as a text like this: 12 days 6 hours 34 minutes.{00057} = Current day and time
%{00009} = Date and time of creation


Issue Selection

ExpressionReturned ValueNotes
filterByFieldValue(subtasks(), %{00094}, ~ , "Component A")

or alternatively

filterByPredicate(subtasks(), %{00094} ~ "Component A")
Returns an issue list with sub-tasks having "Component A" among its components.%{00094} = Components
except(subtasks(%{00041}), issueKeysToIssueList(%{00015}))

or alternatively

filterByPredicate(subtasks(%{00041}), ^%{00015} != %{00015})
Returns an issue list with sibling sub-tasks, i.e., parent's sub-tasks except current issue.%{00041} = Parent's issue key
%{00015} = Issue key
filterByFieldValue(filterByIssueType(getIssuesFromProjects(%{00018}), %{00014}), %{00000}, =, %{00000})

or alternatively

filterByPredicate(getIssuesFromProjects(%{00018}), ^%{00014} = %{00014} AND ^%{00000} = %{00000})
Returns an issue list with all issues in the same project as current issue, with same issue type and same summary.

Might be used in combination with function count() for creating a validation to avoid issue creation when an issue with same summary already exists in the project and issue type.
%{00018} = Project key
%{00014} = Issue type
%{00000} = Summary



Working with Fields in Linked Issues and Sub-tasks

ExpressionReturned ValueNotes
filterByCardinality(fieldValue(%{00094}, subtasks()), =, count(subtasks()))["Component A", "Component B", "Component C"]Returns a string list with the Components present in all sub-tasks of current issue, i.e., those components common to all sub-tasks.
%{00094} = Components
{00012} > max(fieldValue({00012}, union(linkedIssues("is blocked by"), subtasks())))Validation to check that: Due Date is greater than latest Due Date among blocking issues and sub-tasks.Function max(number_list) is available since version 2.1.22
{00012} = Due Date
count(filterByFieldValue(subtasks(), %{00070}, =, "") UNION filterByFieldValue(subtasks(), %{00012}, =, "")) = 0

or alternatively

count(filterByPredicate(subtasks(), ^%{00070} = null OR ^%{00012} = null)) = 0
Expression for checking whether all sub-tasks of current issue have fields Due date and Environment set.%{00012} = Due date
%{00070} = Environment
count(filterByPredicate(linkedIssues("is Epic of"), ^%{00028} != null OR ^{00012} = null)) = 0This validation allows certain transition in Epic's workflow to be executed, only if all the tasks are unresolved and have Due Date set.^%{00028} = Resolution in foreign issues
^{00012} = Due Date in foreign issues
Example


Logical Constructions

ExpressionReturned ValueNotes
!(%{00017} = "Blocker" OR %{00017} = "Critical") OR {00012} != nullValidation for checking that: If Priority is "Blocker" or "Critical" then Due Date must be initialized.It is based on equivalent logical constructions: A implies B = !A OR B
%{00017} = Priority
{00012} = Due Date
%{00017} = "Blocker" OR %{00017} = "Critical" IMPLIES {00012} != nullValidation for checking that: If Priority is "Blocker" or "Critical" then Due Date must be initialized.Same as former example but using logical connective IMPLIES, which is available since version 2.1.22.
%{00017} = Priority
{00012} = Due Date
{00012} = null OR {00012} >= ({00009} + 2 * {DAY})Validation for checking: If Due Date is set then it must be equal or grater than Day and Time of Creation plus 2 days.{00012} = Due Date
{00009} = Date and time of creation

Boolean Expression examples

Boolean expressions are logical constructions that return true or false, and are used for implementing conditions, validations, and conditional executed post-functions.