ConfiForms add-on has a macro called ConfiForms IFTTT to enable integrations with external systems or with Confluence itself.
Below, you can find a list of integrations scenarios the macro can support and it's configuration details
Actions list
There are 24 different actions supported by IFTTT out-of-the-box (some actions are very generic, so the integration scenarios number is a lot bigger)
Add Page Label
Add Page Watcher
AppLink service
Copy ConfiForms Data
Copy ConfiForms Data to DB
Create Attachment
Create BlogPost
Create (Update) ConfiForms Entry
Create JIRA Issue
Create Page
Create Task
Delete ConfiForms Entry
Delete Page
Force Page Re-index
Make request
Move Attachment
Move Page
Remove Page Label
Remove Page Watcher
Rename Page
Render (execute) macro
Run JavaScript
Send Email
Send Notification
Update JIRA Issue
Each IFTTT action has own parameters, but the following parameters are supported by all actions
When specified (in the docs below, for an action) - a macro body is used as a template, otherwise leave it empty
Parameter name
Description
Event
Type of event in ConfiForms this IFTTT action should be fired on
On Created
On Modified
On Deleted
Action to perform
One of the actions to perform. See the list above
Do not report error
A checkbox field to disable error reporting and continue with the workflow even if current macro has resulted in an error
Custom name for the action result
This is used in advanced techniques, when you want to use the result of the IFTTT in next IFTTT or want to save the result of some IFTTT or some part of the result back into a ConfiForms record. See below the result types and the contents stored in the result for each IFTTT action.
A result (depending on the action type) is stored in the context in the variable prefixed by "iftttResult_"
And is accessible using the Velocity notation via
${iftttResult_RESULTNAME}
Where "RESULTNAME" is the value given in this macro parameter.
Some results hold rich objects. See "Result type" section for exact IFTTT action below
Add Page Label
Adds label to a page, you can apply a label (or labels) to page sub-pages as well
Any other property, which Page object provide (any "get" method)
Applink Service
Sends a request to configured Application link service
A user specifies which HTTP method to use, which URL service to execute (url must be given as "relative" url, this means it is "concatenated" with the base url in your applink service)
Response returned from a request to a service is returned and stored as result
If response is a JSON then you can apply Virtual functions to work on a JSON object
Please note that virtual functions could be applied only on ConfiForms fields, not the IFTTT result directly. This means you will need to save the response to some ConfiForms field temporarily in order to apply the functions and convert the response to JSON.
Copy ConfiForms Data
Copies data from one ConfiForms form to another, can have custom mapping for fields and have a filter applied before copying the data
Also, it can "flatten" the multi-select values to copy the data to a new form in an "expanded" view
Please note that if you leave the filter empty then ALL the records from a source form will be copied to a destination form.
To copy just one, current record, you will need to apply the following filter
id:[entry.id]
It is important to note that this action never fires any other "Create ConfiForms Entry", "Delete ConfiForms Entry" or "Copy ConfiForms Data" for the entry created
Result type:
Last created (copied) record as object. This means that you can access any property available in ConfiForms record. Please note that the values accessed using the Velocity notation (${}) return "raw" (internal) values. More on this Accessing field values and properties
Copy ConfiForms Data to DB
Executes a SQL statement you specify on your database (on the database connection you have configured)
You must specify a valid SQL statement - either INSERT or UPDATE
Similar to "Copy ConfiForms Data" action you can filter records on original form before copying, as well as "flatten" records in order to have multi-value fields as separate rows (if necessary)
You need to specify field name to use to store the reference to a created attachment - ConfiForms field of type "File" is the preferred field type to store this
Macro body:
Template / content to use to generate the contents
You can reference any field value using [entry.fieldname] notation, more on this Accessing field values and properties
Result type:
File contents as text into the result
Create BlogPost
Creates blog post based on the contents in macro body and the title given.
Blog post will be created in a Confluence space specified.
You can apply labels to a created blog post
Macro body:
Template / content to use to generate the contents
You can reference any field value using [entry.fieldname] notation, more on this Accessing field values and properties
${iftttResult_MYRESULT.id}
${iftttResult_MYRESULT.displayTitle}
other properties from BlogPost object
(if result was named "MYRESULT")
Create (Update) ConfiForms Entry
Creates (or updates) ConfiForms Entry in the specified form
It is important to note that this action never fires any other "Create ConfiForms Entry", "Delete ConfiForms Entry" or "Copy ConfiForms Data" for the entry created
Additionally, you can stop the propagation of the "create/update" events completely.
To update the current ConfiForms record leave the "Reference to form and it's location" empty and in parameters to set specify:
entryId=[entry.id]
To target the current record
Result type:
Created entry object, same as in Copy ConfiForms Data
${iftttResult_MYRESULT.somefield}
Where "somefield" is the name of the field in ConfiForms form
Create JIRA Issue
Creates JIRA issue based on the JSON mapping given
You can add users as watchers to created JIRA issue. Must be a valid user (list of users) given
When you want to add an attachment to JIRA issue from ConfiForms file field - you will need to place the "ConfiForms Field" macro inside the ConfiForms IFTTT macro body. This way, you will tell ConfiForms, in addition to issue creation, to upload the file to JIRA. You can upload multiple files, just by placing additional ConfiForms Field macros referencing other file fields into the macro body
Macro body is evaluated as Velocity Template! This allows you to use #if #end constructions around JSON mapping parts.
Field values are stored in Velocity templates under field names!
Macro body:
JSON mapping wrapped in "No Format" macro to have a raw text
In Confluence the page title should be unique within a Confluence space.
ConfiForms will create a new version of the page if the page with given title already exists in the Confluence space specified
Important to note is that if you put ConfiForms Field macros inside the IFTTT macro body and this macros will be WITHOUT a "view" macro around them, then a ListView macro with a filter set to current record is created as a wrapper for ALL the content in the IFTTT macro body.
If you want to avoid "auto-wrapping" then you need to make sure that all ConfiForms Field macros you put are within the "view" macro (TableView, ListView, CardView, etc)
In contrast, when you use [entry.fieldname] notations then there is no need to wrap anything in views macros. But in this case the data is static data copied (not referenced) there from ConfiForms
All references (like [entry.filed_name]) inside the IFTTT macro body to ConfiForms fields are evaluated against the current record.
If you have an IFTTT action to create a page with ConfiForms Form and it should have filters or field rules which in the created page should look like [entry.fieldname] you will need to wrap these into a virtual function
Important! Function names and field names are CASE SENSITIVE. It is very important to follow the correct letter casing as per documentation
In order to make it easier to integrate with other external systems, such as JIRA, for example, or transform values as you like and need we have implemented so called "virtual" functions, what you can call on field values.
Usage:
When using in IFTTT macro body or in ListView/PlainView/CalendarView - the notation would be: [entry.fieldname.virtual_function] Please note that accessing values via [entry.field_name] notations brings you internal values.. which means you will need to make sure they are what you need - formatting dates via formatDate, accessing .label properties for choice-based fields and things like that.
When using in ConfiForms Field macro then reference it by a field name, adding the virtual function name: fieldname.virtual_function
Useful, when you try to prepare a JSON or some other format when used together with IFTTT macro to enable integrations with other systems
Functions support chaining ! That means you can apply function on a result of the previous function as much as you like
See also Accessing field values and properties . You can use complex properties in your filters. For example filtering dropdown fields by values and by labels, filtering page type fields by page metadata fields, filtering user fields by, for example - email property
As of now, the following functions are supported:
CORE - means the function is available since ConfiForms version 1.x
Function
Description
Using in ConfiForms Field macro
Using in ListVIew/PlanView/CalendarView or in IFTTT macro body
urlencode CORE CLOUD
Does URL encode on given value, see "urlEncode" method in
Same as "formatDate" method above, but specifies constant dateformat pattern ("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"), should be compatible with ISO 8601 standard as JIRA requires when setting timestamps to JIRA fields
myfield.jiraDateTime
[entry.myfield.jiraDateTime]
escapeJSON CORE CLOUD
Escapes illegal characters in the field value to generate a valid JSON property. New lines, quotes, tabs and etc will be properly escaped
[entry.myfield.escapeJSON]
myfield.escapeJSON
[entry.myfield.escapeJSON]
asArray
asArrayMultiSelect
asArrayMultiUserPicker
CORE CLOUD
Tries to create an array from the value. Useful when you want to pass ConfiForms multi-select values to JIRA. Something like
"customfield_XXXX" : [[entry.myfield.asArray]]
this will generate
"customfield_XXXX" : ["val1","val2"]
assuming "myfield" field is a multi select and has 2 values: val1 and val2
There are variations to support other multi-select fields in JIRA
asArrayMultiUserPicker (can be used to generate arrays for both: multi-user and multi-group field types)
myfield.asArray
myfield.asArrayMultiSelect
myfield.asArrayMultiUserPicker
[entry.myfield.asArray]
[entry. myfield.asArrayMultiSelect]
[entry. myfield.asArrayMultiUserPicker]
asArray(separator)
FROM V. 1.35
CLOUD
Same as "asArray" without a parameter, but allows you to set own separator
Example:
asArray(') will wrap the values into list of 'v1', 'v2'...
asArray will do the same with default separator ", like this "v1", "v2"
asArray(_) will output _v1_, _v2_
myfield.asArray(separator)
[entry.myfield.asArray(separator)]
asArrayOfIds
CORE
CLOUD
Same as the above, but exporting IDs of the multi-select values in the following format:
"1", "2"
myfield.asArrayOfIds
[entry.myfield.asArrayOfIds]
asArrayOfKVPairs(key)
FROM V. 1.35
CLOUD
Will output the list of values in a format:
{"key":"value"}, {"key": "value2"}
Useful for adding JIRA labels, like when giving a key as "add" → asArrayOfKVPairs(add)
{"add": "value"}, {"add", "value2"}
[entry.asArrayOfKVPairs(key)] will produce something like {"key":"value"}, {"key": "value2"}
replaceCRLFWithBR CORE CLOUD
Replaces CR/LF with <br/> tag to show with line brakes in HTML (useful when you reference the textarea field using [entry.] notation)
myfield.replaceCRLFWithBR
[entry.myfield.replaceCRLFWithBR]
replaceBRWithCRLF CORE CLOUD
Does the opposite to "replaceCRLFWithBR" and replaces <br/> tags with CRLF
asUserFullNames CORE CLOUD
Works only with User multi-select fields and shows list of full names for selected users
myfield.asUserFullNames
[entry.myfield.asUserFullNames]
asUserEmails CORE CLOUD
Works only with User multi-select fields and shows list of emails for selected users
myfield.asUserEmails
[entry.myfield.asUserEmails]
asUserNames CORE CLOUD
Worksonly with User multi-select fieldsand shows list of usernames for selected users
If value could not be formatted according to given format then value will be returned as is
Can be used with any number (and not only currency)
myfield.formatCurrency(JAVA_FORMAT)
myfield.formatCurrency()
(default decimal format is used if empty)
[entry.myfield.formatCurrency(JAVA_FORMAT)]
(no quotes, JAVA_FORMAT could be empty, default will be used)
[entry.myfield.formatCurrency(# ###.##)]
[entry.myfield.formatCurrency(# ###.00)]
formatNumber CORE CLOUD
alias to formatCurrency
myfield.formatNumber(JAVA_FORMAT)
myfield.formatNumber()
(default decimal format is used if empty)
[entry.myfield.formatNumber(JAVA_FORMAT)]
[entry.myfield.formatNumber(# ###.##)]
[entry.myfield.formatNumber(# ###.00)]
asFilteredBy(FILTER) CORE CLOUD
Since
3.0.0 supports ConfiForms Filters expression when applied on a smart field
Very powerful function to extract the value by given filter (mostly used for multi-value fields).
Especially useful with Multi-select fields which are of type "smart fields", the ones referencing other forms and fields
Example:
You have one form which has a field called "mf" which holds multi-value references to another form which has the following fields: name, surname, position
Then... when showing the data from the first form you can actually show only specific choices.
For example:
entry.mf.asFilteredBy(name:Alex) - to show only persons selected with name Alex only (here "name" references a field in 2nd form)
entry.mf.asFilteredBy(surname:Ve*) - to show only persons selected with surnames starting with "Ve" only (here "surname" references a field in 2nd form)
entry.mf.asFilteredBy(position:CEO) - to filter OUT all those selected who are NOT in CEO position
entry.mf.asFilteredBy(FILTER)
Filter should be in a format:
property:filter
[entry.mf.asFilteredBy(name:Alex)]
The following filters are supported:
value*
*value
*value*
*
[empty]
trimAllSpaces CORE CLOUD
Removes all the spaces in the field value.
Can be used when creating page labels automatically from ConfiForms field values and want to ensure the value is taken as a label and not split by spaces into differenet labels
entry.myfield. trimAllSpaces
[entry.myfield. trimAllSpaces]
camelCase CORE CLOUD
Makes a CamelCase string from a given value
entry.myfield.camelCase
[entry.myfield.camelCase]
camelCaseAndTrim CORE CLOUD
Makes a CamelCase string from a given value and, additionally, removes all the spaces
entry.myfield.camelCaseAndTrim
[entry.myfield.camelCaseAndTrim]
addCRLF
CORE
CLOUD
Adds CR and LF characters after the value
entry.addCRLF
[entry.addCRLF]
addCRLFHtml
CORE
CLOUD
Adds <br/> (brake) after the value in HTML format
entry.addCRLFHtml
[entry.addCRLFHtml]
trunc(NUMBER)
CORE
CLOUD
truncLeft(NUMBER)
CORE
CLOUD
truncRight(NUMBER)
CORE
CLOUD
Truncates the value. Leaves "n" first symbols
entry.trunc(100)
[entry.trunc(100)]
trim(NUMBER)
trim() - will trim the value from leading/trailing spaces
CORE
CLOUD
trimLeft(NUMBER)
CORE
CLOUD
Trims the value, Skips "n" first symbols
entry.trim(10)
[entry.trim(10)]
trimRight(NUMBER)
CORE
CLOUD
Trims the value, Removes "n" last symbols
asAttachment
asAttachment(n)
CORE
You can reference a particular attachment stored in Confluence and linked though ConfiForms Field (either File or Attachment picker)
n - is the index of the attachment stored/linked using ConfiForms Field. Index starts with 0. When no index is specified, then the 1st attachment is taken (1st attachment is stored with index 0)
This means that
asAttachment = asAttachment(0)
This function is a "bridge" to get other properties of the attachment stored. See below.
entry.asAttachment
[entry.asAttachment]
[entry.asAttachment(0)]
[entry.asAttachment(1)]
asAttachment.base64
asAttachment(1).base64
CORE
Returns bas64 encoded string of the file contents in this attachment
Encodes binary data using a URL-safe variation of the base64 algorithm but does not chunk the output. The url-safe variation emits - and _ instead of + and / characters.Note: no padding is added.
FROM V. 2.24.7 base64 function supports true/false as parameters to generate base64 with or without padding
base64(true) - generates URL-safe output (same as without parameter)
asAttachment.displayTitle
asAttachment.id
asAttachment.downloadPath
asAttachment.contentType
and many other properties of the Attachment object
asAttachment(1).displayTitle - also perfectly valid and will try to get the display title for the attachment stored "second" in the field
base64Decode
FROM V. 3.10.4
CLOUD
Decodes a base64 string into original text value
asUsers
FROM V. 1.39.2
Converts multi-user / multi-owner (ownedBy field in ConfiForms) field values to list of user objects, which can be then transformed into the desired output as needed, for example:
ownedBy.asUsers.transform(email)
Any property of the User object (see below) is accessible
asUser.username
asUser.fullName
asUser.email
asUser(n).username
asUser(n).fullName
asUser(n).email
CORE
When working with multi-select user control/field and want to get a particular user info
Only works with Multi-select user field!
asEntryRef(REF_TO_ENTRY)
CORE
CLOUD
Example:
[entry.id.asEntryRef(entry.id)]
This will return
[entry.id]
When this is necessary?
The use case is when you use it within an IFTTT or have a ListView which has another ListView inside and you want to prevent ConfiForms from applying the context variables onto the sub-lists
The function can be used with any field type (as long as the field exists) and actually the following constructions are perfectly valid
[entry.id.asEntryRef(entry.somefield)] will return [entry.somefield]
[entry.id.asEntryRef(entry.mytextfield)] will return [entry.mytextfield]
[entry.id.asEntryRef(entry.anotherfield)] will return [entry.anotherfield]
[entry.id.asEntryRef(entry.id)] will return [entry.id]
As you can see we apply the function on the same ID field (exists in every ConfiForms record) and the parameter you give in is the important bit in all this...
So, the parameter (PARAM) you give to asEntryRef is wrapped into the brackets and returned:
[PARAM]
You can also use "_func" pseoudo property of a record as a bridge to "asEntryRef" function when the "id" is not available (assigned)
This is always available
[entry._func.asEntryRef(entry.somefield)] will return [entry.somefield]
[entry._func.asEntryRef(entry.mytextfield)] will return [entry.mytextfield]
[entry._func.asEntryRef(entry.anotherfield)] will return [entry.anotherfield]
[entry._func.asEntryRef(entry.id)] will return [entry.id]
asVelocityExpRef(VALUE)
FROM V. 1.50.1
CLOUD
Same as asEntryRef, and asIFTTTRef, but returns a value wrapped in ${}, like ${VALUE}
asJSON
CORE
CLOUD
Converts a value to JSON and allows to access JSON object properties
entry.myfield.asJSON.someJSONProperty
entry.myfield.asJSON.anotherJSONProperty
asRef(VALUE)
FROM V. 1.53.8
CLOUD
Same as asEntryRef, and asIFTTTRef, but returns an exact expression as you have put inside the arguments
asRef(VALUE) will return VALUE
asUserProfile CORE
Converts to User profile (or tries to, if a given field value can be resulved as a user object)
Available user profile properties (all standard ones, available in the profile) to reference are:
phone
im
website
position
department
location
entry.somefield.asUserProfile.phone
entry.somefield.asUserProfile.im
entry.somefield.asUserProfile.website
entry.somefield.asUserProfile.position
entry.somefield.asUserProfile.department
entry.somefield.asUserProfile.location
where "somefield" should get resolved into username (can be user field)
[ entry.somefield.asUserProfile.phone]
[entry.somefield.asUserProfile.im]
[entry.somefield.asUserProfile.website]
[entry.somefield.asUserProfile.position]
[entry.somefield.asUserProfile.department]
[entry.somefield.asUserProfile.location]
asList
CORE
CLOUD
Extracts values of a list and converts to a comma-separated string, see below for examples on transform and asList
asAttachments
CORE
Converts the file/attachment field values into the array of Attachment objects
Converts the list of some objects into the list of values for the given property
For example:
[entry.myfile.asAttachments.transform(id)]
When "myfile" is a field of type file/attachment, a function "asAttachments" will convert it's values into the list of Attachments objects and then function "transform" will extract and "id" property of each Attachment object and will put it into the resulting list
[entry.myfile.asAttachments.transform(id).asList]
Same as in previous example, but we convert the otput into a comma separated list of attachment IDs
Below, is another example, which returns a result of ID's, but wrapped into quotes
Function "transform" can be used on a multi-value field.(on Multi-select fields, which hold the structure of ID and LABEL (properties "id" and "label")) See Accessing field values and properties and dropdown fields
For example, to get the list of dropdown IDs
[entry.mymultifield.transform(id)]
To get the list of dropdown labels
[entry.mymultifield.transform(label)]
To get the list of User's full names for multi-user field (User field has properties: fullName, username, email, lastName, firstname) See Accessing field values and properties
Transform function also works with smart fields, and could transform the fields / values referenced from another form through the reference (a field) in your current form
Adds a numeric value to a field (can substract as well, if a negative number is given)
[entry.somedatefield.timestamp.add(86400000)]
to add 1 day to the date (value of 86400000 is in milliseconds)
[entry.somedatefield.timestamp.add(-86400000)]
to add -1 day (substract a day) to the date (value of86400000 is in milliseconds)
Supports dynamic parameters via [entry.field_name]
subtract(number)
CORE
CLOUD
Subtracts value from field value
Supports dynamic parameters via [entry.field_name]
multiply(number)
CORE
CLOUD
Multiplies value by given parameter value
[entry.somedatefield.multiply(2)]
Supports dynamic parameters via [entry.field_name]
divide(number)
CORE
CLOUD
Divides value by given parameter value
[entry.somedatefield.divide(2)]
Supports dynamic parameters via [entry.field_name]
split(separator)
separator could be a space, like:
split( )
CORE
CLOUD
Split is an intermediate function to help you with transforming the string values into the arrays of strings, which then can be used with "array type" virtual functions
For example:
We have a field type called "mytextfield" and want it's content to be passed to JIRA as labels. For this we need to make sure we split the entered text by "space" and then use a corresponding virtual function to transform the object inti the desired representation
mytextfield.split( ).asArrayMultiSelect
Any other "array type" function can be applied. For example to get the count, one will write the following
mytextfield.split( ).asCount
hasChanged(fieldName)
FROM V. 1.36
FROM V. 1.50.1 - can be used in Field Definition Rules as well!
FROM V. 1.51.6 - you can use it without specifying property to track ANY field change.
By using
hasChanged():true
Now you can easily understand if the field value has been changed or not. Can be used ONLY (from ConfiForms version 1.50.1 can be used in field definition rules as well!) in IFTTT macro, in "condition" parameter. Only in this case, we have a previous snapshot of the data for this record. And the function is applied on the whole entry and not on the field.
Example in IFTTT macro:
The result of the function is a boolean, "true" is returned when the value for the field is different from current, and "false" is returned otherwise
Example:
hasChanged(somefield):true
or
hasChanged(somefield):true AND hasChanged(anotherfield):false
In addition to "hasChanged" function, ConfiForms has a support to get "previous state" of the record. And that is using a "virtual property" called: "_previousState"
Below example has the same result as "hasChanged(somefield):true"
!somefield:[entry._previousState.somefield]
This expression could be also used with IFTTT macro condition to determine if the value has been changed, but also allows you to create a more sophisticated filters like the one below:
hasChanged(mynum):true AND mynum:<[entry._previousState.mynum]
Checks if the value has been changed and if the previous value was bigger than current
This is available only in IFTTT and this also means that the synthetic property _previousState is available for you to use in filters
For example - we want to run another IFTTT when the record status has changed from one value to another
(when "MyStatus" status field has changed it's value and the value was changed from "requested" to "development")
hasChanged(MyStatus):true AND MyStatus:development AND _previousState.MyStatus:requested
asUserLink
asUserLinks (same as above, but works on user multiselect fields)
FROM V. 1.36.3
Also, there is a function which renders it as a macro: useful for usage withing a template or LIstView/CalendarView
In this example we have a field called "jirakey" in ConfiForms Form, and access a property "created" from JIRA issue.
Then we parse the created date, using the format JIRA uses when returning the date/time field via REST API and then we format the date using another virtual function called "formatDate" to show it as year-month-day only
entry.myfield.parseDate(JAVA_FORMAT)
[entry.myfield.parseDate(JAVA_FORMAT)]
Returns a timestamp, which you can transform to date using formatDate function or use as a filtering criteria
toPersianDate
CORE
Converts timestamp to Iranian/Persian date
date.toPersianDate
date.toPersianDate
[date.toPersianDate]
toPersianDateTime
CORE
Converts timestamp to Iranian/Persian date with time
mydatefield.toPersianDateTime
date.toPersianDateTime
[date.toPersianDateTime]
join
FROM V. 1.38
CLOUD
You can join the field values into one string. Works best on multi-select fields
For example (expect a field to be a multi-select field here):
id:[entry.mymultifield.transform(id).join( OR id:)]
Will extract the ID's from a record stored, and then join (concatenate) those ID's into one string, separated by OR id:
Something like this (when mymultifield contains 2 items):
id:1234-5678-9000-1234-5678-9000 OR id:1234-5678-9000-1234-5678-9001
entry.myfield..join(SOME VALUE)
[[entry,myfield.join(, Hello: )]
asJIRAIssue
FROM V. 1.40
CLOUD
Helps you to transform the values of a "JIRA Issues multi-select" field into a JIRA objects to allow access to any property/field of the JIRA issue
Helps you to transform the values of a "Insight Objects multi-select" field into a list of Insight Objects, which can be then transformed via "transform" function or properties can be accesssed directy
asPage
FROM V. 1.40
CLOUD
Helps you to transform the values saved to Page objects when used on Page/BlogPosts multi-select field
Or to try to transform numeric value to page object (load page by id)
The idea and the need for this function is the same as described for function asEntryRef(REF_TO_ENTRY)
This allows you to "escape" the ${IftttResult_NAME.someproperty} into a function to workaround template evaluations against the current record. Useful when your ConfiForms Form creates a page with another ConfiFormiForms Form and that form has various rules using iftttResults or entry.fieldnames
entry.id.asIFTTTRef(MYRESULT.id) will produce ${iftttResult_MYRESULT.id}
entry.id.asIFTTTRef(MYRESULT) will produce ${iftttResult_MYRESULT}
asUserProfileLink
FROM V. 1.48
Outputs a field value as a link to user profile (with avatar and full name). The field must have a username as a value
[entry.myfieldholdingusername.asUserProfileLink]
replaceAccents
replaceAccents()
FROM V. 1.48.2
CLOUD
Replaces the following accents letters using the folllwing mapping
Replaces every value matching "search string" in a field with given "replace with" value
[entry.myfield.replaceWith(hi,hola)]
Will match every "hi" and replace it with "hola"
formatLink(url)
formatLink(url|label)
FROM V. 1.51.3
CLOUD
Helps you to create http links from values in ConfiForms directly in teh views
[entry.myfield.formatLink(https://google.com?q=)]
will create a <a href="https://google.com?q=<VALUE_OF_MY_FIELD>" target="_blank"><VALUE_OF_MY_FIELD></a>
the below example shows how to specify a contant label for your links
[entry.myfield.formatLink(https://google.com?q=|search)]
will create a <a href="https://google.com?q=<VALUE_OF_MY_FIELD>" target="_blank">search</a>
timestamp
FROM V. 1.52.1
CLOUD
Tries to get the timestamp from date/datetime/timestamp holding fields in epoch format
asHex
FROM V. 1.52.1
CLOUD
Converts string into hex representation
string
asHex
1
31
2
32
hello
68656c6c6f
You can use it with other functions, as usual... something like
[entry.myfield.asHex.upperCase]
dec2Hex
FROM V. 1.52.1
CLOUD
Converts decimals to hex
value
dec2Hex
1
00000001
2
00000002
255
000000FF
210
000000D2
As always, you can chain the functions
[entry.myfield.dec2Hex.upperCase]
[entry.myfield.dec2Hex.trim(4)] - returns last 4 digits, instead of 000000D2 for 210 will return 00D2
randomInt(minVal)
FROM V. 2.0.8
CLOUD
You can generate tips from ConfiForms data with something like
To show "random" advice from your form of "advices"
Where "valuecounter" field is autonumber field and we randomly picking one record from a dataset, starting from 1 (that is why we use "randomInt(1)" function on _total field)
this renders a CardView inside the field for form "myform" located on page "819202", showing records matching the value in "partner" field and showing 2 fields: "name" and "amount".
See sum:(anotherfield), as an expression to give for the field you want to query on - this way it will attempt to "sum up" found values if all the found values are of numeric type
Similarly you can just warp the field or and expression into brackets
Since ConfiForms version 3.4.1 you can give ConfiForms a hint where to look for the property. As the page may have multiple page properties sections and a user can name them using the ID parameter in the page properties macro. ConfiForms is now able to look into a specific page properties macro, if necessary
Represents given date as in user timezone date. Actually al the dates in ConfiForms are stored/entered in server timezone! But sometimes it is required to pass the selected date further (to Jira, for example) as if it is given in user timezone.
someDate.asUserTimezone.jiraDateTime
[someDate.asUserTimezone.formatDate]
asUserTimezoneAwareDate
asUserTimezoneAwareDateTime
FROM V. 2.12.4
Since 2.13.7 supports setting the formatting pattern
asUserTimezoneAwareDate(PATTERN)
asUserTimezoneAwareDateTime(PATTERN)
CLOUD
Aliases for timezoneAwareDate and timezoneAwareDateTime
Formats dates in user timezones
someDate.asUserTimezoneAwareDate
someDate.asUserTimezoneAwareDateTime
timezoneOffset
FROM V. 2.13.2
CLOUD
Returns offset between server and user's timezones in milliseconds
htmlToWiki
FROM V. 2.13.2
CLOUD
Attempts to convert an HTML to Atlassian wiki markup (please note that this is an experimental function and does not support nested inline CSS styles)
iterateAndPrint
FROM V. 2.13.10
Now it is possible to iterate through the multi-select fields and print their properties in a convenient way
For example, iterating on multi user field and printing username and full name of the user in a row for each selected user
Returns true if field's value is alphanumeric and false otherwise
Use https://regex101.com/ to test your expressions - very helpful and easy to use resource for building regular expressions
pageWatchers
FROM V. 2.24.7
You can access page watchers on the page object
Returns a comma separated list of usernames who are page watchers of this page
pageObjectValue.pageWatchers
pageContributors
FROM V. 2.24.7
You can access page contributors on the page object
Returns a comma separated list of usernames who are page contributors of this page
pageObjectValue.pageContributors
If entry value is null or could not be formatted according to rules then value is returned as-is
See also Accessing field values and properties . You can use complex properties in your filters. For example filtering dropdown fields by values and by labels, filtering page type fields by page metadata fields, filtering user fields by, for example - email property
It is important to understand that it is totally possible to combine virtual functions WITH field properties and to chain functions!
Macro body:
Template / content to use to generate the contents
You can reference any field value using [entry.fieldname] notation, more on this Accessing field values and properties
Any other property, which Page object provides (any "get" method)
Create Task
Creates a personal task for a given user.
Please note that personal tasks has been deprecated in Confluence since version 5.7 (?)
Participants here are the user will task will be created for
Macro body:
Template / content to use to generate the contents
You can reference any field value using [entry.fieldname] notation, more on this Accessing field values and properties
Any other property, which Page object provides (any "get" method)
Force Page Re-index
Forces page re-index
Sometimes you want a particular page to be re-indexed when a ConfiForms entry get's created/updated or deleted. This action type helps you to achieve that.
Result type:
Resolved Page object to re-index
Depending on the IFTTT result name you can access all of the properties available from Page object.
Any other property, which Page object provides (any "get" method)
Make request
Makes GET or POST request to a configured resource
GET request is made when an IFTTT macro body is empty
POST request is made when an IFTTT macro contains a body, then this contents is sent to a configured resource as a stream, via POST request
This IFTTT action works well only with GET requests. We suggest to use "Application links" instead. The main reason - it's broader functionality and ability to hide the authentication details from an end user
Macro body:
Template / content to use to generate the contents
You can reference any field value using [entry.fieldname] notation, more on this Accessing field values and properties
Result type:
Response text returned from a request made.
${iftttResult_MYRESULT}
(when result name is set as "MYRESULT")
Move Attachment
Moves attachment from one page to another
You should specify the attachment ID to be moved and the page destination it should be moved to. A user must have enough permissions to attach the file to a destination page and enough permissions to read the configured attachment.
Can move multiple attachments in one go, See Virtual functions for "asAttachment" function to see how
Result type:
NO RESULT
Move Page
Moves page from one location to another
A user performing an operation should have enough permissions (to move the page from source location to destination location)
Result type:
Moved page as object. Any property a Page object has
Renders a contents of it's body and adds the result of a render into a result chain
Result type:
What render macro renders, as string
${iftttResult_MYRESULT}
Run JavaScript
Executes a JavaScript snippet given in the IFTTT macro body
Code snippet is executed in the "init" block
<script type="text/javascript">
AJS.toInit(function() {
...
YOUR CODE WILL BE HERE
...
});
</script>
And will be executed on a page load.
Macro body:
Template / content to use to generate the contents
You can reference any field value using [entry.fieldname] notation, more on this Accessing field values and properties
Template / content to use to generate the contents
You can reference any field value using [entry.fieldname] notation, more on this Accessing field values and properties
Result type:
NO RESULT (for versions of ConfiForms prior to 1.39.2)
FROM VERSION 1.39.2
The following properties are supported from version 1.39.2
Sends internal notification to a user (or users) in Confluence
Notification will appear in the top-right corner. The message body is configured using the ConfiForms macro body
Macro body:
Template / content to use to generate the contents
You can reference any field value using [entry.fieldname] notation, more on this Accessing field values and properties
Result type:
NO RESULT
Update JIRA Issue
Updates JIRA issue
JIRA issue key must be set as macro parameter, could be looked up dynamically from ConfiForms field
It is a wrapper action to ease the setup of updates to JIRA issue from ConfiForms. Same could be achieved with the help of "Applink service" action
IFTTT macro body should hold a JSON structure to update the JIRA issue (use "No Format" macro to construct JSON structure as-is)
Example:
Another example:
See more on JSON structure the "update JIRA issue" API expects
Macro body is evaluated as Velocity Template! This allows you to use #if #end constructions around JSON mapping parts.
Field values are stored in Velocity templates under field names!
Macro body:
Template / content to use to generate the contents
You can reference any field value using [entry.fieldname] notation, more on this Accessing field values and properties
Result type:
Issue key as text, accessible directly via result name (for example, if result name is "MYRESULT")
${iftttResult_MYRESULT}
More documentation and tutorials on ConfiForms IFTTT macro