As you are probably aware, Microsoft is looking to eliminate SharePoint 2010 and 2013 workflows. In fact, 2010 workflows have already been retired, while 2013's retirement date(s) are still looming.
When it comes to planning the migration of your SPWF’s to Power Automate flows, it helps to think of them as two completely different platforms. Despite that fact that it’s all just ‘Microsoft’ under the covers, Power Automate is a substantially more robust, complex, and powerful application than SharePoint Designer. It is simply not ‘apples to apples’, which is why you won’t find a convenient ‘CONVERT’ button.
That said, there are opportunities for automating the creation of Power Automate flows. This will potentially go a long way towards helping organizations who have invested heavily in SPWF’s and now have a mountain of work ahead of them to convert. In this post, I will walk through the details of programmatically creating Power Automate flows with links to a sample C# console app.
Part 1 — Interacting with ‘Solution’ Flows
Because flows under the ‘My Flows’ tab are not currently supported by Power Automate web API’s, you will need to interact with all programmatic flows via the ‘Solutions’ tab.
**Note: I have only been able to programmatically create/access flows within the Default Solution for a relevant Dataverse environment. Microsoft does not mention this limitation in their web API documentation and I am uncertain of the scalability/performance implications.
To manually create a new Solutions flow, navigate to the Solutions tab and select Default Solution > New > Cloud flow | |
To obtain the ID for a specific Solutions flow, select it and copy the GUID value ( |
Part 2 — Get ClientData Content for New Flows
In order to create flows programatically, we will use the Power Automate Management Web API. The meat and potatoes of the flow payload is contained in the clientdata
property. To help determine appropriate content for populating this section, I recommend manually creating a ‘base’ Power Automate flow using the UI. Then, you can leverage the API to get the clientdata
content from that manual flow and copy/paste it into the payload for new flow(s).
- Follow the instructions for creating a new Solutions flow as shown above in Part 1.
- Navigate to your tenant Power Platform admin center to obtain the environment URL. Update the variable at line #17 with the relevant URL.
- Uncomment the
RetrieveFlow
method call at line #40 and confirm theCreateFlow
method at line #41 is commented out. - See Part 1 above to obtain a Flow ID (GUID) for the flow you just created. Update the variable at line #113 with the flow GUID value.
- Insert a breakpoint at line #122
- Run the project, providing credentials for a user who has access to the Dataverse Web API. (I have only tested with a global admin account.)
- Copy the string value within the
clientdata
.
Part 3 — Programmatically Create a New Flow
- Paste the
clientdata
content from above into the variable located on line #61. - Comment out the
RetrieveFlow
method call at line #40 and confirm theCreateFlow
method at line #41 is not commented out. - Run the project!
If everything works as expected, you should be able to locate your new flow by following the instructions in Part 1 to view Solutions flows. Test your new flow to confirm everything works as expected.
Part 4 — ‘Tweak’ the ClientData Content
Below is a de-serialized example of the content within the clientdata
property of a Power Automate flow. This particular flow is triggered when a new item is created within a SharePoint list. The indicated table
property at line #52 holds the value for the GUID of the relevant SharePoint list.
To create a new Power Automate flow which targets a different SharePoint list (within the same Site), simply update that GUID value in the clientdata
. While I have only tested this specific scenario, the potential applications for ‘tweaking’ values to facilitate bulk flow creation are endless.
{{
"properties": {
"connectionReferences": {
"shared_sharepointonline": {
"runtimeSource": "embedded",
"connection": {
"name": "shared-sharepointonl-ceefa1df-44c6-4e6f-800b-b350-ca17dbda"
},
"api": {
"name": "shared_sharepointonline"
}
},
"shared_office365": {
"runtimeSource": "embedded",
"connection": {
"name": "shared-office365-3bf72576-f215-4852-95ad-69cf-db33f170"
},
"api": {
"name": "shared_office365"
}
}
},
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
},
"$authentication": {
"defaultValue": {},
"type": "SecureObject"
}
},
"triggers": {
"When_an_item_is_created": {
"recurrence": {
"frequency": "Minute",
"interval": 3
},
"splitOn": "@triggerOutputs()?['body/value']",
"type": "OpenApiConnection",
"inputs": {
"host": {
"apiId": "/providers/Microsoft.PowerApps/apis/shared_sharepointonline",
"connectionName": "shared_sharepointonline",
"operationId": "GetOnNewItems"
},
"parameters": {
"dataset": "https://[M365Domain].sharepoint.com/",
"table": "e134069a-5a16-4602-bdd5-7f1fec27d45a"
},
"authentication": "@parameters('$authentication')"
}
}
},
"actions": {
"Send_an_email_(V2)": {
"runAfter": {},
"type": "OpenApiConnection",
"inputs": {
"host": {
"apiId": "/providers/Microsoft.PowerApps/apis/shared_office365",
"connectionName": "shared_office365",
"operationId": "SendEmailV2"
},
"parameters": {
"emailMessage/To": "@triggerOutputs()?['body/Author/Email']",
"emailMessage/Subject": "New Item Created!",
"emailMessage/Body": "<p>New Item Created!<br>\n@{triggerOutputs()?['body/{Link}']}</p>"
},
"authentication": "@parameters('$authentication')"
}
}
},
"outputs": {}
}
},
"schemaVersion": "1.0.0.0"
}}
Posted at https://sl.advdat.com/3xtCaAh