<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Canvas App on LinkeD365 Blog</title><link>https://linked365.blog/tags/canvas-app/</link><description>Recent content in Canvas App on LinkeD365 Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sun, 07 Jun 2020 00:00:00 +0000</lastBuildDate><atom:link href="https://linked365.blog/tags/canvas-app/index.xml" rel="self" type="application/rss+xml"/><item><title>Approvals - Showing History in SharePoint</title><link>https://linked365.blog/2020/06/07/approvals-showing-history-in-sharepoint/</link><pubDate>Sun, 07 Jun 2020 00:00:00 +0000</pubDate><guid>https://linked365.blog/2020/06/07/approvals-showing-history-in-sharepoint/</guid><description>&lt;img src="https://linked365.blog/images/2020/06-Annotation-2020-06-04-091056.png" alt="Featured image of post Approvals - Showing History in SharePoint" />&lt;p>Last week, I took part in the Microsoft 365 Virtual Marathon. This was a branch out for me, as it wasn&amp;rsquo;t specifically Dynamics 365 or Power Platform related, though everything is one now right?&lt;/p>
&lt;p>My talk was around Approvals, displaying 3 types of approvals, from a Send with Options to Adaptive cards, topics I have covered in my &lt;a class="link" href="https://linked365.blog/2020/04/02/quick-approvals-send-with-options/" target="_blank" rel="noopener"
>blog&lt;/a> &lt;a class="link" href="https://linked365.blog/2019/07/04/adaptive-cards-improved-approvals-part-1/" target="_blank" rel="noopener"
>before&lt;/a>.&lt;/p>
&lt;p>During the sessions, one of the questions was around tracking approvals. Even in the Approvals app, it is very difficult to track who has approved and when including the comments. If you want to see this in combination to the thing you were approving, it means swapping between apps and ensuring you know what record you are looking at.&lt;/p>
&lt;p>I took this as a challenge, and decided to use the Power Apps in SharePoint form to display Approvals.&lt;/p>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Display of Approvals in SharePoint or and Power Platform application is not intuitive. I use a Power App to display approvals against items on a SharePoint document library.&lt;/p>
&lt;h2 id="form-in-action">Form in Action&lt;/h2>
&lt;p>Before I run through the detail, check out the form in action below. As you show more details and display the associated Power Apps form, a list of the approvals is shown. If you drill into the approvals, more details about who it was sent to and how they responded are available.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/06-approvals1.gif"
loading="lazy"
alt="GIF showing Approvals in SharePoint"
>&lt;/p>
&lt;h2 id="simple-approval">Simple Approval&lt;/h2>
&lt;p>To get some approvals, I created a flow which is triggered when a file is added to the SharePoint folder. Obviously, this could be a lot more complex than this, but this simple one is to get some data in my approvals to show in SharePoint.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/06-image-50.png"
loading="lazy"
>&lt;/p>
&lt;p>The critical part of this is the item link. You need a method of linking your approvals with the item it corresponds to, and MS does not provide you with a key field. You could create an approval, update a bespoke field on the document meta with the approval id, but I did not want to create unnecessary fields. I ensure that the item link will take me to the document in SharePoint.&lt;/p>
&lt;h2 id="sharepoint-form">SharePoint form&lt;/h2>
&lt;p>First of all, using Power Apps in SharePoint is not the same as a standard Power App. It frightened me when you start the Power App that it dumps you into the Default Instance. Also, these applications are not solution aware. I don&amp;rsquo;t think you can share the forms either. It is certainly not what I am used to. Not sure why this is the case. Let me know if you know any different.&lt;/p>
&lt;p>In the document library, select Power Apps, customise forms.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/06-image-48.png"
loading="lazy"
>&lt;/p>
&lt;p>The form I created has a SharePointIntegration property in it, which is the context that is passed in. The form is linked to that record, in my case a document.&lt;/p>
&lt;p>There are a couple of triggers on the integration which are used to force the display of the first screen when this is triggered. If you don&amp;rsquo;t apply this logic, the screen that was displayed last will return to the user, meaning the user tends to be left in the second, approval details screen.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/06-image-63.png"
loading="lazy"
>&lt;/p>
&lt;p>I have added a couple of fields to the top half of the form, which represents some of the core fields you need. Below that, I have added a gallery.&lt;/p>
&lt;p>Also, to use later, onvisible takes the document that is passed in or the first in the list and sticks it in a local variable&lt;/p>
&lt;p>&lt;img src="https://i2.wp.com/linked365.blog/wp-content/uploads/2020/06/image-51.png?fit=1024%2C174&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>The Gallery Items is a filtered list of the Approvals entity within your CDS environment.&lt;/p>
&lt;p>Here, you can see that I am filtering the Approvals entity by the item link, using the base SharePoint URL and the full path to the file. This isn&amp;rsquo;t the full path, just the bit after your site collection.&lt;/p>
&lt;p>&lt;img src="https://i2.wp.com/linked365.blog/wp-content/uploads/2020/06/image-52.png?fit=1024%2C575&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>In the gallery Item are 3 fields. The first field is a visual indicator of the current status of approval. It is a combination of the Status reason as well as the result.&lt;/p>
&lt;p>&lt;img src="https://i0.wp.com/linked365.blog/wp-content/uploads/2020/06/image-53.png?fit=1024%2C425&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>This label is also coloured to show Approved as green, Pending as black &amp;amp; Rejected as Red.&lt;/p>
&lt;p>&lt;img src="https://i1.wp.com/linked365.blog/wp-content/uploads/2020/06/image-54.png?fit=1024%2C90&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>The next fields is just a display of who created the approval and when.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/06-image-55.png"
loading="lazy"
>&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/06-image-56.png"
loading="lazy"
>&lt;/p>
&lt;p>I added a second screen to my app, so you can see the detail of the approval, navigated to by selection of the approval.&lt;/p>
&lt;h3 id="approval-detail">Approval Detail&lt;/h3>
&lt;p>This form is pretty simple looking, with just a gallery. On visible of the form, two collections are populated, which are filtered lists of Approval Requests and Approval Responses. Working with local collections is a lot easier, particularly if you need to reference them multiple times.&lt;/p>
&lt;p>&lt;img src="https://i0.wp.com/linked365.blog/wp-content/uploads/2020/06/image-59.png?fit=1024%2C84&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>The gallery is connected to the requestList, filtered by the previous step.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/06-image-60.png"
loading="lazy"
>&lt;/p>
&lt;p>The name of the approver is taken from the owner of the request. I added a timestamp as well.&lt;/p>
&lt;p>&lt;img src="https://i1.wp.com/linked365.blog/wp-content/uploads/2020/06/image-58.png?fit=1024%2C188&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>The third field combines several, depending on whether there are any responses to the particular request by the user. Also, the status, even for those that have been classified as rejected, is Active. There does not seem to be any direct link between the request and its response. I am assuming that each request can only have 1 response by 1 person, so filter the already filtered responses by the user who is the approver. Colour coding on the value again gives a more visual representation.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">If&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IsEmpty&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Filter&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">responsesList&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">&amp;#39;&lt;/span>&lt;span class="n">Owning&lt;/span> &lt;span class="n">User&lt;/span>&lt;span class="sc">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="n">Full&lt;/span> &lt;span class="n">Name&lt;/span>&lt;span class="err">&amp;#39;&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">ThisItem&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="n">Owning&lt;/span> &lt;span class="n">User&lt;/span>&lt;span class="sc">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="n">Full&lt;/span> &lt;span class="n">Name&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">If&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="n">Status&lt;/span> &lt;span class="n">Reason&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Active&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;Pending&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="n">Status&lt;/span> &lt;span class="n">Reason&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Text&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">First&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Filter&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">responsesList&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">&amp;#39;&lt;/span>&lt;span class="n">Owning&lt;/span> &lt;span class="n">User&lt;/span>&lt;span class="sc">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="n">Full&lt;/span> &lt;span class="n">Name&lt;/span>&lt;span class="err">&amp;#39;&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">ThisItem&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="n">Owning&lt;/span> &lt;span class="n">User&lt;/span>&lt;span class="sc">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="n">Full&lt;/span> &lt;span class="n">Name&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">).&lt;/span>&lt;span class="n">Response&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>There are a couple of other fields on the grid, firstly the Comments entered if there are any. This comes from the response. I trigger the visibility of this field depending on whether it has a value.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/06-image-61.png"
loading="lazy"
>&lt;/p>
&lt;p>Finally, who re-assigned the request. Here I use a lookup, which allows a traversal to the the users name.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/06-image-62.png"
loading="lazy"
>&lt;/p></description></item><item><title>Launch (Self) - Check App permissions in Power Apps</title><link>https://linked365.blog/2020/05/22/launch-self-check-app-permissions-in-power-apps/</link><pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate><guid>https://linked365.blog/2020/05/22/launch-self-check-app-permissions-in-power-apps/</guid><description>&lt;img src="https://linked365.blog/images/2020/05-image-192.png" alt="Featured image of post Launch (Self) - Check App permissions in Power Apps" />&lt;p>On the Twitterverse yesterday, it was announced that you now have the ability to Launch an application to replace itself.&lt;/p>
&lt;p>&lt;a class="link" href="https://powerapps.microsoft.com/en-us/blog/formulas-launch-to-self-and-self-operator/" target="_blank" rel="noopener"
>https://powerapps.microsoft.com/en-us/blog/formulas-launch-to-self-and-self-operator/&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://twitter.com/iAm_ManCat" target="_blank" rel="noopener"
>@Sancho Harker&lt;/a>, &lt;a class="link" href="https://twitter.com/TheCRMNinja" target="_blank" rel="noopener"
>@EY Kalman&lt;/a>, &lt;a class="link" href="https://twitter.com/ClarissaGillin2" target="_blank" rel="noopener"
>@Clarissa Gillingham&lt;/a> and I had a discussion about the uses of this new feature, and the thing I mentioned was that you should be able to do an app which is a central repository, an app selector. The problem I saw was that you needed to know if a user had access to an app. If they have access, show the app button, if not, don&amp;rsquo;t display it.&lt;/p>
&lt;p>As a user, having a button that gives an error is infuriating.&lt;/p>
&lt;p>I knew there were admin connectors for Power Apps in Power Automate, and you could use the action Get App Role Assignments as Admin from the Power Apps for Admin connector to get a list of people who had access to an app, but would this work? Surely you needed administrative access to use this connector? So, I had to do a proof of concept to make it work.&lt;/p>
&lt;h2 id="the-flow">The Flow&lt;/h2>
&lt;p>Firstly, this is an HTTP Request. The reason being the connectors needed are Admin only, Environment Maker is needed to use the administrator connectors, so this Flow needs to run as an admin user.&lt;/p>
&lt;p>This whole piece could be simpler if I could call this from a Power App directly, but this restriction means we need a two-hop method, two flow runs, though the first step should be covered by the Canvas app licence and the second, this flow, needs to be an administrator with a Per user Plan.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-174.png"
loading="lazy"
>&lt;/p>
&lt;p>The JSON body is simple, just an AppName and Email of the user, both strings.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;object&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;properties&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;AppName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Email&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Next, get your app permissions. This is in a couple of steps, so this Flow can move between environments. First, get a reference to the current environment. Next, get all the Apps in that environment. Finally, filter this list to only the one sent in in the HTTP parameters.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-177.png"
loading="lazy"
>&lt;/p>
&lt;p>There is a property of the returned app which is the Display Name. This is what is used to filter and match on, comping from the HTTP request.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-176.png"
loading="lazy"
>&lt;/p>
&lt;p>Now we can use the Get App Role Assignments as Admin connector to retrieve a list of users who have been given permission to our application.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-178.png"
loading="lazy"
>&lt;/p>
&lt;p>The PowerApp Name I am interested in is for the first one returned, so use an expression like above to prevent a Apply to Each loop.&lt;/p>
&lt;p>As this action could fail, it is the first time a connector is asking for something, configure a run after. Positive is for carrying on, failure we respond to http request.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-179.png"
loading="lazy"
>&lt;/p>
&lt;p>On the success side, filter the list of role assignments, checking for a Tenant type. This looks for a situation where you have shared the application with &amp;ldquo;Everyone&amp;rdquo;.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-180.png"
loading="lazy"
>&lt;/p>
&lt;p>Check to see if the returned array has any items in it.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-181.png"
loading="lazy"
>&lt;/p>
&lt;p>If there is, respond positively.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-182.png"
loading="lazy"
>&lt;/p>
&lt;p>If no tenant access, check for specific user access by first filtering to only all the user principal types.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-183.png"
loading="lazy"
>&lt;/p>
&lt;p>Then check for the users email that was passed in.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-184.png"
loading="lazy"
>&lt;/p>
&lt;p>Finally, check that this array has values in it and respond accordingly.&lt;/p>
&lt;p>&lt;img src="https://i2.wp.com/linked365.blog/wp-content/uploads/2020/05/image-186.png?fit=1024%2C514&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>That is all for the main flow. Now to call this from PowerApps.&lt;/p>
&lt;h2 id="calling-main-flow">Calling Main Flow&lt;/h2>
&lt;p>To call the flow, you have to get Power Apps to call a http request, not directly possible, but if you put a wrapper around your flow like below, it can be done.&lt;/p>
&lt;p>Firstly, the trigger is PowerApps. Next call the primary flow above. The body sent contains 2 fields you ask for from the Power App. Unfortunately, you can not, yet, rename these variables.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-187.png"
loading="lazy"
>&lt;/p>
&lt;p>Parse the response from this so it makes it easier to return the response and respond to Power Apps.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-189.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="app-launcher">App Launcher&lt;/h2>
&lt;p>The App Launcher solution looks like this now.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-191.png"
loading="lazy"
>&lt;/p>
&lt;p>The App Launcher is configured with 3 buttons.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-192.png"
loading="lazy"
>&lt;/p>
&lt;p>Each button is configured to launch one of the other apps. This is the App Id. The default is to launch self, so no need for another parameter. This is all documented well in the &lt;a class="link" href="https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/functions/function-param" target="_blank" rel="noopener"
>Microsoft Launch documentation&lt;/a>.&lt;/p>
&lt;p>&lt;img src="https://i2.wp.com/linked365.blog/wp-content/uploads/2020/05/image-193.png?fit=1024%2C50&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>The visibility of each button is controlled by variables, here for our secret app button.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-194.png"
loading="lazy"
>&lt;/p>
&lt;p>On launch of the application, use the Flow above to populate the visibility variables for each button.&lt;/p>
&lt;p>&lt;img src="https://i1.wp.com/linked365.blog/wp-content/uploads/2020/05/image-195.png?fit=1024%2C71&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;h2 id="sharing-the-apps">Sharing the Apps&lt;/h2>
&lt;p>Now it is all up and running, lets just check the access. For App Launcher, App 1 and App 2 I have shared with the whole tenant, as shown here.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-197.png"
loading="lazy"
>&lt;/p>
&lt;p>The secret app is not shared with everyone though.&lt;/p>
&lt;p>&lt;img src="https://linked365.blog/images/2020/05-image-198.png"
loading="lazy"
>&lt;/p>
&lt;p>Launching the App Launcher as my admin role, you can see the buttons become visible as the code is run.&lt;/p>
&lt;p>&lt;img src="https://i1.wp.com/linked365.blog/wp-content/uploads/2020/05/Launch1.gif?fit=1024%2C725&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>For Veronica, who doesn&amp;rsquo;t have access to the secret app, her experience is the same, but she never sees the third button.&lt;/p>
&lt;p>&lt;img src="https://i0.wp.com/linked365.blog/wp-content/uploads/2020/05/Launch2-1.gif?fit=1024%2C725&amp;amp;ssl=1"
loading="lazy"
>&lt;/p>
&lt;p>This solution is not perfect, it is missing any groups you are a member of, which is a big part of sharing apps, but just lets you know it is possible.&lt;/p></description></item></channel></rss>