cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
jonbu
Frequent Visitor

Flow to create event for all users

Hello there.

 

I'd like to create a flow that creates an event for each entry in a sharepoint list.

I think it would be easy to create this for only one calender/user, but I'd like to create this event for all users and they should not get an invitation, it only has to be in their calender.

 

Unfortunately, I didn't get that far in my flow. Hope you have an idea how to solve this

 

Jonas

1 ACCEPTED SOLUTION

Accepted Solutions
eliotcole
Super User
Super User

Hi, @jonbu , thanks to @VictorIvanidze for spurring me on, I got there in the end.

 

This will accomplish what you need, as long as you have the requisit permissions, and that you've told whomever's in charge that you're doing it ;-).

 

Search For Users And HTTP Request The Event Into Their Calendar

What this does is find all the users in your company (more after the flow on that) then for each of them it sends a request to Microsoft to add the event into their calendar:

 

solution.jpg

 

Users

You can leave the number blank if your firm has under 1000 employees, otherwise it's wise to overshoot the amount of users here by a fair bit. So I did that as an example, just in case, as I have 9.

Optional Users

If you really want to future proof it make a userLimitVAR integer variable with an initial setting of 1000, a Do until action (with the Users action inside) that runs until the length() of the Users action is not equal to the userLimitVAR, and at the end of each loop inside that, add 1000 to the userLimitVAR. If you wish to count the users you can also populate a userCountVAR that contains that length(). Then pipe the Users result into a set variable for a usersARR array variable also at the end of the loop. All this does is ensure that you'll always get all the users.

 

Send an HTTP request (Office 365 Groups)

This is the meat of what you wanted to do, this HTTP request creates an event for whichever User Id you enter in the URI field, but it needs the JSON data to make it with.

 

It essentially performs the same action for any user that you would accomplish using the Office 365 Outlook connector's Create Event action. If you wanted to use this method to do that, you would replace the "users/id/" part with "me/" instead.

URI

The URI field here is:

 

 

 

 

https://graph.microsoft.com/v1.0/users/%7B@{items('Apply_to_each')?['Id']}%7D/calendar/events

 

 

 

 

The "@{items('Apply_to_each')?['Id']}" bit is representative of the graphical 'User id' that you see in the above image. If you have your Apply to each action named the same, then you might be able to paste that straight into the field without issue, but no guaruntees.

Body

The Body field is:

 

 

 

 

{
    "subject": "Eliot's Test Event",
    "body": {
        "contentType": "HTML",
        "content": "Call link: https://aka.ms/mmkv1b Submit a question: https://aka.ms/ybuw2i"
    },
    "start": {
        "dateTime": "2022-05-15T17:00:00",
        "timeZone": "UTC"
    },
    "end": {
        "dateTime": "2022-05-15T17:05:00",
        "timeZone": "UTC"
    },
    "location": {
        "displayName": "Skype for Business"
    }
}

 

 

 

 

This is taken from the example given on the Graph Explorer page (when you can try things like this out), but there are further examples on the documentation pages, here.

Extra Data?

If you have extra information that you wish to include, or retrieve dates/subjects/information from a list or something, just subsume this into your logic.

 

If you need something more complex, then you'll need to show us your flow as it is. But I reckon you can slide this in where-ever you need it.

Failures?

Don't worry about these. Anyone that has a calendar will get the event.

 

You will almost definitely get failures if you are in a company of more than a few employees. This is because some users in M365 do not have licences for the functions you're accessing here.

 

A more appropriate way to do this and illicit less errors in the loop would be to use an "All Staff" group to run this on. That way it will add it for all the staff, and they are almost 100% likely to have a full office licence, or at least Outlook. 😉

 

Or you could list all users, then check their licences, then use the ones with ... (you don't need to, though)

View solution in original post

11 REPLIES 11
eliotcole
Super User
Super User

Hi, @jonbu , let's start with getting a look at what you have. Can you please edit in what you've got so far into your question, above?

 

That'll help folks here potentially get a grip on what you're trying, show you what you're doing well, or to steer you around some more problematic parts.

 

Secondly, are all the entries already in the list? Or will this need to run every time an event is added to the list?

 

You can accomplish both with the same flow, but it'll help to get you sorted out swiftly.

 

---

 

Just some generally good advice for this kind of thing, firstly ensure that there is a yes/no column to confirm the event has been created. Then the following columns are optional, but will be so useful in creating any events elsewhere, and possibly even linking to them:

  • A date and time column, Include time, no friendly format.
  • A number column for the duration.
  • A URL column that can stay hidden for now (no need to include on views).

 

I assume that you have most of these (and the URL one is SUPER optional) but they'll all come in to play when you make the event. Look at what you'd need when making the event in Outlook.

eliotcole
Super User
Super User

I thought I'd found a way to do this, but it won't work with the Power Automate Graph HTTP connector's permissions. Even with my account that is a global administrator.

 

So, there's not an even slightly difficult way to do this without creating an Azure App with the right permissions to post requests under with a bearer token.

 

If that was in place, then:

  1. First you would need to get the IDs for all users, that you can accomplish in Power Automate.
  2. After that, you would need to check if each user has a valid, default, calendar. That would need a graph API GET call to /calendar for each user and you would need the isDefaultCalendar values specifically.
  3. Once that's done, you would make a POST /calendar/events call under for each valid user ID in the company.

 

So ... Essentially, I would say that you cannot do this in Power Automate easily.

 

If you wish to use Azure Apps, though, we can move on with that. Just bare in mind that any Azure App permissions will need to be approved within your company if you're not able to do that yourself.

Hi @eliotcole,

thanks for your comment.  I've done a quick test and all looks OK. 

In fact you do not need to use Azure app if you will execute the GRAPH requests using the action "Send an HTTP request (preview)" of the "Office 365 Groups" connector.

--------------------------------------------------------------------------------------
Contact me if you are interested in custom Power Automate development.

That's what I'd thought, @VictorIvanidze , however either;

... the connector doesn't have the right permissions in terms of executing the request.

... something else is amiss with how the connector works opposed to full perms requesting.

 

Every time I tried to perform the actions it would just loop the request, see here:

noCanDo.jpg

 

 

However if I put the request through in exactly the same fashion on the Graph Explorer, it worked like a dream.

 

I tried the connector method with just users/{id}/calendar/event (or with a slash at the start), too, and that's apparently invalid.

 

Give step #3 a test ... that's the one that kept failing for me (as the Global Administrator, running in the right environment) on the apply to each stage (after looking up the list of user IDs to apply it to).

 

All of this is why I offered to help with an Azure approval method, but only if the user really wants to go that deep.

Aha!

 

I've resolved it, I think. You need to URL encode the curly brackets. 🤦‍♀️

Hi @eliotcole,

I see you have dimmed the user ID, but why did you place { there?

Here is my test URL:

https://graph.microsoft.com/v1.0/users/eafb5262-2b92-4420-a970-c7fc51977974/calendar/events

 

--------------------------------------------------------------------------------------
Contact me if you are interested in custom Power Automate development.

Wow, you just do not need to use them at all! 😉

--------------------------------------------------------------------------------------
Contact me if you are interested in custom Power Automate development.

I'd tried that, and it just didn't work, same looping.

Either way, it's working now, about to post the solution.

 

eliotcole
Super User
Super User

Hi, @jonbu , thanks to @VictorIvanidze for spurring me on, I got there in the end.

 

This will accomplish what you need, as long as you have the requisit permissions, and that you've told whomever's in charge that you're doing it ;-).

 

Search For Users And HTTP Request The Event Into Their Calendar

What this does is find all the users in your company (more after the flow on that) then for each of them it sends a request to Microsoft to add the event into their calendar:

 

solution.jpg

 

Users

You can leave the number blank if your firm has under 1000 employees, otherwise it's wise to overshoot the amount of users here by a fair bit. So I did that as an example, just in case, as I have 9.

Optional Users

If you really want to future proof it make a userLimitVAR integer variable with an initial setting of 1000, a Do until action (with the Users action inside) that runs until the length() of the Users action is not equal to the userLimitVAR, and at the end of each loop inside that, add 1000 to the userLimitVAR. If you wish to count the users you can also populate a userCountVAR that contains that length(). Then pipe the Users result into a set variable for a usersARR array variable also at the end of the loop. All this does is ensure that you'll always get all the users.

 

Send an HTTP request (Office 365 Groups)

This is the meat of what you wanted to do, this HTTP request creates an event for whichever User Id you enter in the URI field, but it needs the JSON data to make it with.

 

It essentially performs the same action for any user that you would accomplish using the Office 365 Outlook connector's Create Event action. If you wanted to use this method to do that, you would replace the "users/id/" part with "me/" instead.

URI

The URI field here is:

 

 

 

 

https://graph.microsoft.com/v1.0/users/%7B@{items('Apply_to_each')?['Id']}%7D/calendar/events

 

 

 

 

The "@{items('Apply_to_each')?['Id']}" bit is representative of the graphical 'User id' that you see in the above image. If you have your Apply to each action named the same, then you might be able to paste that straight into the field without issue, but no guaruntees.

Body

The Body field is:

 

 

 

 

{
    "subject": "Eliot's Test Event",
    "body": {
        "contentType": "HTML",
        "content": "Call link: https://aka.ms/mmkv1b Submit a question: https://aka.ms/ybuw2i"
    },
    "start": {
        "dateTime": "2022-05-15T17:00:00",
        "timeZone": "UTC"
    },
    "end": {
        "dateTime": "2022-05-15T17:05:00",
        "timeZone": "UTC"
    },
    "location": {
        "displayName": "Skype for Business"
    }
}

 

 

 

 

This is taken from the example given on the Graph Explorer page (when you can try things like this out), but there are further examples on the documentation pages, here.

Extra Data?

If you have extra information that you wish to include, or retrieve dates/subjects/information from a list or something, just subsume this into your logic.

 

If you need something more complex, then you'll need to show us your flow as it is. But I reckon you can slide this in where-ever you need it.

Failures?

Don't worry about these. Anyone that has a calendar will get the event.

 

You will almost definitely get failures if you are in a company of more than a few employees. This is because some users in M365 do not have licences for the functions you're accessing here.

 

A more appropriate way to do this and illicit less errors in the loop would be to use an "All Staff" group to run this on. That way it will add it for all the staff, and they are almost 100% likely to have a full office licence, or at least Outlook. 😉

 

Or you could list all users, then check their licences, then use the ones with ... (you don't need to, though)

jonbu
Frequent Visitor

@eliotcole & @VictorIvanidze, you're absolutely great!!
Thank you very much for your qualified help. I think this helped me a lot, so I'll try to implement your solution in my company.

 

If there will be any problems or needed help, i'll tell you and hope for further help 😉


Thanks a lot!

I'm sure you'll be absolutely fine, mate. Don't fret it. 👍

Helpful resources

Announcements
Power Platform Conf 2022 768x460.jpg

Join us for Microsoft Power Platform Conference

The first Microsoft-sponsored Power Platform Conference is coming in September. 100+ speakers, 150+ sessions, and what's new and next for Power Platform.

MPA Virtual Workshop Carousel 768x460.png

Register for a Free Workshop

Learn to digitize and optimize business processes and connect all your applications to share data in real time.

Power Automate Designer Feedback_carousel.jpg

Help make Flow Design easier

Are you new to designing flows? What is your biggest struggle with Power Automate Designer? Help us make it more user friendly!

Top Solution Authors
Users online (3,439)