
Announcements
Hello,
I have a document library with png files. Those png files are all intended to be emailed to different recipients. However, some recipients are to receive more than 1 file. I would like them to get only 1 email and am uncertain how to write this flow.
In the screenshot from this doc library, I would like them to group by field "AttachmentPrefix" and then be sent to the email address associated with that Prefix. So in the image below, the green items would be sent in one email; the blue items would be sent in one email; and the red ones would be sent individually.
Here is a specific step by step walk through:
First the overall Flow
Look down below for walkthrough
First I have my SharePoint list. It is essentially like yours, I just dont have a link. I am going to want to send one manager, all the rows that have the same Serial Number. Essentially how you want to group by prefix, I am grouping my Serial Number. I have 2 unique serial numbers, so the flow will end up sending 2 emails.
Note: I also have an email address field I just didn't show it.
Step 1. I am using a Manual Trigger for Ease
Step 2. Add an Initialize Variable and paste this in. This will give styling to your table. Which we will build shortly
Since you want to send an email and I want it to look like, I am building a Table for the Email.
<style>
table {
border: 1px solid #1C6EA4;
background-color: #EEEEEE;
width: 40%;
text-align: left;
border-collapse: collapse;
}
table td, table th {
border: 1px solid #AAAAAA;
padding: 3px 2px;
}
table tbody td {
font-size: 13px;
}
table thead {
background: #1C6EA4;
border-bottom: 2px solid #444444;
}
table thead th {
font-size: 15px;
font-weight: bold;
color: #FFFFFF;
border-left: 2px solid #D0E4F5;
}
table thead th:first-child {
border-left: none;
}
</style>
Step 3. It is our Get Items
Now in the get items you can leverage a View to limit how many of the custom columns (that you added) are returned. It is important to note, that you cannot limit the SYSTEM/Standard columns, which stinks.. but it is what it is. My list didn't have many rows or custom columns so I didn't use a View to limit them.
Step 4. Now what you wanted was to send an email based on grouping the Unique Prefixes, so that an email only contained those Prefixes.
So what we are going to do are 2 things.
In this step You wil add a Select action. I renamed it to Get Serial Numbers. then I created a Key Name up, which was SerialNumber with no spaces. Its up to you what you name it. For you thought this would be your Prefix column.
In the value, I want to put the Dynamic Property that was created by the Get Items. So click in value box, then when the dynamic Property window appears scroll down under Get items and click Serial Number (in your case the Prefix Column Name)
Now what this does is create an array that ONLY has the Serial Numbers in it, BUT they are not unique yet. Now we have to do the second step
Step 5. Add a Compose action. I renamed mine to Generate Unique Serial Number List
And in here, we are going to use the union expression to essentially join the output of the Get Serial Numbers (select action), to itself. By doing this, it removes the duplicates.
So for me I typed this. In your case, you would type body('Enter the name you gave your select and add _ (aka an underscore) where ever a space was, as spaces are not legit here')
union(body('Get_Serial_Numbers'),body('Get_Serial_Numbers'))
Step 6. Now we have a unique array of Serial Numbers (aka Prefixes) and we need to loop through them
-Add an Apply to Each. I renamed mine Loop through Unique Serial Numbers.
For in the Input, where it says Select the output from a previous step, we need to pick the output of the Compose, where we created our union / aka unique list so I clicked inside the select an output box, when the dynamic properties appeared, I clicked on Outputs under the Compose I called Generate Unique Serial Number List. Remember this is an Array of unique Serial Numbers. We will use this loop to then Filter the original Get Items data, to only gives us the Rows that have this specific Serial Number (aka prefix).
2
Step 7. Inside the Loop
-Ok inside the loop the first thing we need to do is Filter the Get Items data, to only have the rows we want based on the current Unique Serial Number, in our Apply to Each Loop
Now we do this by clicking the From and then in Dynamic properties, click the value property under Get Items
Then on the left we also click the box and then in the Dynamic Properties under Get Items we pick Serial Number
We leave the default of is equal to
Lastly, in the right we need to use the Value of the current Unique Serial Number in our Loop. I do this, with this expression. which is typed into the Expression window
items('Loop_through_Unique_Serial_Numbers')['SerialNumber']
Step 8. Next, if you recall, even if we had Filtered the Columns by a view in our Get Items, we wouild still have gotten all the ugly System/Standard columns and we do not want that in our table. So we use a Select, to only grab the Columns we want, but not from Get Items, but from the output of the Filter, since it only has the rows we care about.
The From is the Dynamic Property output from the Filter
Then 1:1 we add in our Key / Value Pairs
You can see I added 4 columns. On the left you type a string, on the right, and this is something that boggles alot of peoples minds is you put in the following code, changing only the Column name each time.
item()['Title']Now normally item is reserved for inside an Apply to each loop to access the current loop iteration row/data but when doing a Filter, its sort of a built in loop, so you have to use item()['ColumnName'] to get out what you want from the Filter and into the Select
Step 9. Create HTML Table
Now that we have the exact data that we want and the exact columns we want, we can use the Outputs of the Select to automatically build a nice table.
So add a Create HTML Table action. for the From, select the Dynamic output property of your select
Step 10. Send Email to Manager
Add a Send Email V2 Action
For the To: I will get to that in a moment
For the body Here is what I added
You can see I typed in the Dear Prefix Owner, etc
But what you also see are two side by side Outputs
The First one, is the Output of our Compose, from the first step, where we added CSS. So click inside the email body area, then find the Dynamic output property of our CSS Compose from at the top of my flow
Now next too it, is the Dynamic Output property of the HTML Table action we used.
Ok now lets talk about the Email. In your case I am assuming the email gets duplicated on every line of a Given Prefix. Which means it doesn't matter if we get it from Row 1 or Row 2232323 for a given Prefix, the email will be populated. But to make it easy on US, we are going to purposely point at the first Row every time. There is no reason to loop one the Email Address.
So in the To we will click there.
Then I will click Add dynamic content
Then in the Expression window. I will type this:
body('Filter_the_Select_Columns_Action_by_Unique_Serial_Number')[0]['EmailAddress']The code says, look at the body (which is the output of a filter), look at the first row [0] and pull the EmailAddress value.
NOTE: If you have no rows it would fail, but I would let you practice a little and say you should add error handling (just to be safe).
And here you can see my run is solid green
And I received 2 emails, as you recall I said I had 2 unique Serial Numbers
And here is what they look like
And
That concludes this sample. Now I wrote this specifically for you, so I would appreciate if this helps you, that you mark this one as Resolved and also a thumbs up (they are separate) so it shows up for others to find.
Cheers
If you like my answer, please Mark it as Resolved, and give it a thumbs up, so it can help others
Thank You
Michael Gernaey MCT | MCSE | MCP | Self-Contractor| Ex-Microsoft
https://gernaeysoftware.com
LinkedIn: https://www.linkedin.com/in/michaelgernaey