Just look at this – it’s a screenshot from Logic Apps:
To say that I felt bad when I saw this is to say nothing! I was pretty much devastated.
Do you know that Logic Apps have an Inline Script component that a logic app designer can use to run Javascript?
And we, Power Platform folks, don’t have it in Power Automate!
You are not sure what I’m talking about? Well, I warn you, you may lose your sleep once you open the link below. But here you go:
https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-add-run-inline-code
HOW COULD THIS BE ADDED TO THE LOW-CODE PLATFORM? Apparently, end of the world is nearing…
Or, possibly, I am just being jealous. Can we have that in Power Automate? Please?
Anyway, fooling aside, I figured this might be a good reason to explore what options we have in PowerPlatform when we need to add real code to such low-code solutions as Power Automate and/or Canvas Apps.
Since, of course, writing formulas for Canvas Apps cannot be considered real coding. It’s just writing (sometimes very complex) formulas.
Off the top of my head, it seems there are a few options:
- Azure Functions
- CDS Custom Actions
- Custom Connectors(?)
- Calling a logic app which can utilize the inline script mentioned above(?)
Let’s try something out to compare those options. To be more specific, let’s try implementing that regex above?
To start with, we can use Match function in Canvas Apps to achieve most of that, but, for the sake of experiment, let’s imagine we still wanted to call out some code instead, even from the Canvas Apps.
Anyway, Azure Functions were first on my list, and let’s do it all in the same order.
1. Azure Functions
Assuming you have Visual Studio and Azure Subscription, setting up and Azure Function is easy
- You need to create an Azure Function project in the Visual Studio
- And you need to deploy it to Azure
As for the price, it’s seems to be very affordable for what we are trying to use functions for. Most likely it’ll be free since you’ll probably hit some limits on the Flow side long before you reach 1000000 function executions, but, on the other hand, it all depends on the number of Flows utilizing that function. Still, here are some numbers from the pricing calculator:
It took me about an hour(not that long considering that the last time I wrote an Azure Function was a year or so ago), but a quick test in PostMan is showing that I can, now, start using that function to extract all emails from the given string (or, if I want, to find all substrings matching some other regex):
You will find the sources here:
https://github.com/ashlega/ItAintBoring.PowerPlatformWithCode
But, just quickly, here is the code:
[FunctionName("RegEx")] public static async Task Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log) { RegExPostData data = await req.Content.ReadAsAsync(); string result = ""; MatchCollection foundMatches = Regex.Matches(data.value, data.pattern, RegexOptions.IgnoreCase); foreach (Match m in foundMatches) { if (result != "") result += ";"; result += m.Value; } return req.CreateResponse(HttpStatusCode.OK, result); }
Btw, why am I returning a string, not a json? This is because, later on, I’ll need to pass the response back to a Canvas App, and, when doing it from a Flow, it seems I don’t have “json” option. All I have is this:
Hence, string it is.
Now, how do I call this function from a Flow/CanvasApp?
Technically, the simplest solution, at least for now, might be to figure out how to call it from a Flow, since we can call a Flow from the Canvas Apps. Which kind of solves the problem for both, so let’s do it that way first.
Here is the Flow:
When creating the Flow for a Canvas App, I had to use PowerApps trigger:
And I added parameters for the Flow using that magical “Ask in PowerApps” option:
So I just initialized variables (might not have to create variables, really).
Which I used in the HTTP action to call my Azure Function:
And the result of that call went back to the Canvas App through the respond to a PowerApp or Flow action:
And what about the Canvas App? It’s very straightforward there:
In the OnSelect of the button, I am calling my Flow, which is calling an Azure Function, which is using a regex to find matches, and, then, the result goes back to the Flow, then to the Canvas App, then it gets assigned to the FoundMatches variable… Which is displayed in the textbox:
One immediate observation – calling an Azure Function this way is not the same as just calling code. There is a delay, of course, because of all the communication etc. Other than that, it was not that complicated at all to make an Azure Function work with a Flow, and, through that flow, with a Canvas App.
And, of course, if I wanted that Azure Function to connect to CDS and do something in CDS, it would have to be a bit more complicated Azure Function. But there might be a better option for that scenario, which is creating a Custom Action and using a CDS (current environment) connector to call that custom action.
That’s for the next post, though: Power Automate Strikes Again