Tag: HTTP request

  • Power Apps Choosing Which Connections To Use Using Power Automate

    Power Apps Choosing Which Connections To Use Using Power Automate

    You may have run into an issue when creating Power Apps that needs to submit data to SharePoint, Dataverse, etc. But did not want to give everyone in the app access to these.
    The problem is, Power Apps uses the connections of the user using the app, meaning if the app writes to a SharePoint List, the user will need Read/Write access.
    The same goes for Power Automate if we try to send the data to Power Automate from Power Apps, it still uses the users connection who triggered the Flow.
    How can we get around this? Read below!

    Table of Contents


    Known Issues

    1. If you block the HTTP Request connector via data loss prevention (DLP), child flows are also blocked because child flows are implemented using the HTTP connector. Work is underway to separate DLP enforcement for child flows so that they are treated like other cloud flows.
    2. You must create the parent flow and all child flows directly in the same solution. If you import a flow into a solution, you will get unexpected results.
      Call Child Flows – Power Automate | Microsoft Docs

    Prerequisites

    1. The Flows must be created inside the same Solution, so a Dataverse database must be configured on the Power Platform Environment

    The Scenario

    In this scenario, I will be showing how a user can use Power Apps to create items in a SharePoint List without being a member of the Site. This will allow us to use a specific Service Account to create the data in SharePoint without giving the user in the app any permission at all!

    First we will build the Child Flow, then Parent Flow, and lastly customize the Power App

    Child Flow

    Inside your Solution create a new Cloud Flow.

    1. For our trigger we use a Manual Button, and add the data we are expecting from Power Apps to put inside our SharePoint List
      (In my example I am only bringing in one field for Title)
    2. Next, I add a Create Item action for my SharePoint List, and add the Parameters from the trigger inside the action.
    3. Lastly, I add a ‘Respond to PowerApp or flow’ action, I create an Output called Success, and some details about what was created.
    Child Flow


    Make sure to use the Connection you want users of the App to use for the SharePoint Create item action.

    Save and go back to the Flow dashboard screen (where you see the Details and run history screen).

    There will be a Card on the right side called ‘Run only users’ click Edit

    Run only users

    Under Connections Used, switch ‘Provided by run-only user’ to the connection you want to be used by users of the App
    (They wont have access to this Connection outside this Flow)

    Run only user

    Click Save,

    Now onto the Parent Flow

    Parent Flow

    Go back to the Solution and Create another Cloud Flow.

    1. For our trigger we use the PowerApps button trigger.
    2. As best practice, create Variables for your data that is coming from Power Apps. Don’t forget to name them, as this will be the parameter name in Power Apps,
      Use the ‘Ask in PowerApps‘ dynamic content for your variable values.
    3. Next we use a action called ‘Run a Child Flow’
      (If you do not see this action, your Flow was not created inside a Solution)
      Add the parameters (these were the input parameters from the last Flow that we just created).
    4. Lastly, add ‘Respond to a PowerApp or flow’ action. For this demo I am adding the parameter ‘Success’ this is from the child Flow.


    Click Save.

    Power App

    Now onto the Power App, I am going to create a simple Power App with 1 TextInput for Title, and a Button to Pass the data to Power Automate.
    Here are my controls for reference:

    TextInput_Title
    Button_SendToFlow

    For the Button:
    1. Add the Flow to the button by clicking on the Button,
    2. Clicking Action tab on top of page,
    3. Clicking Power Automate
    4. Select the Flow


    Next add the parameters for the Flow, in my case I am adding the TextInput_Title.Text

    Now, I want to add a Notification that the Item has been added, which will confirm my Flow has Run correctly. Ill be using the ‘Success’ Output parameter from the Flow for this.

    To add this, I put my Flow run inside a Variable inside Power Apps. Ill call my variable Results, and IO add this to the OnSelect property of the Button where my Flow is:

    Now I use the ‘Notify’ function to notify the user of the item being created, I add this after the semicolon. So my function looks like this in the end:


    So my final code looks like this:

    Set(
        Results,
        'PA-Trigger1'.Run(TextInput_Title.Text)
    );
    Notify(
        Results.success,
        NotificationType.Success
    );
    Reset(TextInput_Title)
    

    Now lets test it!

    Conclusion

    I am using a User called ‘Demo User’ I have shared the App with this user. But they are not part of the SharePoint Site


    Here is the SharePoint Site:

    Now Logged in as the Demo User to test this:

    Logged in as Demo User


    Button Clicked >

    Button Pressed, Flow Completed

    Now to check SharePoint >

    Test Success!!

    Done!
    So this was just a basic example on how we can create data inside a Data Source that the user of the App does not need access too.

  • Power Automate – Excel Dynamic Filename

    Power Automate – Excel Dynamic Filename

    I have learnt this method from John Liu. I have pointed so many people, and community users to John’s blog when they run into this Excel connector limitation. I have found multiple people thinking its too complicated, or confusing, because the method works with Graph API to get the File ID.
    So this blog will be a very easy guide to follow and hopefully will be able to get your Flow being able to use a dynamic filename. If you have any questions or problems with this guide or other Power Automate related questions, reach out to me on Twitter.

    New Update – Easy Way 2021

    The following video explains a way easier way to do this, no API, no messy File ID’s. Check it out!

    Things to Know

    To make this even easier, we will be having the Excel file that be stored into a SharePoint Document Library. We can also use the SharePoint HTTP call action to better build our REST call more easily.
    * We will still need the Excel file to have a table defined *

    Getting Started

    First we will create a new SharePoint Document Library for the files, or use an existing document library.

    Next, we want to have one Excel file in the Library to start, so we can make sure this is working. Here is what mine looks like:

    My example, I have a Document Library called ‘Excel Files’ with a Excel file to start with

    Overview of The Flow

    For the Flow, I am using the SharePoint action ‘Send an HTTP request to SharePoint‘. This action uses MS Graph in the background, but makes it a lot easier to construct a API call.
    First we will use a simple call to SharePoint using the ‘Send an HTTP request to SharePoint‘ action to get all the Document Libraries for our site.
    Than use the output of that action to find the Document Library Drive ID.
    This is how we navigate through the SharePoint site, we want to do this until we are in the folder of our Excel File.

    Lets Build that Flow

    First we add ‘Send an HTTP request to SharePoint‘ action

    Uses Graph API in the back-end

    In the SharePoint HTTP action, use the following:
    – Site Address: If your SharePoint site does not show up in the drop down, click use ‘Enter custom value’ and type the homepage of your site
    – Method: GET
    – Uri: _api/v2.0/drives/
    – Headers: accept application/json

    Now trigger the Flow to get the Output of the HTTP request.

    You can also read and get what you need through the Output Body window

    I am using Visual Studio Code to paste the Output into, its free, and easy to use.
    If you have lots of Document Libraries, you may want to use a Find feature and search for the Document Library name. For this demo I will be searching Excel Files.
    We need to look for a specific ‘id’ inside the output

    Copy this id,we can use this value to navigate inside that Document Library in our HTTP request. Our new URI should looks something like:
    _api/v2.0/drives/b!MJxrwkJ2FUGanaxoijg0eZmnU9iP4aJJsidrZJQNlsBAb-8VLzYJRbD9CKmJa0j8

    Now we need to add /root:/ to the end of our URI

    We are almost complete! We now need to specify the path to our file. Here are some examples:

    If file is directly in the Document Library(No Folders) – Just add the filename with the extension
    _api/v2.0/drives/b!MJxrwkJ2FUGanaxoijg0eZmnU9iP4aJJsidrZJQNlsBAb-8VLzYJRbD9CKmJa0j8/root:/MyNewExcelFile.xlsx

    If file is in a folder – Add the folder name, than the Excel file with the extension
    * NOTE: If folder name has spaces, than use %20 instead of a space *
    Folder name = Historical Files
    _api/v2.0/drives/b!MJxrwkJ2FUGanaxoijg0eZmnU9iP4aJJsidrZJQNlsBAb-8VLzYJRbD9CKmJa0j8/root:/Historical%20Files/MyOldExcelFile.xlsx

    Mine is not in a folder so I will be using the first one. Now to make the file dynamic, I will be using a Compose action to store the Filename. So in my HTTP Request I will be using my Compose action with the Filename and extension at the end. My example will look like this:

    The Filename, can come from any Dynamic content, I am just using a Compose for the sake of this Demo

    Now test the Flow to validate the HTTP request is valid. The output should have some references to the file, like the name of the file, size, created date time, and last modified date time. My output looks like this:

    Next, to get the file ID, we use a Compose action with an expression.
    Add a Compose action, inside the Compose we will use the HTTP request Body dynamic content in a expression:

    With the fx logo present on the dynamic content tab. Click the Dynamic content Body. Now we use JSON path to grab the file ID.
    This is done by adding a ?['id'] to the end of the expression. My expression looks like this:

    body(‘Send_an_HTTP_request_to_SharePoint’)?[‘id’]

    body('Send_an_HTTP_request_to_SharePoint')?['id']
    You can copy my expression, just make sure to change the Send_an_HTTP_request_to_SharePoint to your HTTP request action name

    Next add an Excel Get tables action. Use the outputs from the Compose – get file ID for the File

    Now add an Excel List rows present in table action.
    File: Use the outputs from Compose – get file ID action (same as we did for Get Tables)
    Table: Click Enter custom value. Use this expression to get the first table name
    first(body('Get_tables')?['value'])?['id']
    Power Automate has been updated the new expression to get the tables is:
    first(outputs('Get_tables')?['body/value'])['id']
    ** Same as before. Get_tables is my action name **

    first(outputs(‘Get_tables’)?[‘body/value’])[‘id’]

    Success!!

    Now, sometimes the Dynamic content of the Excel columns wont be there now. You can easily grab any column you like using the item() expression. For example I have a column named Tasks so my expression will be
    item()?['Tasks']

    item() can only be used inside an Apply to each

    Conclusion

    Being able to use a Dynamic filename in the Excel connector can be tricky. But I am hoping with this guide, anyone who needs this business requirement can easily follow this, and get it done.

    Again I wanted to give a shout out to John Liu. I originally learnt this method from his blog, which can be found here:
    http://johnliu.net/blog/2019/5/workarounds-needed-to-use-the-excel-connector-in-microsoft-flow

    Thanks for reading. If you have any questions or problems with this guide or other Power Automate related questions, reach out to me on Twitter.