Power Platform Tip of The Day presents: Power Automate expressions you didn’t know you needed until you found them. Everyone keeps a stash of useful Power Automate expressions in Notepad++, VS Code, EMacs, vi, or sticky notes if you don’t know what any of the above mean. The list below is a curated collection of expressions people use over and over again without blinking or crying “code”.
It doesn’t count as code if you copy and paste
Amey “ABC” Holden
Contributors: Amey “ABC” Holden, Antti Pajunen, Matt Collins-Jones.
Have the favorite expression of your own? Drop it in the comments or send it straight to jar@crmtipoftheday.com
List, Array, and Loop Walk Into A Bar
First items contact ID from List Rows
first(outputs( 'List_Rows_Action_Name' )?[ 'body/value' ])?[ 'contactid' ] |
First items OData ID (For UriHost()) from List Rows
first(outputs( 'List_Rows_Action_Name' )?[ 'body/value' ])?[ '@odata.id' ] |
List record action returned no results – output = true/false
empty(body( 'List_Rows_Action_Name' )?[ 'value' ]) |
Choose a certain value from an HTTP request instead of using Parse JSON
body( 'Invoke_an_HTTP_request' )?[ 'mail' ] |
Get the first result for an array
first(output( 'array' )) output( 'array' )?[0] |
Get the field from the first result of an array
output( 'array' )?[0]?[ 'FirstName' ] |
Check how many results are returned
length(output( 'array' )) |
Check if array is blank
empty(output( 'array' )) |
Skip lines for array
Skip(( 'array' ),6) |
Split tab delimiter file into an array
split(outputs( 'Get_File_from_SharePoint' )?[ 'body' ], decodeUriComponent( '%09' )) |
Split Array by carriage return
split(string(item()), decodeUriComponent( '%0A' )) |
Conditions
Go through this list of stuff and return the first non-blank value
coalesce( outputs( 'Get_Row_Action' )?[ 'body/description' ], outputs( 'Get_Row_Action' )?[ 'body/name' ], 'Default value' ) |
Check if something is blank and provide a different value, else use the first value
if ( empty(variables( 'varEmail' )), 'foobar@gmail.com' , variables( 'varEmail' ) ) |
Check if something is blank and provide a different value, else use the first value (Mk II)
coalesce(variables( 'varEmail' ), 'foobar@gmail.com' ) |
If Empty Condition
if (empty(outputs( 'Get_Row_Action' )?[ 'body/industrycode' ]), 'Yes' , 'No' ) |
If Not Equal Condition
if (not(equals(outputs( 'Get_Row_Action' )?[ 'body/industrycode' ], 1)), 'Yes' , 'No' ) |
If Equals Condition
if (equals(outputs( 'Get_Row_Action' )?[ 'body/industrycode' ], 1), 'Yes' , 'No' ) |
Set the owner correctly regardless if it’s a user or a team
concat( outputs( 'Get_Row_Action' )?[ 'body/_ownerid_value@Microsoft.Dynamics.CRM.lookuplogicalname' ], 's/' , outputs( 'Get_Row_Action' )?[ 'body/_ownerid_value' ] ) |
If empty do nothing, otherwise set the lookup (avoids failures when lookup value not found)
(Table is actually called lookup_table but in their wisdom designers of OData specifications introduced plural so it’s lookup_tables)
if (empty(first(outputs( 'Get_Rows_Action' )?[ 'body' ])?[ 'GUID_Column' ]), null , concat( 'lookup_tables(' , first(outputs( 'Get_Rows_Action' )?[ 'body' ])?[ 'GUID_Column' ], ')' ) ) |
If customer lookup is to an account, set the lookup, otherwise do nothing
if (equals( triggerOutputs()?[ 'body/_customerid_value@Microsoft.Dynamics.CRM.lookuplogicalname' ], 'account' ), concat( 'accounts(' ,triggerOutputs()?[ 'body/_customerid_value' ], ')' ), null ) |
If Equals many conditions
if ( and( equals(triggerOutputs()?[ 'body/firstname' ], 'Mike' ), equals(triggerOutputs()?[ 'body/lastname' ], 'Ipsum' ) ), 'Yes' , 'No' ) |
Use with the switch case value, so if its blank, your flow doesn’t fail
coalesce(triggerBody()?[ 'Choice' ]?[ 'Value' ], 'Unknown' ) |
Data Flexing Versing
Check two string values are exact
toLower(item()?[ 'matt_email' ]) |
Remove whitespace in string
replace(triggerOutputs()?[ 'body/productnumber' ], ' ' , '' ) |
Line breaks/new lines
decodeUriComponent( '%0A' ) decodeUriComponent( '%0D' ) |
Remove last character of string
substring(outputs( 'Compose_3' ),0,sub(length(outputs( 'Compose_3' )),1)) |
TimeZone Conversion for AUS
convertTimeZone(utcNow(), 'UTC' , 'W. Australia Standard Time' ) convertTimeZone(utcNow(), 'UTC' , 'AUS Eastern Standard Time' ) |
Date/Time Formatting
https://docs.microsoft.com/dotnet/standard/base-types/standard-date-and-time-format-strings
Extracting a word from a sentence
first(split(last(split(outputs( 'Compose_random_string' ), 'word ' )), ' is' )) |
Dataverse Email activity parties with lookup or email address (‘unresolved recipient’)
(2 = To 1 = From)
[ { "participationtypemask" : 2, "partyid@odata.bind" : "systemuser(E1AC0A77-C900-EC11-94EF-000D3ACC597E)" }, { "participationtypemask" : 1, "addressused" : "mailto:blah@email.com" } ] |
Words not GUIDS
Expand: Get Contact first name from customer lookup
customerid_contact($select=firstname) |
Get Choice Label from List Rows Action
item()?[ 'choiceName@OData.Commuity.Display.V1.FormattedValue' ] |
Get Choice Labels from Get A Row Action
body( 'GetARow' )?[ 'choiceName@OData.Commuity.Display.V1.FormattedValue' ] |
Name of lookup rather than GUID
@OData.Community.Display.V1.FormattedValue e.g. triggerOutputs()?[ 'body/_customerid_value@OData.Community.Display.V1.FormattedValue' ] => Joe Bloggs not 82373-43949-3948394-298424 |
Table logical name/type e.g. customer -> contact/account or owner -> team/systemuser
@Microsoft.Dynamics.CRM.lookuplogicalname e.g. triggerOutputs()?[ 'body/_customerid_value@Microsoft.Dynamics.CRM.lookuplogicalname' ] => account OR contact |
Expand: Get email address of owner and the person who last modified the record
owninguser($select=internalemailaddress),modifiedby($select=internalemailaddress) |
Filtering
Trigger Filter expression
firstname eq 'Mike' and lastname eq 'Ipsum' |
Filter based on a lookup
_logicalnamehere_value eq guidHere |
Filter based on a record’s GUID
entityPrimaryKey eq guidHere |
Filter based on a string
String inside single quotes, e.g. firstname eq 'Mike' |
Filter based on an integer (e.g. an option set)
Integer without single quotes, e.g. preferredcontactmethodcode eq 1 |
OData filter for lookups – send a notification, about record update/assign, so long as the owner is not the same as the person who did it
( _ownerid_value ne _modifiedby_value) ( _ownerid_value ne _modifiedonbehalfby_value) |