Power Automate: Advanced Flow building

Power Automate is one of my favorite tools from the Power Platform. It is extremely versatile and can be used to automate tasks between online services and automate processes ranging from simple to highly complex. In this post, I will share with you 3 advanced expressions I have used recently on my project. One part of the project is to convert XML data to data we can store in the dataverse.

Convert XML to JSON for easy access

For a project I needed to read multiple XML files with millions of rows and store data from the files into the dataverse. XML is harder to use in a Flow then JSON, so with a simple expression I transformed the XML to JSON.

  • Add a compose action with the name XML to JSON with the following code.
json(xml(variables('XML')))
  • Change the variable(‘XML’) to your XML content or store your XML content in that variable.
  • Add a parse json action set the Content to the output of the XML to JSON compose.
  • Add/create the JSON schema.

Using path in JSON

In most cases when you need to save data from JSON you can use the dynamic content to find it.
But sometimes you are looking for a field name that is not unique. In my case I needed a field called country related to the company. But the country field was used multiple times for various blocks. You can select the correct country by using the path (location) of the field in an expression.

  • Select the JSON through the dynamic content.
  • Copy the code from the dynamic content to the Expression.
  • Add the path add the end of the code.
  • I added .company.country to select the country of the company.
body('Parse_JSON').company.country

Dataverse lookup field

Lookup fields in Dataverse are really useful, but when you select them through the dynamic content the value will be the id not the display value. If the data must be readable for users, you can use the following steps to select the display value.

  • Add a compose to the flow.
  • Select the lookup field in the Inputs through the dynamic content.
  • Copy the code from the dynamic content to the Expression.
  • Your output looks something like this.
outputs('company')?['body/rc_countrycode']}
  • Add the @OData.Community.Display.V1.FormattedValue’ after rc_countrycode (your field name will be different).
  • The end results looks like this.
outputs('company')?['body/rc_countrycode@OData.Community.Display.V1.FormattedValue']

Power Automate: 6 flow building tips

Power Automate is one of my favorite tools from the Power Platform. It is extremely versatile and can be used to automate tasks between online services and automate processes ranging from simple to highly complex. In this post, I will share with you 6 tips and tricks when building flows in Power Automate.

Flow templates

A good way to get started with Power Automate is to use a template. Microsoft created a huge library of templates to choose from. You can browse by category to find your scenario, and then follow the steps in the template to create a flow from the template. You can also us the templates to figure out how to setup certain actions.

Equal to empty

Over the years many colleagues have asked me; how do I check if a value is empty? You can do this with the null expression! Note that sometimes you need to place the null between ‘ ‘.

Use parallel branches

Most flow builders forget to use the parallel branches. With parallel branches you can have two or more actions that run at the same time, after which the flow will only proceed once all parallel steps have completed. Parallel branches can be very useful for approval flows. For example, you have a request that needs to be approved by both IT and Sales, but the approval doesn’t need to be in a particular order. To save time you can run the approvals parallel.

Use scopes

We can use the action scope to group actions to make the flow easier to read. There is however another great use for them. The scope action encapsulates a block of actions and inherit the last terminal status (Succeeded, Failed, Cancelled) of actions inside. This in combination with the Configure run after setting we can create a try and catch logic in our flows. In this example the second scope (catch) only runs if the first scope (Try) failed.

  • Create a scope with some actions
  • Create a second scope after the first scope
  • Set the Configure run after setting of the second scope to has failed, is skipped and has timed out.
  • In this scenario the catch scope will only run if the Try scoped failed.
  • The flow will look like this.

Add redundant owners

If you have a flow that is used by your entire team, make sure you add a couple of co-owners. Then you will not be bothered during your vacation when the flow breaks. If you keep adding the same colleaguesas co-owners you can consider creating a security group and add the security group to the flows. Also make sure you add the co-owners to all the resources required by the flow. For example, the shared mailed that is used by the flow.

Connections

Actions use by default the connection (if required) of the creator of the flow. This is not always the best way to setup the connections. For example, if your flow updates a list you might not want to see your name as the modifier. I recommend using a dedicated account (service account) for most shared flows. The added benefit of using a dedicated account is that the flow will keep working even if you change your job.

Power Automate: Start a Flow from a column change

With Microsoft Power Automate we can now create flows that start based on specific columns being updated in SharePoint!  This is a feature I have been waiting on for years! The action is called Get changes for an item or a file. The action returns a boolean for each field, whether it was just changed or not. Based on this boolean you know if a field was changed.

Creating the flow

  • Create a SharePoint list, I created the following project list.
  • Enable versioning on the list.
  • Create a flow and use the trigger When an item or a file is modified.
  • Select your site and list.
  • Add the action Get changes for an item or a file (properties only).
  • Fill in the site address, library name and the ID of the item that was triggered.
  • The field Since is used to get the changes we need to make a comparison. If you use 1.0 you will compare the current item version with version 1.0. But we want the latest changes so we use the following expression.
sub(int(triggerOutputs()?['body/{VersionNumber}']),1)
  • I want to send an email when the end date of a project changes.
  • Add the action Conditions to check if the end date was changed.
  • Add the dynamic content Has Column Changed: End date.
    This returns a boolean value.
  • Put the required actions in the If yes section after the condition.
    In my example I am sending an email.
  • Add the action Send an email (V2) and fill in as follows.

Flow: Button to launch a Flow/Automate from a view

You can use column formatting (JSON) to create buttons that start a Flow on the corresponding list item in SharePoint. The button will be shown in the view for easy and fast access. After clicking the button the Flow Launch Panel will be displayed and you can start the Flow. This button is faster then clicking on the … then Flows followed by clicking the correct Flow.

Creating the button

  • Open the settings of the document library.
  • Create a new single line of text column with the name Start a Automate.
  • Go to a view where the new column is visible.
  • Open the menu of the column, click on Columns settings followed by Format this column.
  • If required click on the advanced mode option.
  • Copy and change the code below.
  • Change the txtContent to the name that needs to displayed as the value of the column. Currently it is Start the Automate.
  • Change the actionParams id to the Power Automate ID, see the steps below.
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "button",
  "customRowAction": {
    "action": "executeFlow",
    "actionParams": "{\"id\": \"788b1689-e999-99d9-9f37-fc539d5ba36b\"}"
  },
  "attributes": {
    "class": "ms-fontColor-themePrimary ms-fontColor-themeDarker--hover"
  },
  "style": {
    "border": "none",
    "background-color": "transparent",
    "cursor": "pointer"
  },
  "children": [
    {
      "elmType": "span",
      "attributes": {
        "iconName": "Flow"
      },
      "style": {
        "padding-right": "6px"
      }
    },
    {
      "elmType": "span",
      "txtContent": "Start the Automate"
    }
  ]
}
  • Add the JSON code and save the changes.
  • The button can only start Power Automate from the default environment.

Finding the Automate ID

  • Open Power Automate.
  • Click on the name of the Automate.
  • In the ID is located in the URL after shared.
  • For the following Flow URL the ID is 788b1689-e999-99d9-9f37-fc539d5ba36b
  • The button can only start Automates form the default environment.
https://emea.flow.microsoft.com/manage/environments/Default-40ce6286-0e4a-4500-8bb1-bf46447c5f7f/flows/shared/788b1689-e999-99d9-9f37-fc539d5ba36b/details

Flow and Twitter

The default Twitter web part it great and easy to use. You can follow a Twitter user (@), a URL of a user account, tweet or collection. These options where not enough for a communications department who wanted to show the #, @Company, the company name and from:[Company] on a SharePoint page. We were able to do this with a PowerAutomate Flow and a custom content query web part. In this post I will explain how you can do this.

SharePoint: Create a list

  • Create a SharePoint list to store the twitter information.
  • We created the following columns to store the information, your requirements might be different.
Column nameType
Favorite countsNumber
Followers countsNumber
LocationSingle line of text
Media urlsMultiple lines of text
Original tweetMultiple lines of text
Original tweet tweeted bySingle line of text
TweetMultiple lines of text
Tweeted bySingle line of text
Created atDate and time
TweetIdSingle line of text
Original tweet idSingle line of text
TypeChoice
RetweetsSingle line of text
ProfileImageUrlNumber
NameUserSingle line of text

Flow: Getting the information

  • Open PowerAutomate and create a new Flow.
  • Add the trigger When a new tweet appears.
  • Enter the required search term, see the example below.
  • We wanted to be able to filter on the different types of results, for example on # or @. This information is added to the item that will be created in the SharePoint list.
  • A tweet can be multiple types so we need an array and append all the types to it.
  • Initialize a variable called TypeTweet as an array.
  • Add a scope called Append to array – TypeTweet.
  • Add a condition that filters the #Office365 out of the TweetText.
  • If the result is yes then append the value #Office365 to the array.
  • Repeat the steps for all types of tweets.
  • Add a scope called Create list item.
  • Add the SharePoint Create item action.
  • Connect all the columns to the correct information.

Custom Content Query Web part

We used a variation of the React Content Query Web Part from Github. This is a modern version of the CQWP where you have all the freedom to grab and style items from a list or library.

Flow: Tips and tricks

Microsoft Flow is a very powerful tool and can be used to do many different things. I think it has become my favorite tool in Office 365. Therefor I want to spread the Flow love and tell you a couple of tips and tricks when developing Flows.

Copy actions

A very useful and time saving capability within Micorosft Flow is that we can copy and paste actions. You can copy configured actions and reuse them! The best thing about this capability is that you can copy an action from one flow and past it into another. I often use this to copy the more complex HTTP request actions. This feature is currently in preview, but so far I have not encountered any issues with it.

  • Click on the … on an action.
  • Click on Copy to my clipboard (preview).
  • Click on + New step.
  • Open the tab My clipboard.
  • Select the copied action.

Continue flow after a failed action

By default a flow will stop working if an action fails. If you know that an actions might fail occasionally you can setup a situation where only that action fails but not the whole flow. You can do with the Configure run after setting.

  • Click on the … of the action after the action that might fail.
  • Click on Configure run after.
  • Here you can configure if the action will be run even if the previous failed, skipped or timed out.
  • In this example I selected both is successfull and has failed to.
  • The flow will now continue if the previous action failed or succeeded.

Scope try and catch

We can use the action scope to group actions to make the flow easier to read. There is however another great use for them. The scope action encapsulate a block of actions and inherit the last terminal status (Succeeded, Failed, Cancelled) of actions inside. This in combination with the Configure run after setting we can create a try and catch logic in our flows. In this example the second scope (catch) only runs if the first scope (Try) failed.

  • Create a scope with some actions
  • Create a second scope after the first scope
  • Set the Configure run after setting of the second scope to has failed, is skipped and has timed out.
  • In this scenario the catch scope will only run if the Try scoped faild.
  • The flow will look like this.