<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mark Nanneman</title>
    <description>The latest articles on DEV Community by Mark Nanneman (@mark_nanneman_039fdb748ca).</description>
    <link>https://dev.to/mark_nanneman_039fdb748ca</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2626866%2F523f3960-d697-4861-a29d-8bdfc7f185b9.jpg</url>
      <title>DEV Community: Mark Nanneman</title>
      <link>https://dev.to/mark_nanneman_039fdb748ca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mark_nanneman_039fdb748ca"/>
    <language>en</language>
    <item>
      <title>How to Visualize Data in Power Automate and Export a Graph Image without Power BI</title>
      <dc:creator>Mark Nanneman</dc:creator>
      <pubDate>Mon, 10 Feb 2025 22:53:52 +0000</pubDate>
      <link>https://dev.to/mark_nanneman_039fdb748ca/how-to-visualize-data-in-power-automate-and-export-a-graph-image-without-power-bi-526h</link>
      <guid>https://dev.to/mark_nanneman_039fdb748ca/how-to-visualize-data-in-power-automate-and-export-a-graph-image-without-power-bi-526h</guid>
      <description>&lt;p&gt;Believe it or not, you can graph data in Power Automate and display it as an image without using Power BI or some third-party connector or API endpoint.&lt;br&gt;
The trick is using Excel Online Scripts.&lt;/p&gt;
&lt;h2&gt;
  
  
  Create Excel Online File
&lt;/h2&gt;

&lt;p&gt;In this example I’ll create an Excel Online file in my SharePoint site.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1dwo2y9cn6ml3jsb4z6i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1dwo2y9cn6ml3jsb4z6i.png" alt="Image description" width="305" height="179"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Create a Table to Hold Your Data
&lt;/h2&gt;

&lt;p&gt;I’ll make a simple table with the headers “state,city,population”.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy5fsvd831s1fe7d9uf3u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy5fsvd831s1fe7d9uf3u.png" alt="Image description" width="430" height="286"&gt;&lt;/a&gt;&lt;br&gt;
I name the table “CityDataTable”.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67u33zhcm6h904tk3cjp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67u33zhcm6h904tk3cjp.png" alt="Image description" width="278" height="184"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Write a Script
&lt;/h2&gt;

&lt;p&gt;The script is written in Typescript. You can use Chat GPT or another AI Assistant to help. In my experience they are pretty good but you always need to fix or tweak a few things.&lt;br&gt;
Click on “Automate” then “New Script”.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgur0wreeu641ezuiri4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgur0wreeu641ezuiri4.png" alt="Image description" width="701" height="169"&gt;&lt;/a&gt;&lt;br&gt;
Here is the code I used (generated by Chat GPT and cleaned up by me):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

function main(workbook: ExcelScript.Workbook, inputChartName: string, inputData: { state: string, city: string, population: number }[]) {
    // Define the worksheet and table name
    const sheetName = "Sheet1"; // Change this to match your sheet name
    const tableName = "CityDataTable"; // Change this to match your table name

    // Get the worksheet
    let sheet = workbook.getWorksheet(sheetName);
    if (!sheet) {
        throw new Error(`Worksheet '${sheetName}' not found.`);
    }

    // Get the table
    let table = sheet.getTable(tableName);
    if (!table) {
        throw new Error(`Table '${tableName}' not found.`);
    }

    // Delete all existing rows from the table
    let rowCount = table.getRowCount();
    for (let i = rowCount - 1; i &amp;gt;= 0; i--) {
        table.deleteRowsAt(i, 1);
    }

    // Convert inputData to an array of arrays for table insertion
    let values = inputData.map(item =&amp;gt; [item.state, item.city, item.population]);

    // Add new rows to the table
    if (values.length &amp;gt; 0) {
        table.addRows(-1, values);
    }

    // Delete existing charts
    let charts = sheet.getCharts();
    for (let chart of charts) {
        chart.delete();
    }

    // Define data range for the chart
    let dataRange = table.getRange();

    // Create a new Treemap chart with the data range
    let chart = sheet.addChart(ExcelScript.ChartType.treemap, dataRange);
    chart.setPosition("E1", "P20"); // Adjust position as needed
    chart.setWidth(1280); // Set width to 1280 pixels
    chart.setHeight(720); // Set height to 720 pixels

    // Set chart title
    let chartTitle = chart.getTitle();
    chartTitle.setText(inputChartName);
    chartTitle.setVisible(true);

    // Enable data labels and show category names
    let dataLabels = chart.getDataLabels();
    dataLabels.setShowCategoryName(true);

    // Get chart name and type
    let chartName = chart.getName();
    let chartType = chart.getChartType(); // Returns an enum value

    // Get chart image
    return {
        chartImg: chart.getImage(),
        chartName: chartName,
        chartType: chartType.toString() // Convert enum to string for readability
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Build a Flow
&lt;/h2&gt;

&lt;p&gt;How you build your flow depends on your use case. The trigger will depend on whether you want to use this in a Scheduled Email Report or a Power App.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trigger
&lt;/h3&gt;

&lt;p&gt;In this case for demonstration purposes I’ll make it a public HTTP GET endpoint with no authorization.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvtlxbtxbd4ecb2y54no.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvtlxbtxbd4ecb2y54no.png" alt="Image description" width="774" height="862"&gt;&lt;/a&gt;&lt;br&gt;
I add some Relative Path Parameters for “type” and “count”.&lt;br&gt;
“Type” will drive how the chart image is delivered (HTML or a file download).&lt;br&gt;
“Count” is how many rows from my Dataverse Table I will visualize in the chart.&lt;/p&gt;

&lt;h3&gt;
  
  
  List Rows
&lt;/h3&gt;

&lt;p&gt;Next I’ll list rows from my “Cities” table. The row count will be the “count” from the Relative Path Parameter. I’m sorting the rows by “Population” descending so that the largest cities appear first.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7ya8ybxa7jjzta46ro3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7ya8ybxa7jjzta46ro3.png" alt="Image description" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Select Data for Array to Pass to Excel Script
&lt;/h3&gt;

&lt;p&gt;I use a Select action to select and form the array as I need it for my Excel Online Script.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3p6iq1wpkd185utxmot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3p6iq1wpkd185utxmot.png" alt="Image description" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Run Script (with Excel Online)
&lt;/h3&gt;

&lt;p&gt;Add a “Run script” action.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtp9o5dtnr3l5ivgassc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtp9o5dtnr3l5ivgassc.png" alt="Image description" width="734" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Point the “Run script” action to the Excel File you created and populate the Script’s inputs.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9q9lc7tlspwfbd2qjjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9q9lc7tlspwfbd2qjjx.png" alt="Image description" width="768" height="730"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the “inputData” input, which is the array input, I sort the output of the Select action by “state”.&lt;br&gt;
&lt;code&gt;sort(body('Select_Cities,_States_and_Pops'),'state')&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Compose a File Content Object
&lt;/h3&gt;

&lt;p&gt;The “Run script” will return a Base64 encoded string for the Chart Image.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhg0g5q7622bj8tgljdz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhg0g5q7622bj8tgljdz7.png" alt="Image description" width="288" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I construct an object with this in a Compose like the following.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5ey1m0lmxywajsx4vuj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5ey1m0lmxywajsx4vuj.png" alt="Image description" width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "$content": @{outputs('Run_script')?['body/result/chartImg']},&lt;br&gt;
  "$content-type": "image/png"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Return the Image in an HTTP Response Action
&lt;/h3&gt;

&lt;p&gt;Since my flow is just to demonstrate different ways of returning the image, I have a condition based on the “type” parameter in the trigger url.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwqzdfako5g9sak7x9o1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwqzdfako5g9sak7x9o1.png" alt="Image description" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  File Download Response
&lt;/h3&gt;

&lt;p&gt;If the trigger type is “file” it will return a file that the browser will download.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubff45blh6od6yr5w9jv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubff45blh6od6yr5w9jv.png" alt="Image description" width="735" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To give the downloaded file a name, use a “Content-Disposition” header.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftswxa7c92ovoixp1bvkd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftswxa7c92ovoixp1bvkd.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here I construct a file name with a formatted date time string to make sure it’s unique.&lt;br&gt;
&lt;code&gt;{&lt;br&gt;
  "Content-Disposition": "attachment; filename=@{outputs('Run_script')?['body/result/chartName']}  @{convertFromUtc(utcNow(),'Central Standard Time','yyyy-MM-dd hh-mm tt')}.png",&lt;br&gt;
  "Content-Type": "image/png"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The body is just the file content object I constructed in the Compose above.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35oy11yu5molkf57g88n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35oy11yu5molkf57g88n.png" alt="Image description" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will download a file when the Trigger URL is loaded in a browser tab.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0umdi3j9g4dwkbp399ew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0umdi3j9g4dwkbp399ew.png" alt="Image description" width="721" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  HTML Image Response
&lt;/h3&gt;

&lt;p&gt;To return the chart image in the browser I set the “content-type” to “text/html” and build a simple HTML image element in the Body.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funw4e0koi1i6i114k8fc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funw4e0koi1i6i114k8fc.png" alt="Image description" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Encode the File Content Object created above with dataUri()&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6naw4d958hvcg5c0sf0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6naw4d958hvcg5c0sf0e.png" alt="Image description" width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Test
&lt;/h2&gt;

&lt;p&gt;Save the flow then copy the URL from the trigger.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o9yeqy0brgba7n8fbdu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o9yeqy0brgba7n8fbdu.png" alt="Image description" width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the URL in a browser tab and update the {type} and {count} parameters, then load.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdua4ycsl52xcdmd1obhw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdua4ycsl52xcdmd1obhw.png" alt="Image description" width="207" height="40"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here I paste the trigger URL in a browser tab and try it with a count of 20 and then 300.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Food1edfic920r9bjudl7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Food1edfic920r9bjudl7.gif" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you found this post helpful please give it a like.&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Power Platform Developer | &lt;a href="https://marknanneman.wordpress.com/" rel="noopener noreferrer"&gt;Wordpress&lt;/a&gt; | LinkedIn: &lt;a href="https://www.linkedin.com/in/marknanneman/" rel="noopener noreferrer"&gt;Mark Nanneman&lt;/a&gt; | YouTube: &lt;a href="https://www.youtube.com/@markspowerstuff" rel="noopener noreferrer"&gt;Mark’s Power Stuff&lt;/a&gt;  | &lt;a href="https://buymeacoffee.com/marknanneman" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt; | &lt;a href="https://community.powerplatform.com/profile/?userid=06bf23b2-879c-ef11-8a69-7c1e521888bb" rel="noopener noreferrer"&gt;Power Platform Community&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>powerautomate</category>
      <category>powerplatform</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Using OData Lambda Expressions to Filter on Nested Collections and Related Tables in Power Automate</title>
      <dc:creator>Mark Nanneman</dc:creator>
      <pubDate>Sat, 08 Feb 2025 21:22:17 +0000</pubDate>
      <link>https://dev.to/mark_nanneman_039fdb748ca/using-odata-lambda-expressions-to-filter-on-nested-collections-and-related-tables-in-power-automate-2do1</link>
      <guid>https://dev.to/mark_nanneman_039fdb748ca/using-odata-lambda-expressions-to-filter-on-nested-collections-and-related-tables-in-power-automate-2do1</guid>
      <description>&lt;p&gt;I’m ashamed to admit this, but I just recently learned this really cool feature.&lt;/p&gt;

&lt;p&gt;You can create “Lambda expressions” in OData filters to filter records by items that appear in a nested collection (array) or in a related table.&lt;/p&gt;

&lt;p&gt;Here are some pages with official documentation on the subject:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/query/filter-rows#filter-using-values-of-related-collections" rel="noopener noreferrer"&gt;Filter rows using OData (Microsoft Learn)&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.odata.org/getting-started/basic-tutorial/#lambda" rel="noopener noreferrer"&gt;Basic Tutorial (OData.org)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How it Works
&lt;/h2&gt;

&lt;p&gt;To use the Lambda expression in an OData filter, you specify the nested table column name (or relationship name for a related table) with a forward slash.&lt;/p&gt;

&lt;p&gt;Then you use either any() or all() depending on whether you want any match to suffice or if you need the expression to result in true for every item in the collection.&lt;/p&gt;

&lt;p&gt;Next you supply a name for each item in the collection (like an inline variable name). Usually it’s a single letter, but you could use longer strings. Put a colon after the name.&lt;/p&gt;

&lt;p&gt;Finally you write the expression to be evaluated for each item in the collection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;related_collection_name&amp;gt;/any(x:&amp;lt;expression to evaluate on all items&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can reference columns/properties in the collection with forward slashes.&lt;/p&gt;

&lt;p&gt;E.g.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;related_collection_name&amp;gt;/any(x:x/&amp;lt;property_name_in_related_collection&amp;gt; eq '&amp;lt;some_string&amp;gt;')&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Outlook Contacts Example
&lt;/h2&gt;

&lt;p&gt;Here I’m using the “Get contacts (V2)” action to list contacts. I want to filter it for the contact with a specific email address.&lt;/p&gt;

&lt;p&gt;Unfortunately, normal OData expressions won’t help because the email address for each contact is stored in a nested table called “emailAddresses” in a property called “address”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89jhhe7nizaqihxvj8rs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89jhhe7nizaqihxvj8rs.png" alt="Image description" width="533" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here Lambda comes to the rescue.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;emailAddresses/any(e:e/address eq 'john.doe@email.com')&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6qrymcwjqv573ym0p3n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6qrymcwjqv573ym0p3n.png" alt="Image description" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dataverse Examples
&lt;/h2&gt;

&lt;p&gt;Lambda expressions are very useful when filtering Dataverse tables for records that have certain child records. It saves you from having to create a longer FetchXML filter to accomplish the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter Accounts to Which Certain Contacts are Linked (N:1)
&lt;/h2&gt;

&lt;p&gt;Here I want to list Accounts that have certain child Contacts. I’ll look for any Account with a Contact that has “Harkonnen” in the “fullname” field.&lt;/p&gt;

&lt;p&gt;First I need to get the name of the relationship between Accounts and Contacts.&lt;/p&gt;

&lt;p&gt;This can be found in make.powerapps.com by selecting the table and navigating to the “Relationships” list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4gh2g2aujup23h9ukvo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4gh2g2aujup23h9ukvo.png" alt="Image description" width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the OData Lambda filter, I just need to type in the relationship name followed by a “/” then any(c: contains(c/fullname,'Harkonnen'))&lt;/p&gt;

&lt;p&gt;&lt;code&gt;contact_customer_accounts/any(c:contains(c/fullname,'Harkonnen'))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I could also use another field, such as last name.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;contact_customer_accounts/any(c:contains(c/lastname,'Harkonnen'))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And I could also use a different expression than contains, for example a straight equals expression.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;contact_customer_accounts/any(c:c/lastname eq 'Harkonnen')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2em1uyfl415pqkfbryc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2em1uyfl415pqkfbryc.png" alt="Image description" width="687" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here I find one account, “House Harkonnen” that has child contacts with the lastname of “Harkonnen”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbibsy5x2hpghbaql5q3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbibsy5x2hpghbaql5q3m.png" alt="Image description" width="760" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter Records by Numeric Column on Related Table (N:1)
&lt;/h2&gt;

&lt;p&gt;You can also use numeric comparison operators like “Less than” or “Greater than or Equal to” on columns on related tables with the Lambda ODatA expression.&lt;/p&gt;

&lt;p&gt;I have a “States” table with USA States, and a “Cities” table that is linked to the “States” table, with population data for each city.&lt;/p&gt;

&lt;p&gt;So if I wanted to list all states with a city that has a population of a million or more, I can do it easily with Lambda.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mln_City_mln_State/any(c:c/mln_population ge 1000000)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jvwm7y9u8zpax0bgioq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jvwm7y9u8zpax0bgioq.png" alt="Image description" width="675" height="353"&gt;&lt;/a&gt;&lt;br&gt;
When it runs, I get these states:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfx0spvr0laxdgrsyl7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfx0spvr0laxdgrsyl7j.png" alt="Image description" width="800" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter Users by Security Role (N:N)
&lt;/h2&gt;

&lt;p&gt;You can also easily filter a table by records with an N:N relationship, which can be very helpful in some situations.&lt;/p&gt;

&lt;p&gt;In this example, I’ll list all Users with a “System Administrator” Security Role.&lt;/p&gt;

&lt;p&gt;The “Security Role” table has an N:N relationship with the “User” table. It’s called “systemuserroles_association”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hab5g3rjetndxkgjxx2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hab5g3rjetndxkgjxx2.png" alt="Image description" width="800" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The lambda expression looks like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;systemuserroles_association/any(r:r/name eq 'System Administrator')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I also add in a filter to only return Users with a “Main Phone” number, so that I can filter out non-human users.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;systemuserroles_association/any(r:r/name eq 'System Administrator') and address1_telephone1 ne null&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvzibz47od8286bdqhri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvzibz47od8286bdqhri.png" alt="Image description" width="669" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7ss46wqg4obzav19elf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7ss46wqg4obzav19elf.png" alt="Image description" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you found this post helpful please give it a like.&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Power Platform Developer | &lt;a href="https://marknanneman.wordpress.com/" rel="noopener noreferrer"&gt;Wordpress&lt;/a&gt; | LinkedIn: &lt;a href="https://www.linkedin.com/in/marknanneman/" rel="noopener noreferrer"&gt;Mark Nanneman&lt;/a&gt; | YouTube: &lt;a href="https://www.youtube.com/@markspowerstuff" rel="noopener noreferrer"&gt;Mark’s Power Stuff&lt;/a&gt;  | &lt;a href="https://buymeacoffee.com/marknanneman" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt; | &lt;a href="https://community.powerplatform.com/profile/?userid=06bf23b2-879c-ef11-8a69-7c1e521888bb" rel="noopener noreferrer"&gt;Power Platform Community&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>powerautomate</category>
      <category>lambda</category>
      <category>odata</category>
      <category>powerplatform</category>
    </item>
    <item>
      <title>Get Number Set Statistics with an Excel Online Script in Power Automate</title>
      <dc:creator>Mark Nanneman</dc:creator>
      <pubDate>Sat, 08 Feb 2025 21:09:16 +0000</pubDate>
      <link>https://dev.to/mark_nanneman_039fdb748ca/get-number-set-statistics-with-an-excel-online-script-in-power-automate-31pg</link>
      <guid>https://dev.to/mark_nanneman_039fdb748ca/get-number-set-statistics-with-an-excel-online-script-in-power-automate-31pg</guid>
      <description>&lt;p&gt;There are a few methods to find the Sum, Mean and Mode of arrays of numbers in Power Automate by using Child Flows or Low Code Instant Plug-Ins and Power Fx expressions.&lt;/p&gt;

&lt;p&gt;One of the better (and fastest) ways to do this using a simple TypeScript code executed with the Excel Online “Run script” action.&lt;/p&gt;

&lt;p&gt;If you don’t know JavaScript, it’s not too hard to generate what you need using an AI Assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create an Excel Online File to Host Your Scripts
&lt;/h2&gt;

&lt;p&gt;I created one in a SharePoint Site documents folder and named it “Power Automate Scripts”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfrez8z3rmima95wmzqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfrez8z3rmima95wmzqs.png" alt="Image description" width="800" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add New Script
&lt;/h2&gt;

&lt;p&gt;Click “Automate” then “New Script”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbhf71dltgy6kc86wow7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbhf71dltgy6kc86wow7.png" alt="Image description" width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Write Your TypeScript
&lt;/h2&gt;

&lt;p&gt;I tried out ChatGPT to generate my TypeScript. It didn’t work right away. Excel did not like some of the syntax, but it was fairly easy to fix by telling ChatGPT the errors that Excel reported.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxltrol53hy7f4muztq0f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxltrol53hy7f4muztq0f.png" alt="Image description" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also experimented with Grok and DeepSeek, both of which gave similar results but also contained some errors. The GPTs tend to want to write a script that reads a range on your Excel sheet, so you have to specify that they are taking inputs from the “Run Script” action in a Power Automate Cloud Flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here is the final working TypeScript.
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

function main(workbook: ExcelScript.Workbook, inputArray: number[]): {
    modes: number[],
    maxFrequency: number,
    inputLength: number,
    minValue: number,
    maxValue: number,
    mean: number,
    standardDeviation: number,
    variance: number,
    sum: number
} {
    if (inputArray.length === 0) {
        throw new Error("Input array is empty");
    }

    // Count occurrences of each number
    const frequencyMap: Record&amp;lt;number, number&amp;gt; = {};
    inputArray.forEach((num) =&amp;gt; {
        frequencyMap[num] = (frequencyMap[num] || 0) + 1;
    });
    // Find the maximum frequency
    const maxFrequency = Math.max(...Object.values(frequencyMap));

    // Find all numbers that have the max frequency
    const modeNumbers = Object.keys(frequencyMap)
        .filter((key) =&amp;gt; frequencyMap[parseFloat(key)] === maxFrequency)
        .map((key) =&amp;gt; parseFloat(key));

    // Find min and max values
    const minValue = Math.min(...inputArray);
    const maxValue = Math.max(...inputArray);

    // Calculate sum
    const sum = inputArray.reduce((sum, num) =&amp;gt; sum + num, 0); // Added sum calculation

    // Calculate mean
    const mean = inputArray.reduce((sum, num) =&amp;gt; sum + num, 0) / inputArray.length;

    // Calculate variance
    const variance = inputArray.reduce((sum, num) =&amp;gt; sum + Math.pow(num - mean, 2), 0) / inputArray.length;

    // Calculate standard deviation
    const standardDeviation = Math.sqrt(variance);

    return {
        modes: modeNumbers,
        maxFrequency,
        inputLength: inputArray.length,
        minValue,
        maxValue,
        mean,
        standardDeviation,
        variance,
        sum
    };
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paste Your TypeScript into the Excel Code Editor and Save
&lt;/h2&gt;

&lt;p&gt;Check that it finds no errors in the code, name the script and save.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2g06mk39dk5txe4kn78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2g06mk39dk5txe4kn78.png" alt="Image description" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add the “Run script” Action in a Power Automate Flow
&lt;/h2&gt;

&lt;p&gt;Add the Excel Online (Business) Connector “Run Script” action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgbf6le6g4ff1r0vla2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgbf6le6g4ff1r0vla2b.png" alt="Image description" width="596" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Locate your Excel file&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5w2icrxjbnblanj1fds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5w2icrxjbnblanj1fds.png" alt="Image description" width="612" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the script you just added from the drop down:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fus6si6imeejq8hen55c2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fus6si6imeejq8hen55c2.png" alt="Image description" width="635" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pass in the simple array of numbers you want it to analyze&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqsyc68r1ertx1va290l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqsyc68r1ertx1va290l.png" alt="Image description" width="615" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Test
&lt;/h2&gt;

&lt;p&gt;Here I will use a large SharePoint List that has over 20k items with an “Amount” column.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfpzm9p98luaw3jyk56t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfpzm9p98luaw3jyk56t.png" alt="Image description" width="582" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I list all the records using pagination.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9puykiueut96xs3smqdc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9puykiueut96xs3smqdc.png" alt="Image description" width="609" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I select only the amount column into a simple array.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3yvoy6vqnyzxprtt4au.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3yvoy6vqnyzxprtt4au.png" alt="Image description" width="383" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The simple array is passed into the “Run script” action and returns the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
        "result": {
            "modes": [
                9593.63
            ],
            "maxFrequency": 3,
            "inputLength": 23343,
            "minValue": 1.26,
            "maxValue": 9999.54,
            "mean": 4986.318588870353,
            "standardDeviation": 2882.714208802088,
            "variance": 8310041.209629446,
            "sum": 116395634.82000065
        },
        "logs": []
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbq24lqvgqhb605yzwjty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbq24lqvgqhb605yzwjty.png" alt="Image description" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Double check the results in an Excel export of the SharePoint List:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdzstmcl1n9zqit051cb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdzstmcl1n9zqit051cb.png" alt="Image description" width="543" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you found this post helpful please give it a like.&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Power Platform Developer | &lt;a href="https://marknanneman.wordpress.com/" rel="noopener noreferrer"&gt;Wordpress&lt;/a&gt; | LinkedIn: &lt;a href="https://www.linkedin.com/in/marknanneman/" rel="noopener noreferrer"&gt;Mark Nanneman&lt;/a&gt; | YouTube: &lt;a href="https://www.youtube.com/@markspowerstuff" rel="noopener noreferrer"&gt;Mark’s Power Stuff&lt;/a&gt;  | &lt;a href="https://buymeacoffee.com/marknanneman" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt; | &lt;a href="https://community.powerplatform.com/profile/?userid=06bf23b2-879c-ef11-8a69-7c1e521888bb" rel="noopener noreferrer"&gt;Power Platform Community&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>powerautomate</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>statistics</category>
    </item>
    <item>
      <title>Calculate Frequency and Mode of a Value in a Collection in Power Apps</title>
      <dc:creator>Mark Nanneman</dc:creator>
      <pubDate>Mon, 27 Jan 2025 16:34:25 +0000</pubDate>
      <link>https://dev.to/mark_nanneman_039fdb748ca/calculate-frequency-and-mode-of-a-value-in-a-collection-in-power-apps-4obo</link>
      <guid>https://dev.to/mark_nanneman_039fdb748ca/calculate-frequency-and-mode-of-a-value-in-a-collection-in-power-apps-4obo</guid>
      <description>&lt;p&gt;The mode of a number or data set can be a useful statistic. There are some situations when the mean or average isn’t as helpful as the mode. The mode can give you the idea of a trend or most popular choice. Another example I’ve encountered is needing to identify the typical price of a good or service from large data sets in which there might be some variance due to discounts or human error.&lt;/p&gt;

&lt;p&gt;Getting statistics like Mode and Standard Deviation are easy enough in Power BI or Excel. In Power FX there is a Standard Deviation function, StdP().&lt;/p&gt;

&lt;p&gt;There’s no built in way to calculate the Mode in Power Automate or Power Apps, but here’s how you can do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step One – Calculate Frequency of Distinct Items in Collection
&lt;/h2&gt;

&lt;p&gt;In this example I’m using a collection called “gbl_col_prices” with two columns, price and title.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek3opz2gfdsfywb6cuks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek3opz2gfdsfywb6cuks.png" alt="Image description" width="328" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get a distinct collection of the titles in the collection, I use Distinct()&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv7fnko8he8qsq7ms694i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv7fnko8he8qsq7ms694i.png" alt="Image description" width="241" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step Two – Add a Frequency Count Column
&lt;/h2&gt;

&lt;p&gt;Use the AddColumns() function. The new column is called freq. The value for the new column is calculated by CountRows() on a filter of the original collection filtered by title = Value.&lt;/p&gt;

&lt;p&gt;Value represents the Distinct Title from the previous step in the expression.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh56156mvf024etwjfdhz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh56156mvf024etwjfdhz.png" alt="Image description" width="342" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then add a Sort() to sort by the new freq column in descending order.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnout0bpo12719g96rks7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnout0bpo12719g96rks7.png" alt="Image description" width="341" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Displayed in a gallery, the new collection of distinct titles with frequency counts now looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3cwkg51do6el8h52z89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3cwkg51do6el8h52z89.png" alt="Image description" width="635" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step Three – Calculate Max Frequency
&lt;/h2&gt;

&lt;p&gt;Use a Max() function on the distinct collection with added frequency count column we created in the steps above.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Max(&amp;lt;your_distinct_frequency_collection&amp;gt;,freq)&lt;/code&gt;&lt;br&gt;
In my example, I display this in a text control like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxifrw5quf98gvham6lk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxifrw5quf98gvham6lk.png" alt="Image description" width="666" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step Four – Find Modes
&lt;/h2&gt;

&lt;p&gt;For most purposes, you can just filter your frequency collection for all items that match the max frequency, and take the first item to get your mode.&lt;/p&gt;

&lt;p&gt;Technically, a set can have multiple modes, and you might want to display these, or take the middle mode.&lt;/p&gt;

&lt;p&gt;In this example, I have a further break down where I check for frequencies of distinct prices for a select product, and display all the modes found in a gallery.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxi0tqo8i3u733zm8hxbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxi0tqo8i3u733zm8hxbs.png" alt="Image description" width="390" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expression for displaying all modes found in a gallery:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F437uv9p52yrn5d2dzo78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F437uv9p52yrn5d2dzo78.png" alt="Image description" width="434" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expression for displaying first, middle and last mode found in a text control:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18n1cadrojdglei0p5g2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18n1cadrojdglei0p5g2.png" alt="Image description" width="144" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0syboxukfgy75fzzioq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0syboxukfgy75fzzioq3.png" alt="Image description" width="526" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;If you found this post helpful please give it a like. Power Platform Developer | [&lt;a href="https://www.linkedin.com/marknanneman" rel="noopener noreferrer"&gt;LinkedIn &lt;/a&gt;| &lt;a href="https://marknanneman.wordpress.com/" rel="noopener noreferrer"&gt;Wordpress &lt;/a&gt;| YouTube: &lt;a href="https://www.youtube.com/@markspowerstuff" rel="noopener noreferrer"&gt;Mark’s Power Stuff&lt;/a&gt; | &lt;a href="https://buymeacoffee.com/marknanneman" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>powerapps</category>
      <category>powerfx</category>
    </item>
    <item>
      <title>Cancel All Running Flows with One Click in Power App</title>
      <dc:creator>Mark Nanneman</dc:creator>
      <pubDate>Sat, 25 Jan 2025 22:37:51 +0000</pubDate>
      <link>https://dev.to/mark_nanneman_039fdb748ca/cancel-all-running-flows-with-one-click-in-power-app-1p25</link>
      <guid>https://dev.to/mark_nanneman_039fdb748ca/cancel-all-running-flows-with-one-click-in-power-app-1p25</guid>
      <description>&lt;h1&gt;
  
  
  Cancel All Running Flows with One Click in Power App
&lt;/h1&gt;

&lt;p&gt;January 25, 2025&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Have you ever had a runaway flow? I know I have.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuc4b7ehvk4ru7j3g5x1s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuc4b7ehvk4ru7j3g5x1s.png" alt="Image description" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back in the early days, I would occasionally make a mistake resulting in an infinite loop, or a child flow being triggered a ridiculous amount of times.*&lt;/p&gt;

&lt;p&gt;*Okay, TBH I occasionally still do this when I’m horsing around in my development environment&lt;/p&gt;

&lt;p&gt;Sometimes the actions in the runaway flow start hitting throttle limits and they slow down, resulting in many flows stuck in a running status. This can impact the performance of your entire ecosystem and be very bad.&lt;/p&gt;

&lt;p&gt;Canceling all the runs used to be a tedious processing of selecting them in batches of 20, or saving a copy of the runaway flow and then deleting it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;Fortunately, Microsoft has added a “Cancel all flow runs” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ntrpbnb69svaubkckqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ntrpbnb69svaubkckqr.png" alt="Image description" width="380" height="41"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is great. Even better, there is an API endpoint you can use to cancel all flow runs for a selected flow. You can even find the link when you list your “workflows” (Processes) table in Dataverse:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr5q2t4zrb7jid6o53nuq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr5q2t4zrb7jid6o53nuq.png" alt="Image description" width="531" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the endpoint:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://&amp;lt;your_domain&amp;gt;.crm.dynamics.com/api/data/v9.1/workflows(&amp;lt;flow_name&amp;gt;)/Microsoft.Dynamics.CRM.CancelAllCloudFlowRuns&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;All you need to do is send an authorized POST to the url, and you will trigger the immediate cancellation of all running flows for the flow named in the url. You can do this in Power Automate or Power Apps with an Invoke an HTTP Request with Entra ID (preauthorized).&lt;/p&gt;

&lt;h2&gt;
  
  
  Example – Canvas App
&lt;/h2&gt;

&lt;p&gt;Here’s how it works in a Power Apps Canvas App.&lt;/p&gt;

&lt;p&gt;I have a Canvas App I’m building to manage Power Automate Cloud Flows in any environment. It uses the Dataverse “workflows” (Processes) table to list all flows in the environment, as well as HTTP calls to list all flow runs. In the screenshot below, I have opened up a flow called “Delay Flow Test” to view all the recent runs that belong to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkz1tek3854c1ve817eds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkz1tek3854c1ve817eds.png" alt="Image description" width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The HTTP with Microsoft Entra ID (preauthorized) Invoke HTTP Action
&lt;/h3&gt;

&lt;p&gt;I have added a “Cancel all flow runs” icon:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fdlwyuxb33tcwgbxfbd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fdlwyuxb33tcwgbxfbd.png" alt="Image description" width="200" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In its simplest version, the expression for “OnSelect” is as simple as this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgafgp2pyfiq3kol3jl42.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgafgp2pyfiq3kol3jl42.png" alt="Image description" width="800" height="47"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;'HTTPwithMicrosoftEntraID(preauthorized)'.InvokeHttp("POST",$"/api/data/v9.1/workflows({loc_sel_flow.Process})/Microsoft.Dynamics.CRM.CancelAllCloudFlowRuns")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I’ve updated it to only run if there are running flows, and to send a notification. I’ve also moved the code to a confirmation popup to make sure the user wants to cancel all running flows.&lt;/p&gt;

&lt;p&gt;In the end, this is what my code looked like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ohf7qxmsj3az2tvh4on.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ohf7qxmsj3az2tvh4on.png" alt="Image description" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This gets a count of the running flows that will be canceled, and performs a refresh of the select flow’s run history so that we can get immediate confirmation that the API action worked.&lt;/p&gt;

&lt;p&gt;Make Sure Your “HTTP with Microsoft EntraID” connector is set up with a connection to your Dynamics Url, i.e. &lt;code&gt;(https://&amp;lt;your_domain&amp;gt;.crm.dynamics.com)&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Click Confirm to Invoke the HTTP and refresh flow runs
&lt;/h3&gt;

&lt;p&gt;I click Confirm and receive this notification:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjg6iyxtvf85ydume7xmo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjg6iyxtvf85ydume7xmo.png" alt="Image description" width="559" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flow history is immediately refreshed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyup1nmebyu7ti5gzsqx9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyup1nmebyu7ti5gzsqx9.png" alt="Image description" width="800" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The flows that were submitted to the bulk cancellation API now show a “Cancelling” status.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09o5zicxxgeehb01chza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09o5zicxxgeehb01chza.png" alt="Image description" width="87" height="26"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope this helps!&lt;/p&gt;

&lt;p&gt;If you found this post helpful please give it a like. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Power Platform Developer | &lt;a href="https://marknanneman.wordpress.com/" rel="noopener noreferrer"&gt;WordPress&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/marknanneman/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | YouTube: &lt;a href="https://www.youtube.com/%40markspowerstuff" rel="noopener noreferrer"&gt;Mark’s Power Stuff&lt;/a&gt; | &lt;a href="https://buymeacoffee.com/marknanneman" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>powerautomate</category>
      <category>powerapps</category>
      <category>powerplatform</category>
      <category>restapi</category>
    </item>
    <item>
      <title>Easily Get Numeric Dataverse Choice Set Value in Power Automate for a Text Value</title>
      <dc:creator>Mark Nanneman</dc:creator>
      <pubDate>Mon, 13 Jan 2025 16:52:47 +0000</pubDate>
      <link>https://dev.to/mark_nanneman_039fdb748ca/easily-get-numeric-dataverse-choice-set-value-in-power-automate-for-a-text-value-39n3</link>
      <guid>https://dev.to/mark_nanneman_039fdb748ca/easily-get-numeric-dataverse-choice-set-value-in-power-automate-for-a-text-value-39n3</guid>
      <description>&lt;p&gt;Sometimes in Power Automate you have a text value (string) and you want to use it to set a Choice Column in Dataverse. To do this, you need to get the numeric code value for that Choice Column Option. For large Choice Sets, it's impractical to use conditions. Fortunately there's a quick an easy way to get the required value using a Dataverse Web API endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add an "Invoke an HTTP request" Entra ID action
&lt;/h2&gt;

&lt;p&gt;We need to get a list of option values and their matching labels for our Choice Set in order to filter it based on the text on the submitted form. This can be done using a Dataverse Web API, which we can call with the "Invoke an HTTP request" action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab9s7uskl1ian10n0rek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab9s7uskl1ian10n0rek.png" alt="Image description" width="602" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a connection and sign in
&lt;/h2&gt;

&lt;p&gt;Use your Organization URL (first part of your url when you open a model-driven app) when creating the connection.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://&amp;lt;organization-url&amp;gt;.crm.dynamics.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhwz4l0bw0xz7hdbzlel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhwz4l0bw0xz7hdbzlel.png" alt="Image description" width="545" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also find it under "Developer Resources"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7axsv3qowywjrocz2yjb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7axsv3qowywjrocz2yjb.png" alt="Image description" width="240" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Construct a GET Method Request to the Solution Endpoint
&lt;/h2&gt;

&lt;p&gt;We will use the "Retrieve Option Set" GET endpoint listed by Microsoft here.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/data/v9.2/GlobalOptionSetDefinitions(Name='&amp;lt;option-set-name&amp;gt;')?$format=application/json;odata.metadata=none&lt;br&gt;
You will need to put the logical name of your Dataverse Choice Set in the endpoint after "Name='".&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can find the logical name of your choice set in Dataverse.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffw3eowxtn08p02bjq9p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffw3eowxtn08p02bjq9p7.png" alt="Image description" width="641" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will look like this in your flow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ecnqu5rc163iztc500k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ecnqu5rc163iztc500k.png" alt="Image description" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter the Returned Options Array for a Label that Matches the Text Submitted
&lt;/h2&gt;

&lt;p&gt;When the "Invoke an HTTP request" runs the Dataverse Web API Endpoint will return a complex JSON object defining the Choice Set with another complex array of Options for it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5nsjog44550ol86lvww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5nsjog44550ol86lvww.png" alt="Image description" width="800" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need to filter the included "Options" array to find the item with a label that matches our search string, so that we can grab the "Value" property of that item.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpky88pnhts5fyn6ws8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpky88pnhts5fyn6ws8j.png" alt="Image description" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From:&lt;/p&gt;

&lt;p&gt;Select the "Options" array from the HTTP response like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;body('Invoke_an_HTTP_request_-_Get_Choice_Set')?['Options']&lt;br&gt;
First Parameter:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The label is stored in each Option item under the following path, which we use in the first parameter of the filter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;item()?['Label/UserLocalizedLabel/Label']&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Second Parameter:&lt;/p&gt;

&lt;p&gt;The second parameter is the search string, in our case the "State" name submitted on the form.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5ycs3uhb3q5986ga2ll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5ycs3uhb3q5986ga2ll.png" alt="Image description" width="676" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code View:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cbtk6ycp5icaxqnzvmu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cbtk6ycp5icaxqnzvmu.png" alt="Image description" width="613" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the Value of the Item Returned by the Filter
&lt;/h2&gt;

&lt;p&gt;The filter will return the entire JSON object of the item with a matching Label. We only need the "Value" property.&lt;/p&gt;

&lt;p&gt;Use a compose to grab this.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;first(body('Filter_array_-_Options'))?['Value']&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Input this Integer on the "Add a new row" Action
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg326lfhndb8b3a2dpm6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg326lfhndb8b3a2dpm6q.png" alt="Image description" width="629" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;Power Platform Developer | LinkedIn: &lt;a href="https://www.linkedin.com/in/marknanneman/" rel="noopener noreferrer"&gt;Mark Nanneman&lt;/a&gt; | &lt;a href="https://marknanneman.wordpress.com/" rel="noopener noreferrer"&gt;Wordpress&lt;/a&gt; | YouTube: &lt;a href="https://www.youtube.com/%40markspowerstuff" rel="noopener noreferrer"&gt;Mark’s Power Stuff&lt;/a&gt;  | &lt;a href="https://buymeacoffee.com/marknanneman" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dataverse</category>
      <category>powerplatform</category>
      <category>dynamics365</category>
      <category>powerautomate</category>
    </item>
  </channel>
</rss>
