<?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: Richard Roelofs</title>
    <description>The latest articles on DEV Community by Richard Roelofs (@roelr1).</description>
    <link>https://dev.to/roelr1</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%2F2947886%2F47a35802-0fb7-434e-80a9-0b000e707df8.png</url>
      <title>DEV Community: Richard Roelofs</title>
      <link>https://dev.to/roelr1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/roelr1"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Richard Roelofs</dc:creator>
      <pubDate>Sun, 20 Jul 2025 14:33:13 +0000</pubDate>
      <link>https://dev.to/roelr1/-19ph</link>
      <guid>https://dev.to/roelr1/-19ph</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/roelr1/import-multiple-csv-files-into-power-bi-desktop-191b" class="crayons-story__hidden-navigation-link"&gt;Import multiple CSV files into Power BI Desktop&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/roelr1" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2947886%2F47a35802-0fb7-434e-80a9-0b000e707df8.png" alt="roelr1 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/roelr1" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Richard Roelofs
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Richard Roelofs
                
              
              &lt;div id="story-author-preview-content-2708267" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/roelr1" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2947886%2F47a35802-0fb7-434e-80a9-0b000e707df8.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Richard Roelofs&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/roelr1/import-multiple-csv-files-into-power-bi-desktop-191b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 20 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/roelr1/import-multiple-csv-files-into-power-bi-desktop-191b" id="article-link-2708267"&gt;
          Import multiple CSV files into Power BI Desktop
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/csv"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;csv&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/microsoft365"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;microsoft365&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/data"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;data&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/roelr1/import-multiple-csv-files-into-power-bi-desktop-191b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>csv</category>
      <category>microsoft365</category>
      <category>python</category>
      <category>data</category>
    </item>
    <item>
      <title>Import multiple CSV files into Power BI Desktop</title>
      <dc:creator>Richard Roelofs</dc:creator>
      <pubDate>Sun, 20 Jul 2025 14:29:54 +0000</pubDate>
      <link>https://dev.to/roelr1/import-multiple-csv-files-into-power-bi-desktop-191b</link>
      <guid>https://dev.to/roelr1/import-multiple-csv-files-into-power-bi-desktop-191b</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;"I am familiarizing myself a bit with Power BI. I was looking for a fun dataset. I like Formula 1. I searched and found it. 14 CSV files all with a different table schema. Of course, I used Chat GPT. I asked how I could do this automatically. I got an answer, but I still had to create a query 14 times. You can also read and import Excel files. I first made a PowerShell script with Chat GPT. It works fine, but the script was not very fast. I wrote the script in Python, and it is significantly faster. Perhaps if you read this, you wonder why I am sharing this? I completely understand. But by thinking that you can export it to Excel yourself and I can't find much about it on the internet. I decided to share it anyway. It can save a lot of time. Maybe you can find it on the internet. But I am not good at searching."&lt;br&gt;
If you need any further assistance, feel free to ask! 😊&lt;/p&gt;

&lt;h2&gt;
  
  
  The Python Script.
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import pandas as pd
import glob
import os
from tqdm import tqdm

# Configuration
csv_folder = r'f:/archiveF1'  # folder with your .csv files
excel_output = r'F:/samengevoegdv2.xlsx'  # output file

# Retrieve all CSV files
csv_files = glob.glob(os.path.join(csv_folder, '*.csv'))

# Write to a single Excel file, each CSV on a separate sheet
with pd.ExcelWriter(excel_output, engine='xlsxwriter') as writer:
    for file in tqdm(csv_files, desc='CSV to Excel', unit='file'):
        sheet_name = os.path.splitext(os.path.basename(file))
        df = pd.read_csv(file, delimiter=',')
        df.to_excel(writer, sheet_name=sheet_name, index=False)

print(f'Done: all {len(csv_files)} CSVs have been imported into {excel_output}')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Last Word
&lt;/h2&gt;

&lt;p&gt;You can fine-tune the script a bit more with ChatGPT, for example by having it create the Excel file, with or without a specific naming convention.&lt;br&gt;
ChatGPT handled everything here. Maybe you are smarter and would have chosen Excel right away. I didn’t, and once again, that’s why I’m sharing this.&lt;/p&gt;

</description>
      <category>csv</category>
      <category>microsoft365</category>
      <category>python</category>
      <category>data</category>
    </item>
    <item>
      <title>How To Set Permission On a Document library on A SharePoint site.</title>
      <dc:creator>Richard Roelofs</dc:creator>
      <pubDate>Tue, 15 Apr 2025 06:41:53 +0000</pubDate>
      <link>https://dev.to/roelr1/how-to-set-permission-on-a-document-library-on-a-sharepoint-site-2721</link>
      <guid>https://dev.to/roelr1/how-to-set-permission-on-a-document-library-on-a-sharepoint-site-2721</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;At my work, we are preparing to migrate data to SharePoint Online. We are going to create a landing site where everyone within the organization has access, and we are going to create document libraries and place the data there. Employees who had access in the past will, of course, get it again. We will work with members, visitors, and owners. This inspired me to see if this could be automated.&lt;br&gt;
There are other possibilities, but together with my good friend ChatGPT, we concluded that we would work in Azure with an automated account that can run a script via a Powershell script (runbook). Namely, granting permissions. The owner could then grant permissions to employees via a form hosted via a static web app. This was possible via a webhook. This all sounded really great, but since you are calling different APIs, it's more challenging than you think. I ended up in a proverbial loop because you need a token to connect to MS – Graph. However, after much research, this had to be a secure string, and so we also made the script. Token checked, it was valid, but I kept getting the message "invalid JMT token." And when I did it as plain text, I got the message that it had to be a secure string.&lt;br&gt;
I spent quite some time over a period of two weeks figuring out that I couldn't get that stuff working. I had the same result with a Windows form and a PowerShell script. I converted this to an .exe, and this can then be offered at the workplace. But I managed this in 45 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparation
&lt;/h2&gt;

&lt;p&gt;In principle, I could create the PowerShell script myself. Writing a function. But I would do this with Google in the past. Now I have created a project in ChatGPT this much quicker. Of course, I also tried this with the Azure variant, but it did not work out. I asked the question that an owner of a document library can grant Full Control, Write, and Read permissions to another person in the tenant. The setup is a kind of landing page in SharePoint where everyone has access, and it is determined at the document library level what you can access in terms of files. You only see the libraries you have permissions for. Creating the SharePoint site and creating a library is beyond the scope of this article. Do you want to apply this at work? Or are you just interested? Let me know. I do have this PowerShell script. I first created the script without a form and tested whether you can indeed grant permissions. I did this in an E5 development environment. After some testing, it worked, and I asked for a simple form to be made. This went quite quickly. I forgot to add the option to add more members at once and the question of whether you wanted to add another member. And if you answered no, the form would close neatly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Output(Powershell script)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Import-Module PnP.PowerShell -ErrorAction Stop

# === Step 1: Connect to SharePoint ===
$siteUrl = "The Url of the SharePoint site."

try {
    Connect-PnPOnline -Url $siteUrl -UseWebLogin
    $global:connected = $true
} catch {
    [System.Windows.Forms.MessageBox]::Show("ERROR connecting: $_", "Connection Failed", "OK", "Error")
    return
}

# === Step 2: Build Form ===

$form = New-Object System.Windows.Forms.Form
$form.Text = "Set SharePoint Permissions"
$form.Size = New-Object System.Drawing.Size(600, 400)
$form.StartPosition = "CenterScreen"

# Label library
$lblLib = New-Object System.Windows.Forms.Label
$lblLib.Text = "Document Library:"
$lblLib.Location = New-Object System.Drawing.Point(10,20)
$lblLib.Size = New-Object System.Drawing.Size(200,20)
$form.Controls.Add($lblLib)

# ComboBox library
$cbLib = New-Object System.Windows.Forms.ComboBox
$cbLib.Location = New-Object System.Drawing.Point(10,40)
$cbLib.Width = 550
$form.Controls.Add($cbLib)

# Button: fetch libraries
$btnAuth = New-Object System.Windows.Forms.Button
$btnAuth.Text = "Fetch Libraries"
$btnAuth.Location = New-Object System.Drawing.Point(10, 80)
$btnAuth.Width = 550
$form.Controls.Add($btnAuth)

# Label user
$lblUser = New-Object System.Windows.Forms.Label
$lblUser.Text = "User ID (email, separate multiple with , or ;):"
$lblUser.Location = New-Object System.Drawing.Point(10,130)
$lblUser.Size = New-Object System.Drawing.Size(400,20)
$form.Controls.Add($lblUser)

# TextBox user
$txtUser = New-Object System.Windows.Forms.TextBox
$txtUser.Location = New-Object System.Drawing.Point(10,150)
$txtUser.Width = 550
$form.Controls.Add($txtUser)

# Label permissions
$lblPerm = New-Object System.Windows.Forms.Label
$lblPerm.Text = "Permission Level:"
$lblPerm.Location = New-Object System.Drawing.Point(10,190)
$lblPerm.Size = New-Object System.Drawing.Size(200,20)
$form.Controls.Add($lblPerm)

# ComboBox permissions
$cbPerm = New-Object System.Windows.Forms.ComboBox
$cbPerm.Location = New-Object System.Drawing.Point(10,210)
$cbPerm.Width = 550
$cbPerm.Items.AddRange(@("Read", "Contribute", "FullControl"))
$form.Controls.Add($cbPerm)

# Button: assign permissions
$btnSend = New-Object System.Windows.Forms.Button
$btnSend.Text = "Assign Permissions"
$btnSend.Location = New-Object System.Drawing.Point(10,260)
$btnSend.Width = 550
$form.Controls.Add($btnSend)

# Label output
$lblOutput = New-Object System.Windows.Forms.Label
$lblOutput.Location = New-Object System.Drawing.Point(10,300)
$lblOutput.Size = New-Object System.Drawing.Size(560,40)
$form.Controls.Add($lblOutput)

# === Step 3: Events ===

# Fetch libraries
$btnAuth.Add

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Output(form)
&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%2Fy1f99hg92wpzm2k51q0z.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%2Fy1f99hg92wpzm2k51q0z.png" alt="Image description" width="579" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Push on the button Fetch libraries. You have to authenticatie yourself on the web. After that you can assign members.&lt;/p&gt;

&lt;h2&gt;
  
  
  Details
&lt;/h2&gt;

&lt;p&gt;Unfortunately, the PS convert to exe module that you can download from the PSGallery does not work for PowerShell 7.&lt;br&gt;
If you still want to offer this, for example on an Intune workplace, you need to create a shortcut that&lt;br&gt;
refers to the following&lt;br&gt;
"C:\Program Files\PowerShell\7\pwsh.exe" -WindowStyle Hidden -ExecutionPolicy Bypass -File "D:\FOLDER\File.ps1"&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>sharepoint</category>
      <category>windowsform</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>How I Handle errors in Powershell 7 when using loops</title>
      <dc:creator>Richard Roelofs</dc:creator>
      <pubDate>Mon, 31 Mar 2025 12:49:24 +0000</pubDate>
      <link>https://dev.to/roelr1/how-i-handle-errors-in-powershell-7-when-using-loops-2cpl</link>
      <guid>https://dev.to/roelr1/how-i-handle-errors-in-powershell-7-when-using-loops-2cpl</guid>
      <description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In PowerShell, there are different ways to handle errors in a script. The try and catch methods are good examples of this. Personally, these did not work for me. With the advent of PowerShell 7, error handling has improved. It is easier to identify what goes wrong. However, when using a "loop," the display can become cluttered. You can avoid this by creating an object and writing its output to a file in CSV format. This can be opened in Excel, making it easier to filter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PARTIAL CODE EXAMPLE&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;foreach ($i in $dataCSV) {&lt;br&gt;
Write-Host "user: $($i.upn)"&lt;br&gt;
$li = Set-MgUserLicense -UserId $i.upn -AddLicenses @() -RemoveLicenses $removeLicenses.SkuId -ErrorAction SilentlyContinue&lt;br&gt;
if ($null -eq $li) {&lt;br&gt;
$li&lt;br&gt;
$error = Get-Error&lt;br&gt;
write-verbose "$($error.ErrorDetails)"&lt;br&gt;
$errorData += [PSCustomObject]@{&lt;br&gt;
upn = $i.upn&lt;br&gt;
error = $error.ErrorDetails&lt;br&gt;
Trace = $error.ScriptStackTrace&lt;br&gt;
} | Export-Csv -Path C:\temp\test.csv -Append -NoTypeInformation&lt;br&gt;
} else {&lt;br&gt;
$errorData += [PSCustomObject]@{&lt;br&gt;
upn = $i.upn&lt;br&gt;
error = "No Error"&lt;br&gt;
Trace = $error.ScriptStackTrace&lt;br&gt;
} | Export-Csv -Path C:\temp\test.csv -Append -NoTypeInformation&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EXPLANATION OF CODE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The code is a part of a script where a license is removed from a person. The foreach loop retrieves data from a CSV file via the variable: dataCSV, as the name of the variable suggests. It deals with the User Principal Name, which is displayed on the screen.&lt;br&gt;
Then a variable: li is created with a cmdlet that removes the license. The names of the persons come from the CSV file, and the type of license from the variable: removeLicenses. How exactly this is done is not traceable from this part of the code. But this does not matter for the explanation.&lt;br&gt;
In the variable: li, you include parameters -ErrorAction "SilentlyContinue". This means that errors are not shown, and the script continues and does not stop.&lt;br&gt;
We will now catch the error with an if statement. If the cmdlet cannot be executed, it has no output. In PowerShell, this is comparable to the variable $null. We capture the error with Get-Error and link it to the variable $error.&lt;br&gt;
We create a new CustomObject $errorData and provide it with the data we want for the CSV file with the error message. This consists of the employee's name, whether there is an error or not. In the case of an error, the trace is displayed.&lt;/p&gt;

</description>
      <category>powershell</category>
    </item>
    <item>
      <title>Microsoft Flow send mail 30 days reminder</title>
      <dc:creator>Richard Roelofs</dc:creator>
      <pubDate>Sat, 29 Mar 2025 22:29:23 +0000</pubDate>
      <link>https://dev.to/roelr1/microsoft-flow-send-mail-30-days-reminder-4hfb</link>
      <guid>https://dev.to/roelr1/microsoft-flow-send-mail-30-days-reminder-4hfb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I was actually inspired by an incident at work. I check an Excel list to notify an employee when a certificate, such as one for a server or an application, is about to expire. Why doesn’t these persons do this by themselves? Good question—it sometimes goes wrong because of this :)&lt;/p&gt;

&lt;p&gt;There are certainly other ways to solve this, but I thought it would be nice to tackle it with PowerApps by creating a flow. This is not a step-by-step article, but I will give you the key things you need to configure. How to, for example, start a flow is something you should already know or look up yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do we make this happen?&lt;/strong&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%2Fowhlvy2kztb3f3xg082p.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%2Fowhlvy2kztb3f3xg082p.png" alt="Image description" width="600" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recurrence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When creating a new flow from scratch, choose a scheduled flow. Here, you specify the name, when this flow should start, at what time, and how often.&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%2Fls8e0fdy50qfm9ftbf27.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%2Fls8e0fdy50qfm9ftbf27.png" alt="Image description" width="423" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List row present in a table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, we will link the Excel file. In this case, OneDrive has been chosen, but SharePoint is also an option. The requirement, however, is that it must be a table. You will likely need to convert it to a table in Excel first.&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%2Fwo4w9emxkbylnbp7l08a.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%2Fwo4w9emxkbylnbp7l08a.png" alt="Image description" width="597" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apply to each&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now comes the most challenging part. I enlisted the help of ChatGPT because the rows with a date were being compared with an expression and were supposed to return "true," but it kept returning "false" in the flow. Therefore, four compose steps were created to ultimately use a simple condition. I will explain this step by step based on the screenshot.&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%2Fa0w562vm1gs6znq6sk6t.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%2Fa0w562vm1gs6znq6sk6t.png" alt="Image description" width="632" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Select an output from previous steps&lt;/em&gt;&lt;br&gt;
When you click with the mouse on the empty field, you will see the screenshot below (this is not the entire screenshot). You select "value, list of items."&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%2Fvsvsvy53etp4s1xq5p6u.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%2Fvsvsvy53etp4s1xq5p6u.png" alt="Image description" width="379" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ExcelDatumFormatted(first compose step)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Create the following expression : addDays('1900-01-01', sub(int(items('Apply_to_each')?['datum']), 2), 'yyyy-MM-dd')&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Today30min(second compose step)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Create the following expression : &lt;br&gt;
string(formatDateTime(addDays(utcNow(), -30), 'yyyy-MM-dd'))&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CompareDebug(third compose step)&lt;/em&gt;&lt;br&gt;
Create the following expression : string(formatDateTime(addDays(utcNow(), -30), 'yyyy-MM-dd'))&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Compose(fourth and last compose step)&lt;/em&gt;&lt;br&gt;
Create the following expression : equals(   trim(string(outputs('ExcelDatumFormatted'))),   trim(string(outputs('Vandaag30min'))) )&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Condition&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;in the left field, select the output from the last compose step. The condition should be set to "is equal to," and then type "true."&lt;/p&gt;

&lt;p&gt;_IF YES&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%2Fzunkho4s6qihwfmhcqar.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%2Fzunkho4s6qihwfmhcqar.png" alt="Image description" width="600" height="945"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This reveals that I’m Dutch :) and I happen to be using Copilot right now to translate the text into English. The screenshot section "Send an email (V2)" is actually self-explanatory—you link it to the column in the Excel file, recognizable by the Excel icon. This also applies to "Update a row," but for the Id, you need to create an expression: int(items('Apply_to_each')?['Id']).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Epilogue&lt;/strong&gt;&lt;br&gt;
The expression already contains Dutch terms in the actual expression. If you encounter any issues with this, let me know, and I will adjust the article accordingly!&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>powerapps</category>
      <category>powerautomate</category>
    </item>
  </channel>
</rss>
