Flow: Tips and tricks

Microsoft Flow is a very powerful tool and can be used to do many different things. I think it has become my favorite tool in Office 365. Therefor I want to spread the Flow love and tell you a couple of tips and tricks when developing Flows.

Copy actions

A very useful and time saving capability within Micorosft Flow is that we can copy and paste actions. You can copy configured actions and reuse them! The best thing about this capability is that you can copy an action from one flow and past it into another. I often use this to copy the more complex HTTP request actions. This feature is currently in preview, but so far I have not encountered any issues with it.

  • Click on the … on an action.
  • Click on Copy to my clipboard (preview).
  • Click on + New step.
  • Open the tab My clipboard.
  • Select the copied action.

Continue flow after a failed action

By default a flow will stop working if an action fails. If you know that an actions might fail occasionally you can setup a situation where only that action fails but not the whole flow. You can do with the Configure run after setting.

  • Click on the … of the action after the action that might fail.
  • Click on Configure run after.
  • Here you can configure if the action will be run even if the previous failed, skipped or timed out.
  • In this example I selected both is successfull and has failed to.
  • The flow will now continue if the previous action failed or succeeded.

Scope try and catch

We can use the action scope to group actions to make the flow easier to read. There is however another great use for them. The scope action encapsulate a block of actions and inherit the last terminal status (Succeeded, Failed, Cancelled) of actions inside. This in combination with the Configure run after setting we can create a try and catch logic in our flows. In this example the second scope (catch) only runs if the first scope (Try) failed.

  • Create a scope with some actions
  • Create a second scope after the first scope
  • Set the Configure run after setting of the second scope to has failed, is skipped and has timed out.
  • In this scenario the catch scope will only run if the Try scoped faild.
  • The flow will look like this.

SharePoint Online: New features

Microsoft is working hard to update Office 365 by adding new features and improving the overall user experience. I am very excited for the following new features. Note that some of these features are already live, being rolled out or still being developed.

You will no longer need to post the same message in multiple channels! With this new feature you can create one message and post it to multiple channels.

Teams: Post in multiple channels

SharePoint: Customize search results

This feature is still in development but highly anticipated. I cannot wait to be able to create custom search results with the new experience.

SharePoint: Organization assets library

This feature is deployed and ready to be used. You can create a central location for organization wide assets. This will help every user to quick find the company logo and other assets.

MyAnalytics

With MyAnalytics you can take a critical look at your Outlook and time usage. With these insights adjust you can adjust your planning to stay digitally fit.

Microsoft Search

The search experience will be extended, this means that where ever you are in Office 365 you will have access to a search bar. You’ll find the new Microsoft Search box at the top of several of the apps in Microsoft 365. It looks like this:

SharePoint: Drag and drop files to the canvas

It looks like a small change but it will make the live of content editors easier. We can now drag and drop files to the canvas (SharePoint page).

SharePoint: Quick edit

When in the quick edit mode you can do the following.

  • Reorder by dragging
  • Filtering
  • Adjust column width
  • People picker

SharePoint: Duplicate web parts

Another small but very helpful feature for content editors, we can now duplicate web parts!

SharePoint: undo and redo

The CTRL+Z & CTRL+Y has arrived, we can now undo and redo changes when editing pages!

Stream: Recycle bin

A recycle bin has been added to Stream. When a video is deleted it will be placed in the recycle bin, after 30 days the video will be deleted permanently.

Mijn inhoud - recycle bin menu-item

Stream: Replace video

Made a small change to a video and want to replace the old video? You now can replace it. This way the link and tags will remain the same.

SharePoint: Get all the IDs

SharePoint has many IDs and when you are developing on SharePoint quite often you require one of these IDs. You might need the web ID or the Office 365 tenant ID. Not all of the IDs are easy to find. In this blog post I wrote done a list of various IDs and where to find them. If I missed one, feel free to leave a comment.

Office 365 tenant ID

  1. Sign in to the Azure Active Directory admin center as a global or user management admin.
  2. Under Manage, select Properties. The tenant ID is shown in the Directory ID box.
  3. Or try the direct link. https://aad.portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Properties

Web ID for a SharePoint site

The web ID of a site can be found with the help of the API.

SharePoint on-premise

https://<site>/_api/web/id

SharePoint Online

https://<site>.SharePoint.com/_api/web/id

SharePoint Online sub site collection

https://<site>.sharepoint.com/sites/<subsitecoll>/_api/web/id

Content type ID

  • Navigate to the location of the content type.
    • For example open the list settings.
    • Click on the content type name.
  • Open the settings page of the content type.
  • The ID is located in URL after ctype=
_layouts/15/ManageContentType.aspx?ctype=0x01010050A0D7467D640B4A90298761CEAB2DBF04

List ID

  • Navigate to the location of the list.
  • Open the list settings.
  • The ID is located in URL after List=
_layouts/15/listedit.aspx?List=9db54e81-a910-44e5-a2fc-ac3e0733bc71

Document Library ID

  • Navigate to the location of the list.
  • Open the list settings.
  • The ID is located in URL after List=
_layouts/15/listedit.aspx?List=0e93dff3-5530-4503-8b42-8b8cbbdee663

Role IDs

SharePoint uses role IDs to create the permissions levels for SharePoint Groups. These role IDs are a set of numbers that define the precise permissions level details. You can read in the blog post SharePoint: Get the Role ID on how to find the role IDs.

List workflow ID

  • Navigate to the list.
  • Open the workflow settings.
  • Click on the name of the workflow, this opens the setting for the worklfow.
  • The ID is located in URL after SubscriptionId=
    • The { and } are not part of the ID.
/_layouts/15/AddWrkfl.aspx?List={45743782-4F04-4E33-8605-4E1DCBBCE44E}&SubscriptionId={1F6A7AF5-E671-42A5-AB35-66376F42FF99}

Site workflow ID

  • Navigate to the site.
  • Open the workflow settings.
  • Click on the name of the workflow, this opens the setting for the worklfow.
  • The ID is located in URL after SubscriptionId=
    • The { and } are not part of the ID.
/_layouts/15/AddWrkfl.aspx?List={45743782-4F04-4E33-8605-4E1DCBBCE44E}&SubscriptionId={1F6A7AF5-E671-42A5-AB35-66376F42FF99}

Permission group ID

  • Note that permission group IDs are unique within a site collection.
  • Navigate to the location of the permission group and open the group.
  • The ID is located in URL after MembershipGroupId=
/_layouts/15/people.aspx?MembershipGroupId=41

Flow: Approval reminders

For a complicated review process a customer required that users receive reminders on their approval tasks. In most cases you will need a reminder for tasks, but flow approval tasks (at the writing of this blog) don’t have a default reminder setting.

Microsoft has stated that this will become a default feature, but it is unknown when it will be released. So for now you can use the Following solution.

The solution consist of two flows, a flow that is responsible for the overall process and one flow for the reminders.

Reminder flow being started

First we will need to create the reminder flow. This is required because we will need the HTTP POST URL of the reminder flow in the process flow to be able to starts the reminder Flow.

  • Create a flow with the trigger: When a HTTP request is received.
  • Open the trigger action, the generated HTTP POST URL will be used in the other flow.
  • Set the Request Body JSON Schema to be able to receive an id value.
    {     "Type": "object",     "properties": {         "id": {             "type": "string"         }     },     "required": [         "id"     ] } 
  • Add the action Parse JSON.
  • Set the output of the trigger called body as the content (input) for the Parse JSON action.
  • Set the following schema.
    {     "type": "object",     "properties": {         "id": {             "type": "string"         }     } } 
  • Add the delay action and set the timer.
  • Add the Get Item (by ID).
  • Set the action Get Item (by ID) to use the ID generated in the parse JSON action.
  • Now you can add all the required actions and manipulations you need to do on the item.
  • In my flow I check if the SP Document status, if the status is not reviewed a reminder is send, if reviewed nothing happens.

Process flow – starts reminder flow

When you start a flow on an item you will need to tell the flow on which item to start. In my example I am using a fixed id. In most cases you will need to create a more dynamic solution.

  • Create a flow that starts with your preferred trigger.
  • Add a parallel action.
  • Add the HTTP action to the flow to branch.
  • Set the method to POST.
  • Set the URI, copy it from the trigger of the flow that is being started.
  • Set the Body.
    {   "id": "60" } 
  • Add the start and wait for approval to the other branch.
  • If the approval is done I set the property SP Document status to reviewed, this way no reminder will be send.

Flow: Button Flow with user input

Button Flows are great for repetitive tasks that that can run with just a push of a button. But also, to gather information for the users that starts the button Flow. This is a less known feature but very useful!

The Flow

  • Create a Flow with the manual trigger (Flow button).
  • Click on add an input, you can add various types of input.
  • When the Flow starts the user can provide the required input.
  • Click on the … of an input field to make it optional or required.
  • An input text field can also be modified to be a drop-down list or a multi-select list.

Flow: Set permissions using REST API without app permissions

In my last blog post Flow: Set permissions using REST API, I explained how to use the HTTP action and the app permissions. With the HTTP action you can start web services from SharePoint but also from other solutions.
In this blog post I will explain an easier way of using the SharePoint REST API. This setup does not require setting the app permissions. We can simply use the action Send an HTTP request to SharePoint.

Creating the Flow

  • First, we will break the inheritance.
  • Create a Flow with the required trigger.
  • Add the Initialize variable.
  • Rename it to Initialize variable – User Principle ID.
  • Set the name to User Principle ID.
  • Set the type to String.
  • Add the Send an HTTP request to SharePoint action.
  • Change the name to Send an HTTP request to SharePoint – Break inheritance.
  • Select or set the correct Site Address.
  • Set the Methode to POST.
  • The URI is different for every item/list you want to manipulate.
  • _api/lists/getbytitle(‘<list display name>’)/items(<ITEM ID>)/breakroleinheritance(true)
  • Set the Headers as follows.
  • The key is Accept
  • The value is application/json;odata=verbose
  • Now we will look up the user’s information.
  • Add the Send an HTTP request to SharePoint action.
  • Change the name to Send an HTTP request to SharePoint – Get User Info.
  • Select or set the correct Site Address.
  • Set the Methode to GET
  • The URI is different for every item/list you want to manipulate.
    _api/web/siteusers/getbyemail(‘<email address>’)
  • Set the Headers as follows.
  • The key is Accept
  • The value is application/json;odata=verbose
  • Add the Parse JSON action.
  • Set the Content to Body (the result of the Get User info action).
  • Change the name to Parse JSON – Get User Principal ID.
  • Use the following Schema to parse the JSON. This will give you more than you will not for this example. I add this Schema, so you have access to more information if required.
{
    "type": "object",
    "properties": {
        "d": {
            "type": "object",
            "properties": {
                "Alerts": {
                    "type": "object",
                    "properties": {
                        "__deferred": {
                            "type": "object",
                            "properties": {
                                "uri": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                },
                "Groups": {
                    "type": "object",
                    "properties": {
                        "__deferred": {
                            "type": "object",
                            "properties": {
                                "uri": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                },
                "Id": {
                    "type": "integer"
                },
                "IsHiddenInUI": {
                    "type": "boolean"
                },
                "LoginName": {
                    "type": "string"
                },
                "Title": {
                    "type": "string"
                },
                "PrincipalType": {
                    "type": "integer"
                },
                "Email": {
                    "type": "string"
                },
                "Expiration": {
                    "type": "string"
                },
                "IsEmailAuthenticationGuestUser": {
                    "type": "boolean"
                },
                "IsShareByEmailGuestUser": {
                    "type": "boolean"
                },
                "IsSiteAdmin": {
                    "type": "boolean"
                },
                "UserId": {
                    "type": "object",
                    "properties": {
                        "__metadata": {
                            "type": "object",
                            "properties": {
                                "type": {
                                    "type": "string"
                                }
                            }
                        },
                        "NameId": {
                            "type": "string"
                        },
                        "NameIdIssuer": {
                            "type": "string"
                        }
                    }
                },
                "UserPrincipalName": {
                    "type": "string"
                }
            }
        }
    }
}
  • Add the Set variable action.
  • Change the name to Set variable – User Principle ID.
  • Select by name the variable User Principle ID.
  • Set the value to ID (the ID output from Parse JSON – Get User Principal ID)
  • Now we will grant a user permissions, I am granting the challenger (property of the item) contribution access.
  • Add the Send an HTTP request to SharePoint action.
  • Change the name to Send an HTTP request to SharePoint – Grant Contribute permissions.
  • Select or set the correct Site Address.
  • Set the Methode to POST.
  • The URI is different for every item/list you want to change.
    <site url>/_api/lists/getbytitle(‘<list display name>’)/items(<ITEM ID>)//roleassignments/addroleassignment(principalid='<d.ID>’roleDefId=1073741827)
  • The id 1073741827 stands for contributor, in my blog post SharePoint: Get the Role ID you can read more about role id’s.
  • Your Flow will now look like this.