PowerApps and Microsoft Flow in perfect harmony
You probably know that you can trigger an associated Flow from a PowerApp. You didn’t? Well you know now!
But did you know that PowerApps and Flow can work in perfect harmony after configuring your PowerApp and Flow correctly?
In this blog, I will explain you how to achieve this.
By default, there isn’t much communication between PowerApps and its associated Flow. The only way they ‘communicate’ is that the control that triggers the Flow will be disabled until the Flow has completed.
I will explain 2 ways that will harmonize your PowerApp with its associated Flow:
- Disable PowerApp controls while Flow is running
- Push Flow status to your PowerApp
Disable PowerApp controls while Flow is running
By default PowerApps will only disable the control that triggered the Flow, but in some cases you want other controls to be disabled as well.
To do this, you must initialize a variable on the OnStart event of your PowerApp and set its value to false.
Set( flowRunning, false )
Now select the control which triggers your Flow. In this example, my Flow is called ‘PowerAppsbutton’ and has no input parameters so the OnSelect property of this control is:
PowerAppsbutton.Run()
This needs to be altered; before your Flow will be triggered, the flowRunning variable needs to be set to true. When the Flow has completed, the flowRunning variable need to be set to false again:
Set( flowRunning, true ); PowerAppsbutton.Run(); Set( flowRunning, false )
Now we need to disable the controls by setting the DisplayMode property to Disabled when the Flow is running. We can do this by checking the flowRunning variable by using the following function:
If( flowRunning, Disabled, Edit )
Now when we run the Flow, not only the trigger button is disabled but also the other controls that we’ve configured:
Push Flow status to your PowerApp
When a user click the button to trigger a Flow, it would be nice that the user will be informed on the status on the Flow progress. Both during the Flow run and after the Flow run.
During the Flow run
The only way the user can see that the Flow is still running is because the control is disabled, but that’s not what most users are used to because they would like to see a progress bar of some kind.
You can do this by adding a spinner image and set its Visible property to the flowRunning variable we created in our previous step. When the Flow is running, the flowRunning variable is set to true and so will the Visible property be. When the Flow has completed, the flowRunning variable will be set to false again and the image will be hidden again.
After the Flow run
When the Flow has completed, all of your controls are enabled again but the user doesn’t know exactly what happened. By giving the user insight into the result of the completed Flow, the user can decide what the next step will be.
To do this, we need to perform a few steps:
- Initialize a string variable at the beginning of our Flow in which we will store the result of the completed Flow.
- Place all Flow process actions into a Scope (which is basically a container of actions). The Scope can be found within the Control connection or by searching for Scope
- Add three parallel ‘Set variable’ actions after your Scope in which you set the value of the results variable.
- Set the value of the first Set variable action to ‘Success’
- Set the value of the second Set variable action to ‘Error’
- Set the value of the third Set variable action to ‘Timed out’
- Add a ‘Respond to PowerApps’ action after the parallel branch and add a Text output called result and place your result variable into the value (via Dynamic Content)
Your Flow should look like this now:
Now we need to configure the Flow that only the appropriate Set variable action will run (Succeeded, Failed or Timed out) by selecting the ellipsis symbol (three dots: …) on your Set variable action and selecting Configure run after. This will allow you to only run a specific action when a certain condition is met (e.g. when an action or action set has failed). More information on this can be found here.
Make sure to configure these settings as follows:
Finally, we need to configure the Configure run after setting of our Respond to PowerApps action so that this action will run if one of the Set variable actions is succeeded and if the rest is skipped. This is because only one of the Set variable actions will be triggered. All other Set variable actions will be skipped. If you don’t edit the default Configure run after setting of the Respond to PowerApps action, it will not run because the default setting expects all of its previous action to succeed.
You can set the values of each predeceasing action separately by clicking on it and checking its appropriate values which are is successful and is skipped. Make sure you set each Set variable action seperately!
Now that our Flow responds the result back to PowerApps, we need to make sure we show this result somewhere. This result is part of the <flow>.Run() action, so we need to store this record into a variable first. To do this, we need to alter the OnSelect property of the control that triggers the Flow. We already changed it in the first part of this blog (by setting the flowRunning variable before and after the Flow run), so we need to change it one more time.
The PowerAppsbutton.Run() part needs to be replaced into the following:
Set( powerappsResult, PowerAppsbutton.Run() );
So our full OnSelect function is now as follows:
Set( flowRunning, true ); Set( powerappsResult, PowerAppsbutton.Run() ); Set( flowRunning, false )
Now we can add a label and set its Text property to powerappsResult.result. We can also play around a bit with the font color of the label and only show it when the Flow is not running (by setting the Visibility property to the opposite value of our earlier configured flowRunning variable by using !flowRunning (when using a boolean variable, you can call the opposite value by using an exclamation mark). So when the Flow is running, the flowRunning variable value is true which means the Visible property of the status label will be false.
4 Replies to “PowerApps and Microsoft Flow in perfect harmony”
Hello Rik,
Thank you for posting these steps. I have 2 different flows related to my Power App. The trigger for one is “When an item is created”. The other trigger is “When an item or a file is modified”. Both have many steps as I am creating and emailing pdfs to requestors. Can this flow be applied to the button even though technically, the button itself is not the trigger for either flow? There are edit icons I would like to disable while the flow is running, just wondering if this solution works for my use case scenario. Thank you, Teresa
So if I understand correctly, you want to disable a button in your Power App while a SharePoint triggered flow is running? It should be possible by using some sort of status updates from your flows, but that also means you need to keep your Power App ‘live’. Meaning you need to refresh the data constantly. That would possibly impact the performance of your app and will count onto your action limit as well
No work if scope needs more than 2min for work.
Response to PowerApps returns an error.
I tried to activate async in this step and no error neither value.
Can you help me? You can test with 2min timelapse step.
Hi, unfortunately a timeout will occur after 2 mins. As far as I know, this cannot be altered so you can’t do anything about that.