top of page
hero-bg-1.png

Search Content

181 results found with an empty search

  • How to Call an API from Power Apps with Power Automate (A Beginner’s Guide to JSON)

    Key Takeaways • Power Apps cannot call REST APIs directly. You must use Power Automate as a middle layer to call the API and return the response. • The HTTP action in Power Automate is a premium connector, so an API-calling solution requires premium Power Apps or Power Automate licensing. • JSON uses curly brackets { } for records (one row of fields) and square brackets [ ] for tables (a list of records). • In Power Apps, ParseJSON converts a JSON string into an untyped object. You must explicitly cast values with Text(), Value(), Boolean(), or Table() before strict controls like Image will accept them. • For best performance and readability, parse the JSON once and reshape it into a typed collection using ForAll, then bind controls to the collection. • APIs are made dynamic by passing parameters in the URL: the first parameter starts with ?, every parameter after uses &. APIs intimidate most Power Apps makers on first contact, but the underlying concept is simple: an API returns text in a structured format called JSON, and Power Platform gives you tools to fetch that text and turn it into usable data. This guide walks through every step using a free public API, so you can follow along without any setup, accounts, or authentication. In this walkthrough, you will learn how to call a real public API from Power Apps using a Power Automate flow, parse the JSON response with the ParseJSON function in Power Apps, handle different data types (text, numbers, images, and nested arrays), reshape the data into a clean Power Apps collection, and finally make the call dynamic with query parameters and a dropdown. No authentication is required for the example API used in this post, so anyone with a Power Apps premium license can recreate the demo end-to-end. Prefer the video walkthrough? Watch the full tutorial here: https://youtu.be/pwZoUsuLBMQ Why APIs Feel Hard (and What They Actually Are) An API can be as simple as a URL that returns text. Most public APIs return data in JSON, which is plain text wrapped in curly brackets and square brackets. The reason APIs feel hard is that the first time you look at a raw response, you are staring at a wall of unformatted text with no obvious starting point. Once you understand the two simple shapes JSON uses, records and tables, the format becomes readable and usable. If you have ever written a record in Power Apps using curly brackets (for example, { Name: "Shane", Role: "CAIO" }), you have already used the same syntax JSON uses. The only new piece is square brackets, which represent a table of those records. What is the Easiest Free API for Practicing in Power Apps? DummyJSON (https://dummyjson.com) is a free, no-authentication public API that returns realistic test data for products, users, recipes, and more. It is ideal for learning Power Apps and Power Automate API techniques without risk. DummyJSON is the recommended sandbox for this tutorial because every endpoint returns predictable JSON, and no signup or API key is required. The walkthrough below uses the recipes endpoint at https://dummyjson.com/recipes which returns 30 recipes by default, each with a name, image, rating, cuisine, a tags array, and other recipe relevant fields. How do you preview an API response without writing any code? Paste the API URL directly into a web browser. For any GET request, the browser will display the raw JSON response on screen. This is the fastest way to confirm that the API works, see the field names, and understand the response shape before building anything in Power Automate. The same trick works for SharePoint REST and Microsoft Graph endpoints when you are signed in. How do you read API documentation efficiently? Every API has documentation, and every set of documentation answers the same three questions: which URL to call, which method to use (GET or POST), and which parameters are supported. If the documentation is dense or written for a different programming language, paste it into Copilot, ChatGPT, or another AI assistant and ask for a Power Platform-friendly explanation. That is a legitimate and effective shortcut. How Do You Call a REST API from Power Apps? Power Apps cannot call REST APIs directly. You must build a Power Automate flow that uses the HTTP action to call the API, then return the response to Power Apps. Licensing note: the HTTP action in Power Automate is a premium connector. Custom connectors are also premium. Any solution that calls an external API from Power Apps therefore requires premium Power Apps or premium Power Automate licensing for every user who runs the app. Steps to create the flow In your Power App, click the ellipses menu, then Power Automate, then Add flow, then Create new flow, then Create from blank. Name the flow clearly, for example "Video Recipes", so you can find it later. Click New step, search for HTTP, and select the HTTP action (the one labeled Premium). How do you configure the HTTP action? The HTTP action requires three pieces of information: a method, a URI, and (optionally) headers, queries, or a body. For the recipes example, the configuration is straightforward. • Method: GET (used to retrieve data from an API). • URI: https://dummyjson.com/recipes • Headers, Queries, Body: leave empty. The Dummy JSON recipes endpoint requires no additional parameters. Two HTTP methods cover most Power Platform API scenarios: GET retrieves data, and POST sends data. The API documentation always specifies which method to use for each endpoint. How Do You Return JSON from Power Automate to Power Apps? Add a "Respond to a Power App or flow" action at the end of the flow, create a Text output, and set its value to the Body of the HTTP action. The "Respond to a Power App or flow" action is what makes the flow callable from Power Apps and allows the flow to return data. To pass the JSON response back, click "Add an output", choose Text, name the output "myJSON", and set its value to the Body output of the HTTP action. (Click "See more" if the Body field is not visible immediately.) This approach passes the entire raw JSON response back to Power Apps as a single string. JSON parsing could be done inside the flow, but parsing inside Power Apps is the focus of this tutorial because it is more flexible and gives you the full original response to work with. How Do You Call the Flow from Power Apps? Add a button to the Power Apps screen and set its OnSelect property to call the flow and capture the result in a variable. After the flow is saved, Power Apps will automatically register it. Add a new screen, drop a button onto the screen, and set the button OnSelect property to the formula below. The formula calls the flow and stores the JSON response in a variable named varMyJSON. Set(varMyJSON, VideoRecipes.Run().myjson) To inspect the response, add a label, set its Text property to varMyJSON, and set the Overflow property to Scroll. Pressing the button (Alt-click in design mode) will populate the label with the full raw JSON response. How Do You Read JSON? Records vs Tables In JSON, curly brackets { } enclose a record (a single row with named fields), and square brackets [ ] enclose a table (a list of records). Understanding this two-shape model is the most important step in working with API data in Power Apps. The recipes response from Dummy JSON is shaped like this: the outer container is a record with a field called "recipes", and that field holds a table of recipe records. Every recipe record contains its own fields: name, image, rating, cuisine, a tags array, and a lot more. When a JSON field has square brackets immediately after its colon, that field is itself an array. The "tags" field on each recipe is one such nested table. So let's translate what you see above: { } on lines 1 and 14. Those outer wrappers are telling you that this response is a record. "recipes":[ ] on lines 2 and 13. That is saying your main record has a field named recipes and the data inside of it is in an array. {} on lines 3 and 7. That is the first record in the recipes table. {} on lines 8 and 12 is the second record in the recipes table. "name" and "image" are two text fields in that image "tags" is an array in that record. It is a single column table, the column name is Value, it contains 3 records "Italian", "Vegetarian", "Main Course". How Do You Use ParseJSON in Power Apps? ParseJSON is a Power Apps function that converts a JSON string into an untyped object. To use the result in a control, navigate to the field you want and wrap it in a type function such as Table(), Text(), Value(), or Boolean(). Add a Gallery to the screen. The Gallery requires a table for its Items property. Because the recipe table lives inside the JSON response, the Items formula must parse the JSON, navigate to the recipes field, and explicitly cast the result as a table: Table(ParseJSON(varMyJSON).recipes) Each part of the formula has a specific purpose. ParseJSON(varMyJSON) converts the raw JSON string into a navigable untyped object. The .recipes drills into the field that holds the recipe list. The Table() wrapper tells Power Apps the result should be treated as a table so the Gallery accepts it. After applying the formula, the Gallery rows render but the field dropdown shows generic "value" entries. The reason is that ParseJSON returns untyped data — Power Apps does not yet know whether each field is text, a number, or something else. The next section covers how to apply types correctly. How Do You Handle Different JSON Data Types? Wrap each ThisItem.Value reference in the appropriate type function: Text() for strings, Value() for numbers, and Table() with Concat() for nested arrays. Image controls require Text() explicitly. Plain text fields In a Gallery template, a label can display a JSON text field directly. The recommended formula uses Text() to make the type explicit and avoid runtime surprises: Text(ThisItem.Value.name) JSON field names are case-sensitive. In the Dummy JSON recipes response, the field is "name" with a lowercase n. Writing "Name" with a capital N will return blank. Numbers Numbers in JSON are not surrounded by double quotes. That is how you can tell them apart from text fields. The recipe rating field, for example, is returned as 4.6 with no quotes. To use the value in calculations or numeric controls, wrap it in the Value function: Value(ThisItem.Value.rating) Why does the Image control fail with untyped data? The Image control in Power Apps does not infer types from untyped data the way a Label does. Setting the Image property directly to ThisItem.Value.image returns an error because the control cannot interpret an untyped object as a URL. The fix is to wrap the reference in Text(), which forces the value into a string: Text(ThisItem.Value.image) Nested arrays such as tags When a JSON field contains square brackets, like the recipe tags field, which holds an array of strings like ["Pizza", "Italian"] then the field is itself a table. To display the array as a comma-separated string in a label, wrap the reference in Table() and pass it through Concat(): Concat(Table(ThisItem.Value.tags), Value, "; ") The same pattern works for any JSON array: ingredients, instructions, or any other field that returns multiple values per record. How Do You Convert API Data into a Reusable Power Apps Collection? Use ClearCollect with ForAll to walk the parsed table once, casting each field to its correct type, and store the result as a typed collection. Bind controls to the collection instead of the raw ParseJSON result. Repeating ParseJSON and ThisItem.Value.fieldname formulas across every control adds maintenance overhead and makes the app harder to read. The recommended pattern is to parse the JSON once when the data arrives, build a clean collection, and then reference that collection everywhere else. Add a button and set its OnSelect property to the formula below. The formula calls ForAll on the parsed table, aliases each row as "JUNK", and produces a record with three properly typed fields per row. ClearCollect( colRecipes, ForAll( Table(ParseJSON(varJSON).recipes) As JUNK, { Name: JUNK.Value.name, Rating: JUNK.Value.rating, Image: JUNK.Value.image } ) ); The collection colRecipes now behaves like any other Power Apps collection. Setting a Gallery Items property to colRecipes allows fields to be referenced as ThisItem.Name, ThisItem.Image, and ThisItem.Rating, with no further parsing required. How Do You Make an API Call Dynamic with Query Parameters? Append parameters to the API URL using one ? for the first parameter and & for every subsequent parameter. To drive parameters from Power Apps, add inputs to the flow and reference them in the URI using triggerBody() expressions. Most public APIs support query parameters that filter, sort, or paginate the response. Dummy JSON supports five common parameters that appear in many APIs: limit: maximum number of records to return. skip: number of records to skip from the start, used for paging. select: comma-separated list of fields to include in the response. sortBy and order: field name and direction (asc or desc) for sorting. q: keyword search across the dataset. How are URL parameters joined together? The first parameter in a URL is preceded by a single question mark. Every parameter after the first is joined with an ampersand. A URL with three parameters looks like the example below. https://dummyjson.com/recipes?limit=10&skip=10&select=name,image Common mistake: pasting a second example URL directly into the URI field, which produces two question marks. Only one question mark is allowed per URL. After that, every additional parameter must use an ampersand. How do you pass a parameter from Power Apps into the flow? To accept input from Power Apps, edit the flow, click the trigger ("PowerApps (V2)" or "Respond to a PowerApp" depending on configuration), and add a Text input named "MyTag". Inside the HTTP action, reference the input in the URI using a triggerBody() expression so the value is substituted at runtime. https://dummyjson.com/recipes/tag/@{triggerBody()['text']}?limit=10&select=name,image After saving the flow, the Power Apps formula must pass the new value when calling the flow. The Run function accepts inputs in the order they were declared. Set(varMyJSON, VideoRecipes.Run("Italian").myjson) How do you drive the API call from a dropdown? To let users pick a value instead of typing one, use the API itself to populate a Power Apps Dropdown. Dummy JSON exposes an endpoint that returns the full list of available recipe tags as a JSON array. Open that URL in a browser, copy the array including the square brackets, and paste it directly into the Items property of a Dropdown control. Power Apps interprets a square-bracketed list as a one-column table named Value automatically. Then update the button OnSelect to pass the dropdown selection to the flow: Set(varMyJSON, VideoRecipes.Run(Dropdown1.SelectedText.Value).myjson) The result is a fully dynamic, user-driven API call: the user picks a tag, the flow builds the URL, and the gallery refreshes with matching recipes. Common Power Apps API Mistakes to Avoid • Case sensitivity: JSON field names must match exactly. The field "name" is not the same as "Name". • Untyped data in strict controls: always wrap values with Text(), Value(), Boolean(), or Table() before binding to controls that require a known type. • Image controls: always wrap the source URL in Text(). The Image control will not infer the type from untyped data. • Nested arrays: wrap with Table() and use Concat() to display them as text in a label. • Premium licensing: the HTTP connector requires premium licensing for every user of the app. Plan licensing before building. • Question marks in URLs: one ? per URL, maximum. Every parameter after the first must use &. Frequently Asked Questions Can Power Apps call a REST API directly? No. Power Apps cannot call external REST APIs directly. The supported pattern is to build a Power Automate flow that uses the HTTP action to call the API, then return the response to Power Apps using the "Respond to a Power App or flow" action. Custom connectors are an alternative, but they also require premium licensing. Do you need a premium license to call an API from Power Apps? Yes. The HTTP action in Power Automate and custom connectors are both premium connectors. Every user who runs an app that calls an external API requires a premium Power Apps or premium Power Automate license. What does the ParseJSON function return in Power Apps? ParseJSON returns an untyped object that can be navigated using dot notation. The function does not assign data types to the values it returns, so each value must be wrapped in a type function like; Text(), Value(), Boolean(), DateValue(), or Table() before being used in a control or formula that requires a specific type. Why does my Image control show an error when I bind it to ParseJSON data? The Image control does not infer types from untyped data the way a Label does. Wrapping the reference in Text() for example Text(ThisItem.Value.image) forces the value to a string and resolves the error. Conclusion Calling an API from Power Apps comes down to a five-step pattern: build a Power Automate flow with the HTTP action, return the JSON to Power Apps, parse the JSON with ParseJSON, cast the values with type functions, and reshape the result into a typed collection for clean reuse. Once the pattern is in place, the same approach works for almost every public or internal REST API. The next two topics worth learning are authentication (API keys, OAuth, and bearer tokens) and writing data back to APIs using POST requests. Both build directly on the foundation in this tutorial. Need a Hand? If you want help building solutions like this or you want to take your Power Platform skills to the next level, the team at PowerApps911 has your back. We offer everything from quick 30-minute consulting sessions to long-term partnerships building enterprise apps. Click the Contact button on this page to start a conversation.

  • How to Build Your Own Custom Skills in Copilot Cowork (Step-by-Step Guide) 

    Do you ever feel like you keep typing the same long instructions into Copilot over and over? Same prompt, same format, same picky details every single week? Yeah, me too. That is exactly the problem custom skills in M365 Copilot Cowork are built to solve. In this walkthrough, you will learn what custom skills are, see a real one I use every single week, and then I will show you two different ways to build your own. One is easy (Cowork builds it for you) and the slightly more manual way (using ChatGPT to help you write the skill file). By the end, you will have everything you need to take the repeatable stuff in your day and turn it into a one-click skill. BONUS: I hate the way the manual section turned out, so I also offer you my actual Skill so you can steal it to get going without too much hassle. You are welcome. 😋 And no, this is not a developer thing. My project managers and admin team are using these every day. If they can do it, you absolutely can too. It is just good ole fashion text. If you would rather watch the full walkthrough, check out the video here: Stop Repeating Yourself - Build Custom Skills in Copilot Cowork What Is a Custom Skill in Copilot Cowork? Copilot Cowork ships with a bunch of built-in skills; working with Office documents, your calendar, email, Teams messages, deep research, all of that. Where as a custom skill is just a saved set of instructions you can trigger anytime with a forward slash. Here is the key idea: instead of typing 100+ lines of instructions every time you want Cowork to do a complex job, you write those instructions one time, save them as a skill, and just call the skill with a quick command. Cowork already knows what to do. A Real Example: Turning YouTube Videos Into Blog Posts Every week I publish a video, and I also want to publish it as a blog post. Not AI-garbage blog posts that all sound the same, I want it to sound like me, based on my actual words from the video. (Hint, this is literally what I am doing right now 🤣) So I built a custom skill called "YouTube to Blog Post." My workflow is dead simple now: Grab the transcript from my video Drop it into Cowork as an upload Type a forward slash, pick the YouTube to Blog Post skill Say something like "Make me a blog post, please" That is it. Cowork pulls in my custom instructions. Tone, structure, SEO rules, image placeholders, where to put the YouTube link and then spits out a draft. I still go back through and Shane-ify it (add my goofiness, dumb a few things down, remove the dumb emm dashes), but the bones are mine because the words are mine. Below is the screenshot that made the base of this blog post, that is the whole thing. Here is why this matters. That skill file is around 170 lines of careful instructions. There is no way I am pasting that into chat every Monday. Once. I write it once. Then I use it forever. The Easy Way: Let Cowork Build the Skill for You This is hands-down the friendliest way to build a skill, and it is the path I would point any non-technical user to first. The trick is to start by solving the actual problem in plain language, get it working, and then ask Cowork to package it up as a skill. Step 1: Solve the Problem in a Normal Chat My project managers get a flood of emails from customers with bugs, feature requests, casual stuff andI want to help them triage. So I just ask Cowork plainly: "Help me find app bugs. Look through my inbox for the last week for emails from chewy@powerapps911.com. Review all the emails for any that are bugs, changes, enhancements, or otherwise involve work on the existing app. Capture that information and save it to an Excel spreadsheet." Notice I gave a tiny bit of context up front ("help me find app bugs") before the actual ask. AI does noticeably better when you set the stage like that. Cowork then searches my inbox, reads each email, decides which ones are actually about app work, and drops the results into an Excel file with columns like Date Received, Subject, Type, App Area, Description, and Source. If those columns are not exactly what you wanted, just tell it. "Hey, I want a column for priority too." Done. Step 2: Ask Cowork to Turn It Into a Skill Now the magic. Once the workflow does what you want, just tell Cowork: "That is perfect. Can you help me make this into a skill I can use anytime? I want to trigger the skill and then have it ask me for what email address to search for and what to name the Excel file." Cowork has a skill for making skills (yes, that is a weird sentence). It builds the SKILL.md file, validates it, and tells you the name. For me it called it "app issue tracker." Here is the key idea: you did not have to know any syntax. You did not have to write a single line of front matter. You solved a real problem first, then turned it into a skill you can summon at anytime. A Quick Note About Syncing the Skill to OneDrive Cowork will tell you the skill is available within 35 seconds. It says that every single time. In my experience, sometimes it takes 35 seconds, sometimes it takes longer, and occasionally you need to nudge it. If your skill is not showing up in the slash menu after a couple of minutes, just say: "I'm not seeing the skill in my folder. Can you try syncing it again?" That second push usually does the trick. This product is still in preview, so expect a little quirkiness. The Manual Way: Building a Skill With ChatGPT If you want to build skills outside of Cowork, say with ChatGPT, Gemini, or another LLM, you absolutely can. It is a little more hands-on, but it is good to understand how the pieces fit together. And FWIW in the video, this went really poorly. ChatGPT wasn't in the right mood I guess, but even if you never do it this way, understanding how the pieces works will help. So, here is the scenario. I get a bunch of weekly AI newsletter emails. I want one skill that pulls them all together, deduplicates the noise, generates an executive summary in Word, builds a PowerPoint for my team, and pings me on Teams when it is done. Step 1: Describe the Skill in ChatGPT I told ChatGPT exactly what I wanted, including my preferences (Microsoft news first, then Google, Anthropic, OpenAI, then everything else). ChatGPT generated a complete SKILL.md file ready to drop into OneDrive. Step 2: Save the File to the Right Spot This is where it gets a little fussy, so pay attention. The file goes into your OneDrive in this exact path: Documents → Cowork → skills → [your-skill-name] If you have never made a skill before, you will need to create the skills folder the first time. Then make a folder for your specific skill, and here is one of the gotchas, the folder name and the skill name inside the file have to match exactly. Another gotcha? the folder needs to be skills all lowercase. I don't make the rules, I just share them. Step 3: Watch Out for the Filename The filename must be SKILL.md — that is uppercase SKILL and lower case md. Microsoft has not documented this anywhere I can find, but trust me, the capitalization seems to matter at this point. Step 4: Make Sure the Front Matter Is There Every SKILL.md file needs a front matter block at the top. It looks like this: --- name: weekly-ai-news-briefing description: Reviews weekly AI newsletter emails and produces a summary doc, deck, and Teams notification. --- Now your instruction start... If ChatGPT forgets the front matter, and it might, just paste it in yourself. The name has to match your folder name, and skill names must be all lowercase letters. No spaces, no capitals, no special characters. Step 5: Wait for the Skill to Show Up Same 35-second sync rule applies. Open Cowork, start a new session, type a forward slash, click Skills, and scroll to the bottom. Custom skills tend to show up at the bottom of the list in alphabetical order. Triggering and Editing Your Skill Once your skill is live, using it is the easy part. Type a forward slash, click Skills, click your skill name, hit enter. Cowork picks up your saved instructions and runs. If your skill asks for inputs (like an email address or a file name), Cowork will prompt you. We didn't build any of that, it just works. The exact UI it uses changes a bit each time. Sometimes it pops up a form, sometimes it asks one question at a time. Do not let that throw you. Just answer what it asks. And here is the part I love: skills are just plain text. If you do not like something about how your skill works, open up the SKILL.md file and edit it. Want to exclude casual social emails? Delete or change that line. Want a summary in Word instead of Excel? Rewrite the output instructions. There is nothing magic going on under the hood. It is your skill, written in your words. Gotchas to Remember Filename is SKILL.md Folder for skills need to be all lower case Skill names must be all lowercase letters. Folder name and the name inside the front matter have to match exactly. Front matter is required (the block between the three-dash lines at the top). Sync to OneDrive is supposed to take 35 seconds. Sometimes it takes longer or needs help. Push it again if needed. Cowork is still in preview. Things change. Be patient with the rough edges. Download my skill Because all of that was confusing, here is my complete example skill. --- name: app-issue-tracker description: | Searches the inbox for emails from a specific sender over the past 7 days, reviews each email, and captures any reported bugs, changes, enhancements, or other work involving an existing app into an Excel spreadsheet. Use when the user says "find app bugs", "track app issues from emails", "capture bug reports from [person]", "make a bug list from my inbox", "log app feedback to Excel", or any similar request that asks to turn email feedback about an app into a spreadsheet. cowork: category: productivity icon: TaskListLtr --- # App Issue Tracker Turns app-related email feedback from a single sender into a structured Excel log of bugs, enhancements, and changes. ## Step 1 — Gather inputs Before doing anything else, ask the user for both inputs in a single `AskUserQuestion` call: 1. **Sender email address** — the email address whose inbox messages should be reviewed. 2. **Excel filename** — what to name the output file (without the `.xlsx` extension; you will add it). Do not assume defaults. If the user has already provided one of these in their request, only ask for the missing one. ## Step 2 — Pull the emails - Resolve "the past week" as the 7 days ending at the user's current local time. - Use `SearchM365` with `from_user` set to the supplied email address, `sources: ["email"]`, and `after`/`before` set to the 7-day window. This is faster and more targeted than paging through `ListMessages`. - If `SearchM365` returns nothing, fall back to `ListMessages` with the same date window and filter for the sender client-side. ## Step 3 — Classify each email Read the body of every returned email. For each one, decide whether it involves work on an existing app. Include it if it reports any of: - **Bug** — something is broken or behaving incorrectly - **Enhancement** — a styling, UX, or feature improvement to an existing app - **Change** — a requested modification to existing app behavior - **Performance issue** — slowness, crashes, or responsiveness problems A single email may contain multiple distinct items (e.g. a bulleted list of issues). Capture each item as its own row. **Exclude:** - Casual/social emails (lunch, chitchat, thanks) - Proposals for entirely new apps or future projects that are not work on the existing app - Status updates with no actionable issue If you exclude an email, briefly mention it to the user in the final summary so they can confirm. ## Step 4 — Build the spreadsheet Create an `.xlsx` file with one sheet named "App Issues" and these columns: | Date Received | Email Subject | Type | App / Area | Description | Source Email From | Formatting: - Header row: bold white Arial 11 on dark blue (`305496`) fill, centered, wrapped - Body: Arial 11, top-aligned, wrapped - Column widths roughly: 16, 32, 20, 28, 60, 38 - Freeze the header row and turn on auto-filter - Increase row heights enough to show wrapped text Use the `xlsx` skill's create-mode Task pattern to generate, save to `output/{user-supplied-filename}.xlsx`, and verify the file exists with `Glob output/**/*.xlsx`. ## Step 5 — Report back Summarize for the user: - Number of emails found from that sender - Number captured as app issues vs. excluded (with one-line reason for each exclusion) - A short table preview of the rows - Confirm the file is saved Tell the user the file is ready — do not expose folder paths or technical details. ## Notes - If the sender returned zero emails in the window, say so plainly and offer to widen the window or check the address spelling. - Keep types consistent across runs: `Bug`, `Enhancement`, `Change`, `Bug / Performance`. Combine with `/` only when an item legitimately spans two categories. Copy all of that and save it as SKILL.md (sorry I couldn't make it a straight download) Go to your OneDrive > Documents > Cowork > skills If skills isn't there then create that empty folder. All lowercase In the skills folder create a new folder named app-issue-tracker all lower case Put your new SKILL.md file in that folder. Wait a minute then refresh your Cowork window, start a new chat and type / you should see your skill. 🤩 I take zero responsibility for anything that happens with this, so make sure like with everything you read on the internet, you read the file before you create it. It doesn't hurt anything but you should confirm. Be Creative, That Is the Real Skill Here is the thing I want you to walk away with. The demos in this guide are about app bugs and AI newsletters, but those are not your problems. Your problems are different. The pieces I just showed you; searching your inbox, reading and classifying messages, writing to Excel, generating a Word doc, posting to Teams, etc. Those are the building blocks. The folks getting the most out of AI right now are the ones being creative with the building blocks. Look at your week. What do you do over and over? What sequence of steps would you love to skip? That is your skill. Wrapping Up You now know what custom skills are, you have seen a real one in action, and you have two ways to build your own. The in-Cowork builder is the friendliest path. Solve the problem first, then turn it into a skill. The manual ChatGPT route is there when you want more control or when you want to understand exactly what is happening. (Or just steal my work) Either way, the win is the same: stop typing the same long instructions every time. Save them once. Use them forever. Need a Hand? If you are trying to make sense of how Copilot, Cowork, Copilot Studio, vibe coding, and the rest of the Microsoft AI ecosystem fit together for your team, that is exactly the kind of thing we help with every day. Reach out to the team at PowerApps911 and let's build something awesome together. Just click the Contact Us button and a human, not AI, will help you out.

  • Install the Power Apps Canvas Apps MCP for GitHub Copilot

    Are you looking to get started with this awesome new Power Apps MCP Server for Canvas apps but don’t really have clue one how to install all of this? If yes then below is my instructions written for those of us who are not ninjas when it comes to all of this VS Code stuff. You will get step by step on how to install everything, VS Code, all of the random weird things, and then how to test it all worked. I have done this process like a dozen times to try to get this down to the easy instructions you have come to expect. Now, keep in mind that the more weird things you (or more likely IT) has done to your PC, the more likely your journey will vary. Every machine I have done the process has been slightly different but, at the end of the day, you need all of these pieces. Be a trooper, you will get through this. Also, remember while the Power Apps Canvas MCP is free, you need a GitHub Copilot license to use it in this scenario. You could also use the MCP server with Claude Code or Codex or a dozen other services but one way or another you have to have an LLM coding companion to utilize this. Finally, these instructions are focused on what you need to get in place to use the MCP server, on Windows via VS Code and GitHub Copilot. There are other ways to use this MCP. This isn't meant to be the be a be all, end all for developing with VS Code and AI, just the pieces you need to get rolling to use it with your Canvas Apps. Enjoy! PS - The video walkthrough of these instructions are here, probably a lot easier to use Install and Configure Power Apps MCP   Install VS Code via Download Go to this site and download Visual Studio Code (VS Code). Download Visual Studio Code - Mac, Linux, Windows For most people the defaults are going to work well. So do the good ole Next, Next, Finish method. Open VS Code from the Start menu if it isn't already open. Click the Use AI Features Click Continue with GitHub to authenticate Sign in or create an account (reminder you are going to need a paid account to do this). Click the button to Authorize VS Code. Now you can click on the head in the bottom right corner to confirm you have GitHub Copilot running. Now close VS Code. We will be back later. Install NodeJS Go to this website Node.js — Download Node.js® Download the Windows Installer MSI and run it. Same deal, that Next, Next, Finish is what I did. There are a lot of questions and some optional stuff but, I didn't need it for this to work so I didn't install them. Install Git for Windows Go to this website Git for Windows Click the big Download button and then run it. Once again use Next, Next, Finish. And honestly? I have no clue what most of those settings are, but the defaults worked so I stuck with them. 😊 Feel free to adjust anything, it is your computer after all. Install Dot NET 10 SDK Go to this website Download .NET 10.0 (Linux, macOS, and Windows) | .NET Download the Windows SDK and run it. Click Install. There is nothing to choose but it is a slow install. Install PowerShell 7 Go to this website https://aka.ms/PSWindows Click the Get PowerShell 7 button. Click Install PowerShell on Windows Download the MSI Package and run it. You guessed it, click Next, Next, Finish Install GitHub Copilot CLI Open VS Code From the toolbar click Terminal > New Terminal At the prompt Type: Copilot Install GitHub Copilot CLI when prompted Choose Yes when asked if you trust the folder (assuming you do) Type /login at the prompt. Choose your account type. Press the Enter key, this opens a browser, and now walk through the authorization steps. Switch back to VS Code. Finally, install the Power Apps MCP Still in the Terminal type: /plugin marketplace add microsoft/power-platform-skills After you see Added Successfully type: /plugin install canvas-apps@power-platform-skills Type Exit to close Copilot. Type Copilot to open it back up. Test your Hard work Open a browser to make.PowerApps.com and create a blank canvas app. Save it. Settings > Enable Coauthoring. This will automatically save and refresh the app. Refresh the browser again, this makes Coauthoring happier. Copy the URL for your App. Return to VS Code. Still in Copilot, in the Terminal, type Configure Canvas MCP Choose Configure Globally when it asks. Paste your canvas app url when asked. Type Exit to close Copilot Type Copilot to open it back up   Type Create a Green welcome screen with a blue button After a while if you get a green screen in Power Apps canvas app with a blue button then you have SUCCESS!   Microsoft’s Documentation If you want their official info on installing and such it is here: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/create-canvas-external-tools Also, their GitHub repository for this MCP server is here: https://github.com/microsoft/power-platform-skills/tree/main/plugins/canvas-apps Nothing you need but sometimes the official documentation is good to check out also. Next Steps Now you are ready to start playing with GitHub Copilot. You can use it to create apps, edit apps, audit apps, and probably more. And while I think creating apps, especially with data sources (even SharePoint) is interesting the real value is review. Having the agent look for bugs and make recommendations in your existing apps. Having a second set of eyes just can't be overappreciated. If you want to see the Power Apps Canvas MCP server in action for creating and auditing apps check out this video: Build Canvas Apps in VS Code with AI (NEW Power Apps Tool) Or if you are looking for help with what you should and shouldn't be doing with AI and Power Apps then we can help. Just hit the Contact button and let us know. We are happy to help with anything from a quick call to taking on your full project.

  • How to Build Canvas Apps Faster with VS Code and the Power Platform MCP Server

    What if you could describe the canvas app you want in plain English, hit enter, and have a real, editable Power App waiting for you seconds later? Not a mock-up. Not some locked-down, AI-only creation. An honest-to-goodness canvas app you can open in Power Apps Studio and tweak with every skill you already have. That's exactly what the new Power Platform MCP server for VS Code or Claude Code unlocks and in this post, you're going to learn how to use it two ways: to  generate a new canvas app from a prompt , and to  run an AI-powered code review on an app you've already built . This isn't vibe coding. This isn't a new type of Power Apps app to learn. It's a faster front door into the canvas apps you already know and love. If you'd rather watch the full walkthrough, check out the video here: Build Canvas Apps in VS Code with AI (NEW Power Apps Tool) Why This Is Different (and Why You Should Care) Before we dive in, here's the key idea: the MCP server doesn't replace canvas apps. It  coauthors  them with you. Whatever the AI generates is a standard canvas app with real controls, real formulas, and real YAML under the hood. You can open it in Power Apps Studio right now and edit it the exactly like you always have. Nothing locks you in. That means this is a tool for two groups of people: Canvas app builders  who want a huge head start on the boring scaffolding (screens, galleries, navigation, filter formulas, forms) Canvas app builders  who want a second set of eyes reviewing their existing apps for bugs and improvements Both are genuinely useful. Let's walk through each. What You'll Need Before You Start A quick heads-up: this post assumes you already have VS Code, GitHub Copilot, and the Power Platform MCP server installed and configured. If you're starting from a brand-new machine, don't worry, a dedicated setup walkthrough is coming that holds your hand through every prerequisite. For today, you'll want: VS Code  (free) GitHub Copilot  (this post uses it, but Claude Code and other AI coding tools work too) The  Power Platform MCP server  configured in VS Code A Power Apps environment where you can create apps and connect to data Part 1: Generating a Canvas App from Scratch Here's where things get interesting. You don't start in VS Code. You actually start in Power Apps. The MCP server needs an app to co-author  with , so step one is creating an empty shell. Step 1: Create a Blank Canvas App Head to Power Apps in your browser, click  Create , and choose  Blank app → Blank canvas app . Tablet or phone? It doesn't really matter. I went with tablet for this demo. Give the app a name (I went with the highly creative "VS Code Video Demo") and save it. Saving first isn't optional; the MCP server needs something to point at. Step 2: Enable Co-Authoring (Don't Skip This!) This is the step a lot of people miss, and it'll cause you pain later if you skip it. In the canvas app, go to  Settings → Updates → Co-authoring  and flip it on. Save, let the app reload, and then pop back into Settings to confirm co-authoring is actually enabled. Here's why this matters: the MCP server pushes its changes into the app live, while you might also have it open in Studio. Co-authoring is what makes that two-way street work. Step 3: Add Your Data Source The AI won't add data connections for you. That's on you. Click  Data → Add data , search for SharePoint (or Dataverse, or whatever you're working with), and connect to your list. For this walkthrough, I connected to a SharePoint list called  Employees . Step 4: Save a Version You Can Roll Back To Before you unleash the AI, save with version notes, something like "Ready to rock." It's not strictly required, but it gives you a clean restore point if the AI goes off the rails and you want to start over. Then close the app in the browser. Yeah, actually close it. A fresh reload tends to avoid weird co-authoring hiccups. And just a good reminder, if at any point things don't look quite right, a quick refresh can help. Step 5: Point VS Code at Your App Grab the app's URL from your browser and head back to VS Code. Open the terminal, start Copilot (copilot), and type: configure canvas app You can also hit / to browse available commands if you can't remember it, just look for the canvas app configuration skill. Copilot will check your .NET version (you'll need it installed), then ask for the URL. Paste in the full app URL and hit enter.  Here's the slick part:  the MCP server parses that URL to figure out the app ID and environment ID for you. No more digging around in settings panels for GUIDs. Kudos to the product team for that one. You might see an error the first time, no big deal, that's usually just because the configuration file doesn't exist yet. It creates it for you. When it prompts you to restart Copilot, type exit, then copilot again to reload. Step 6: Pick Your Model (and Be Smart About It) Before you prompt, check the bottom-right of VS Code to see which model is active. Type model to switch. You'll see options like GPT-5.4, Sonnet 4.6, and Opus 4.7. Here's my 2 cents:  Opus 4.7 is phenomenal, but it's expensive.  In my test, a single "build me an app" prompt burned over 30% of my monthly capacity. For most work, Sonnet 4.6 is the sweet spot. It is fast, smart, and doesn't destroy your credit budget. Step 7: Write a Good Prompt Now the fun part. Type what you want, but give it some structure. Here's the prompt I used: Create a canvas app for employee management. This app has a SharePoint list named Employees. Use that, build the app to display that data, provide search and filtering, and a way to create and edit the employee data. The app should have a welcome screen, a browse employee screen, and an edit/create employee screen. For the color palette, our primary color is #752874. Use complimentary colors. For design layout, use a very modern feel. A few things to notice: I named the exact data source (Employees) I specified the screens I wanted I gave it a color palette I told it to be modern but didn't micromanage the design Here's the key idea:  don't try to cram everything into one prompt. This is a starting point, not a final deliverable. The more you pile in, the longer it takes and the more confused it gets. Get 80% of the way there, then iterate, either in Studio or by chatting with the agent for follow-ups. Step 8: Approve the Tools, Authenticate, Wait Partway through, Copilot will ask if it can use the MCP server's tools. Say  yes and approve all tools from the server . That lets it do the canvas authoring without prompting you over and over. You'll also need to authenticate to the MCP server. Just close the auth window(s) when they're done. Don't panic when you see red text in the chat. It's usually the agent looking for a file that doesn't exist yet, then creating it. Red doesn't automatically mean broken. Leave the agent be and let it finish its plan. Step 9: Witness the Magic When it finishes, you'll see "Validation passed." That's not just a checkmark;  that's when the app gets pushed to the server.  Flip back to your browser tab and... the app is already there. No refresh, no republish. Co-authoring wrote it live. Hit play. Click "Browse Employees." Your data is loaded, your gallery is populated, and there are your team members looking back at you. Common Gotchas (and How to Fix Them) This is where things get real. The AI does great work, but it's not perfect... especially in these early weeks. Here are the two mistakes I've seen most often, and how to fix them. Gotcha #1: "I Click the Gallery Row and Nothing Happens" If clicks don't navigate, it's almost always because the  label on top of the gallery row is swallowing the click.  The label's OnSelect is set to false instead of Select(Parent). Two ways to fix it: Click the label, change OnSelect to Select(Parent) manually Or tell the agent: "All the labels in the gallery have OnSelect set to false. Please change them to Select(Parent)." Gotcha #2: Text Is Invisible or Clipped Sometimes labels render black-on-black (so your data looks "missing") or they're too short and you get tiny scroll bars on every row. Both are easy fixes: Flip the font color to white (or whatever contrasts with your background) Enable Auto Height, or drag the label taller Or again just tell the agent: "All of the gallery labels are clipping and need to be taller. Set the font color to white and set the labels to use Auto Height" A pro tip:  don't ask for three fixes at once if you want tight control. It usually handles it fine, but you'll get cleaner results one change at a time. Gotcha #3: Changes Don't Appear in the Browser Sometimes the AI makes a change, but clicking in the browser still doesn't work. This is almost always a  coauthoring sync hiccup , not a code problem. Two things to do: Save in the browser.  The agent writes the change, but co-authoring waits for an auto-save or your manual save before it commits. Refresh the browser tab. After that, click again and it should work. Part 2: Using AI to Review an App You've Already Built Here's where this tool gets genuinely surprising. You can point the MCP server at an  existing  canvas app and ask it to do a code review. I grabbed a random app I built months ago for a deep linking video. The app was totally untouched, no gotchas planted. Just honest old code. I figured it'd be a clean demo. Yep. Turns out past-me made some mistakes I didn't know about. Shocked? Me too. 🤣 Step 1: Restore or Open the App Pick an existing app. In my case, I opened the versions panel and restored an older version to make sure I was working with the original. Then I opened it to edit. Step 2: Enable CoAuthoring If the app is older, it probably doesn't have co-authoring turned on yet. Go to  Settings → Updates → Co-authoring  and enable it, just like with a new app. Step 3: Point VS Code at This App Copy the new app's URL, head back to VS Code, and run configure canvas app again with the new URL. Exit and relaunch Copilot so it picks up the new configuration. Step 4: Ask for a Review Here's the prompt I used: Connect to the server to get the current app and then do a review looking for bugs and places that I could easily improve the app. Only list your thoughts. Do not change the app this time. That last line matters: "do not change the app"  keeps it in advisor mode so you can read the review before committing to anything. Step 5: Read Your Humbling Results What it found in my app: Delete didn't actually delete.  I forgot to wire up the Remove() call. The trash can was just a pretty icon. A  gallery parameter  could be wrapped better for performance A  variable wasn't being saved  after the form's OnSuccess event A few other minor improvements This is why this matters:  even if you never use this tool to  build  an app, using it as a second set of eyes on existing apps is a massive win. It's like having a senior dev review your code every time you ship. Step 6: Let It Fix What You Choose Once you've read the review, you can cherry-pick fixes. I asked it to handle the delete bug: Will you fix bug 1 for me? Add the logic for delete. Seconds later, it wrote the Remove() call for my trash can icon. Flipped back to the browser, clicked delete on an employee, and... gone. That's pretty slick. What You Actually Built Today In one session, you learned how to: Set up a canvas app shell for MCP co-authoring Generate a full employee management app from a single prompt Spot and fix the common quirks (gallery clicks, label sizing, sync issues) Run an AI code review on an app you've already shipped Let the AI apply fixes while you stay in control That's a lot. And the best part? Every app the MCP server touches is a  normal canvas app . If the AI gets it 80% of the way, your existing canvas skills get it the rest of the way. No lock-in, no weirdness. Ready to Level Up Your Power Platform Game? This stuff is moving fast, and it's easy to feel like you're falling behind. You don't have to figure it all out alone. If you want help building solutions like this, reviewing your existing apps, or figuring out how to sprinkle AI into your flows and apps in a way that actually makes sense for your business, the team at  PowerApps911  is ready to help. Click the Contact button on this page and let's build something awesome together.

  • How to Restore a Deleted Power Apps Canvas App (Step-by-Step with PowerShell)

    Accidentally deleted a Power Apps canvas app? Yeah… that “oh no” moment is real, I know I did it last Tuesday while on a flight. Whoops! The good news: you can restore a deleted Power Apps app The bad news: Microsoft doesn’t give you a button to do it Instead, you’ll use PowerShell and it’s actually pretty easy once you know how. Quick Answer To restore a deleted Power Apps canvas app: Install Power Apps PowerShell modules Run Add-PowerAppsAccount to sign in Run Get-AdminDeletedPowerAppsList to find the app Copy the App Name (GUID) Run Get-AdminRecoverDeletedPowerApp Provide App Name and Environment ID Notes: Deleted apps can be recovered for up to ~28 days Requires Power Platform Admin or Global Admin Restored app will have a timestamp added to name but same link works Before we continue, if you are more of a visual leaner then here is a YouTube video of me doing all of these steps: How to Restore a Deleted Power Apps Canvas App Step by Step Can You Restore a Deleted Power Apps Canvas App? Yes, but only if: The app was deleted within ~28 days You have admin permissions You use PowerShell (not the UI) There is no restore button  in the Power Apps interface. Where People Look First (But Won’t Find It) Let’s save you some time and frustration, I already checked all of these places. Power Platform Admin Center ❌ No way to restore individual apps Restore Environment ❌ Restores everything, which is not practical Power Automate Admin Actions ❌ No restore actions exists COE Toolkit ❌ No recovery option At this point most people assume the app is gone forever! UGH. What You Need Before You Start Windows + PowerShell Power Platform Admin or Global Admin access Step 1: Install Power Apps PowerShell Modules Run PowerShell as Administrator and install: Install-Module -Name Microsoft.PowerApps.Administration.PowerShell Install-Module -Name Microsoft.PowerApps.PowerShell -AllowClobber If you are prompted about trusting repository PSGallery click Y if you trust it (I do) to allow the install to continue. It will not work if you say no. Step 2: Sign In to Power Apps This will cause a pop-up screen where you need to choose your M365 Account that has permissions to do the restore. Add-PowerAppsAccount Step 3: List Deleted Power Apps Now we want to find the app. Use the following Screenshot to put the puzzle together. First enter the cmdlet in the PowerShell window. (Shown with red underline) Get-AdminDeletedPowerAppsList Now, you’ll need your Environment ID (Shown with green highlighter) How to Find Your Environment ID In a browser go to the home of Power Apps and from the URL (between /e/ and /a/). Remember you need to be in the environment where you deleted the app from. Also, in green is my ID, it will not work for you. 🙃 Step 4: Restore the Deleted App From PowerShell enter this cmdlet. Get-AdminRecoverDeletedPowerApp Enter YOUR values for: App Name (Yellow Above) Environment ID (Green Above) Step 5: Wait for the App to Reappear Usually takes 5 minutes Refresh your apps list What Gets Restored? This is the best part: App returns Version history remains Connections still work App functions normally The name will include “restored” + timestamp ❓ FAQ How long can you restore a deleted Power Apps app? Up to ~28 days after deletion. Can a maker restore a deleted Power Apps app? No. You must be a Power Platform Admin or Global Admin. Is there a restore button in Power Apps? No. You must use PowerShell. Does restoring an app bring back data and connections? Yes. In most cases, connections and version history remain intact. Can you restore a Power Apps app without PowerShell? No, PowerShell is currently the only supported method. Quick Recap Deleted Power Apps apps are recoverable Recovery window is ~28 days No UI option exists PowerShell is required Use: Get-AdminDeletedPowerAppsList Get-AdminRecoverDeletedPowerApp Need Help with Power Apps? If you want help building, fixing, or avoiding disasters like this: PowerApps911 can help with: Consulting Training Governance Troubleshooting Basically… everything you wish you had before clicked delete.

  • Streamlining Your Workflow with the Power Platform and QuickBooks

    Here at PowerApps911, we are big fans of practice what you preach. We ourselves use a variety of home-built Power Platform applications to make things run as smooth as possible.     One of the latest upgrades we implemented is a connection from our CRM model-driven app  (where we track all of our time) into QuickBooks (where we do all of our invoicing and billing). We’re a consulting firm – we track all the time we spend working with our clients (we have to keep the lights on somehow, right?). Timesheets are one of those painful pesky duties that our consultants must adhere to and they do a great job of it.     We were failing ourselves with the disconnect between our consultants entering their timesheets and how that tracked time eventually made its way into QuickBooks for invoicing. The disconnect being there was literally no connection between the two systems, and we were manually entering all that time into QuickBooks – resulting in inefficiency and errors.    Enter, the QuickBooks API connector. Our team was able to take the QuickBooks API connector and wire it up to our CRM model-driven app, connecting the correct project to the correct client in QuickBooks, finding the correct project to log the time against and ensuring that only the time that is approved gets added to QuickBooks. Talk about hitting the efficiency jackpot. No more manual data entry, no more head-scratching over whether we billed for the right hours. Every time entry that is submitted gets a quick approval from the project manager, and if it meets the criteria to be added to QuickBooks, then quickly makes its way there.     It's not just about saving time and reducing errors; it's about creating a smoother, more hassle-free operation that keeps everyone on the same page.     We are not stopping there.  Next up is bringing the invoicing information back into the CRM.  Allowing our team to quickly see if an invoice has been paid and creating a one-stop dashboard for each client!  Project Management, Account Management, and Financial information for the client all in one spot – no more 5 browser windows open at once here!    If you use QuickBooks and want to look at the ways you could connect it to your other systems, PowerApps911 is here to help! This is something that we’d love to help you and your business out with! Click the button below to contact us!

  • Import Excel Data to SharePoint List with Power Apps and Power Automate

    You got Excel data (man, do you have lot's of it) and sometimes you need that data into SharePoint. In one off scenarios, no big deal, you go to SharePoint and upload it to the list and life is good. But, what about when that is a daily challenge? That is where automation comes into play. In this guide, we will walk through what it would look like if you had a Power Apps app for the user to upload the Excel file to, then the xlsx file will be passed to Power Automate to extract, filter, and then save the rows directly to a SharePoint list. The key here is Power Automate cloud flows and their ability to interact with Excel files for bulk import and SharePoint. Now, while this will focus on starting at Power Apps, keep in mind that the flow mechanics could be applied to many other scenarios. When a file is uploaded to SharePoint When you receive the Excel file as an email attachment Or even if you had another format like CSV Alright, let's walk through the process of Import Excel Data to a SharePoint list with Power Apps and Power Automate but, before we do, I have another option. If you want more details and to see all of this in action, check out the video I mport Excel Data to SharePoint List with Power Apps and Power Automate Using Power Apps for the User Upload The Power Apps app is pretty straightforward. Give the user an Attachment control, when the Excel file is attached, then run a Power Automate cloud flow to do bulk import. Once the flow finishes successfully, then Refresh the SharePoint list so the user can see their data in the app. Now, if you are not used to the upload method for Power Apps, I have another blog post here: Upload to SharePoint from Power Apps v2 . Using the Power Apps attachment control and the Power Apps v2 trigger in Power Automate, the process is pretty straightforward. Because to make this process easiest, the flow will create the file in SharePoint, then read it, then delete it. Seems like extra steps but it is the best path. Power Automate does the bulk of the work Now lets look at the flow. We will do it in mini sections to make it easier to follow but, everything below is all in one flow. Power Apps v2 trigger and SharePoint Create file The Power Apps v2 trigger for your cloud flow has one input of File type. This allows the app to pass the Excel file to Power Automate. Then the Create file in SharePoint action needs you to configure the site and the document library you want to store the Excel in. Keep in mind, we are only storing it long enough to process it, we will delete it at the end. Or if you want to keep it, that is great also. Either way we need to store it for a hot minute to do the following steps For the File Name and File Content, with the new flow designer they are easily added as dynamic content. Get Tables from Excel The Excel file must have a table, and in this example only one table. This action is getting the list of Tables from the XLSX file so you can reference it in the following action. The Id is the dynamic content from the Create File step. But Shane, my file is a CSV or doesn't have a table. Well, then you are going to have to do something about that. For the last customer, they just made it a requirement that someone turn the data into an Excel Table before upload. Other options, could include using an Office Script to do it for you. That is a little trickier but there is a video here to help: Using Excel Scripts with Power Automate to convert CSV List Rows present in a Table The first three fields are repeats of above but that Table one, that is a tad tricky because you have to use an Expression. first(outputs('Get_tables')?['body/value'])?['Id'] That grabs the Id of the first table from the previous action. Back to the concept of, if you are doing a bulk, repeating upload like this, you are going to have to have a planned structure for your Excel. This has never been a problem for a customer but, I wanted to make sure you were aware. And speaking of customers - What can we do to help you? Just hit the Contact button and let us know. We can help for 30 minutes or 30 months, whatever you need, we got it. Also, at the bottom check out the DateTime Format. If you are going to import dates make sure you have set the format to ISO 8601, the other serial method is confusing and somehow involves 1899. No thanks. Filter Array if Necessary Hopefully you have clean data but I didn't, so I used a Filter Array action to remove all of the unclean rows. Using a formula like: @and( not(empty(item()?['Name'])), not(empty(item()?['Amount'])), not(empty(item()?['Date'])), not(empty(item()?['Email'])) ) This returns only the rows that don't have blanks in any of those columns. Why? Because blank fields will make the whole thing fail. Now in my example, I just threw away the bad rows, but really, you should probably tell the user they had bad data. Loop Through the Rows and Create SharePoint List Items This Apply to each action is looping through all of the Excel rows from the Filter action. For each row of Excel data it is using the SharePoint Create Item action. This is how you do the bulk import from Excel to a SharePoint list. Nothing fancy at this point. Now if you go to set this up with the dynamic file and tables you will have challenges with your dynamic content not showing up. It is annoying. In the first video way back at the top I talk you through that challenge. Long story short, you have to use a static file when configuring the flow. Then once everything is setup you will go back and change things to be dynamic. It is confusing and a big part of the video, so if that is new to you, go watch. Sorry, to much to explain in text. Delete the File Flow is annoying, whoops I shouldn't say that, flow is annoying because sometimes it locks files even though it doesn't really have the file. Is that better? Either way, if you want to delete the Excel file you will need this. You are going to hit the API using the HTTP action as shown above. This will override the file lock that was causing errors. Don't over think it, just use this and move on. Wrapping up for Import Excel Data to SharePoint List with Power Apps and Power Automate There you go my friends. You let a user upload a file with a Power Apps app, then you sent it to Power Automate. Power Automate did all of the hard work of saving the file, grabbing all of the Excel rows, importing them to SharePoint, and then deleting the file. Pretty cool! Remember, if you need help with this or anything else Power Automate just hit that Contact button. We got you!

  • Dataverse security and look up tables

    Configuring your Dataverse security roles will help you keep data from being editable to the wrong target audience. However, if you improperly configure your security role for your lookup tables, you can be in for a headache. This article discusses the problem and the solution! I recently created a Power Apps model-driven app with a main table that had lookup columns to other tables. By using the Power Platform admin center for my Environment, I created two different security roles for the app. On the “Admin” security role I gave complete organization-level access to all the different tables (create, read, update, delete, etc.). For the “User” security role, I gave complete access to the main table and then organizational read  access only to the supporting tables. The problem All was well and good when folks with the “Admin” role were using the app, however, when the “Users” took to the app they noticed that they didn’t have access to any of the supporting tables. Here's what folks with the "User" role began seeing: A perplexing problem! We didn’t want the “User” role to be able to change any of the data, but we needed them to be able to input data into the main table from these supporting tables. One of our PowerApps911 experts, Daniel LeMay, uncovered the problem during a call with the customer. Solving the problem Part A - Don’t start a security role from scratch! When you create a new security role, there are a lot of permissions to various tables throughout a Dataverse environment that you’ll miss. The supporting tables have complex relationships with other tables that you may miss. Some of these permissions are User-level, some are for Business Unit, and some are Organizational access. When you begin thinking about a new security role, think of using a standard Dataverse security role that most closely resembles your users and make a copy of that role to start your new role with that. For example, if you just want someone to have access to the app, but not do any data input, start with the App Opener role. If someone is going to be accessing the app as a user, consider the Basic User  role. There are other roles such as Service Reader, Service Writer and Support User as well. None of these roles is customizable so that you can use these as templates for your security roles. Microsoft has a list of these different roles here . Use one of these as a template. We decided to use the Basic User  role as a template. Here’s a step-by-step guide for how to use an existing Dataverse security role as a template for another security role. 1.      Go to the Power Platform admin center ( https://admin.powerplatform.microsoft.com ) 2.      Select Environments from the left-side menu. 3.      Select the Environment where you want to create the security role. 4.      In the Access pane there is a clickable “ See all ” link under Security roles. 5.      Find the security role you want to emulate in the list of security roles. Select the “More actions” ellipses next to the Business unit number and select Copy . (You can do the same thing from the Copy button in the command bar.) 6.      Once you select Copy , a dialog box appears where you can enter a name for your new role. Input the name for your role. Then select Copy. 7.      After a few moments, your new role will appear on your Security roles list, and you can continue. Part B - Update your supporting table permissions with Append and Append to permissions. Once you’ve provided all of the necessary permissions for your users to access the main table, you can move to the lookup tables. Of course, you need the user to be able to read the data, however, you also need them to be able to have Append  and Append to  permissions for these tables. Why is that?  In Dataverse, the Append  and Append To  permissions are used to control the ability to associate two records in a relationship. This is particularly important when dealing with lookup tables and relationships in model-driven apps. Append  permission is necessary on a table when it has the lookup  of another table on a form . This permission allows a user to add (or “append”) a related record to the table. For example, if you have a Pet Toys Order table that includes a look up to a Customer table, the user will need Append  permission on the Pet Toys Order table to associate a Customer record with a Pet Toys Order record. Append to  permission is necessary on a table when it is being associated  with another table. This permission allows a user to append the table to another entity. In the example above, the user would need Append to  permission on the Customer table to associate it with a Sales Order record. Back to our model-driven app, if our main table has lookup columns to supporting tables, users will need both Append  and Append to permissions to select options in a form based on the main table. This is because when a user selects an option, they are essentially trying to associate a record from the supporting table (Append permission) to a record in the main table (Append To permission). Summary The two takeaways in my lesson were, one , to always use an existing (and working) security role to create a copy as a new role. Two , to include Append  and Append To  permissions for any of the tables being looked up from my main table.

  • Unlocking SharePoint REST API with Power Automate

    In today's digital workplace, the ability to customize and automate SharePoint processes can significantly enhance productivity and collaboration. The SharePoint REST API, when combined with Power Automate, opens a world of possibilities, allowing you to extend beyond the limitations of standard SharePoint functionalities. This post explores why the SharePoint REST API is a game-changer, how Power Automate makes it accessible, and provides practical examples to get you started. Why You Should Care About the SharePoint REST API The SharePoint REST API enables you to interact with SharePoint resources such as sites, lists, columns, and more programmatically. This means you can automate complex tasks, integrate with other services, and build more dynamic and responsive solutions for your organization. Understanding how to leverage the SharePoint REST API can transform your operational efficiency and open new avenues for system integrations. The Ease of Use Provided by Power Automate One of the greatest strengths of Power Automate is its ability to simplify complex processes. When it comes to using the SharePoint REST API, Power Automate provides a user-friendly interface and a variety of pre-configured actions that handle authentication and connection details automatically. This drastically reduces the learning curve and lowers the barrier to entry for automating SharePoint tasks. How to Create a SharePoint Site Using Power Automate Creating a SharePoint site via the REST API with Power Automate involves setting up an HTTP request that specifies the site's properties. Below is a basic example of how to structure your Power Automate flow to accomplish this: Method: POST URI: _api/SPSiteManager/Create Headers: Accept: "application/json;odata.metadata=none" odata-version: "4.0" Body: { "request": { "Title": "Your Site Title", "Url": "Site URL", "Lcid": 1033, "Template": "STS#3", "Owner": " your.email@domain.com " } } Here is my example: How to Create a List in Your New Site After setting up your site, you might want to create a custom list to store data. Here's how you can use Power Automate to send an HTTP request to create a list: Method: POST URL: _api/web/lists Headers: Accept: "application/json;odata=verbose" Content-Type: "application/json;odata=verbose" Body: { "__metadata": { "type": "SP.List" }, "AllowContentTypes": true, "BaseTemplate": 100, "Description": "My Custom List", "Title": "Custom List" } Here is my example: If you are enjoying this. Consider checking out our training options. We have on-demand classes, live classes, and even a full 6 months program to teach you all things Power Platform. For more information check out our Power Platform Training . Adding a Column to Your List To further customize your list, you may need to add columns. Below is how to add a single text column to your list through Power Automate: Method: POST URL: _api/web/lists/getbytitle('Custom List')/fields Headers: Accept: "application/json;odata=verbose" Content-Type: "application/json;odata=verbose" Body: { "__metadata": { "type": "SP.Field" }, "Title": "New Column", "FieldTypeKind": 2, "AddToDefaultView": true } Other Things You Might Want to Do With the SharePoint REST API and Power Automate, the possibilities are nearly limitless. Here are a few more things you might consider automating: - Creating Views : Automate the creation of custom views for your lists to tailor how data is displayed. - Managing Permissions : Set up workflows to manage and update permissions dynamically. - Integrating with External Systems : Send data from SharePoint to other systems like CRM platforms, external databases, or even custom apps. - Accessing SharePoint Groups: Always been surprised this wasn't built in so there is a video just for it. https://www.youtube.com/watch?v=rRnbe1CfQ30 Conclusion The SharePoint REST API is a powerful tool for any SharePoint administrator or developer looking to enhance their site's functionality and automation. Power Automate not only simplifies the process of using the API but also expands the potential of what you can achieve with SharePoint automation. For a full step-by-step guide, including detailed explanations and troubleshooting tips, check out our video tutorial on how to use the SharePoint API with Power Automate . By mastering these skills, you can significantly increase the efficiency and functionality of your SharePoint environment, providing more value to your team and organization. If you need help with this, or anything else big or small in the Power Platform just scroll down the page and fill out the contact form. We would be happy to help.

  • The different types of Power Apps Variables

    If you are going to build great apps sooner or later, you are going to need to use variables. So, in the blog post I am going to break down for you what variables are, why you need them, and then the 5 different types of Power Apps Variables that exist. If you are more of a visual learner, then you can check out my Power Apps Variables video . What is a Variable and Why are They Important in Power Apps? Understanding Variables A variable in the context of Power Apps is a storage location that temporarily holds data while the app is running. Think of a variable as a labeled container where you can store a piece of information that you might need to reference or manipulate later. This information can be anything from a simple number or text string to more complex data structures like tables or records. Types of Data Stored in Variables Variables can store various types of data, including: Text : Strings of characters, such as names or messages. Numbers : Numerical values for calculations or counters. Booleans : True or false values for conditions. Records : Structured data that can contain multiple fields, like a database row. Tables : Collections of records, similar to a spreadsheet. Temporary Nature of Variables It's important to understand that variables in Power Apps are temporary. They only exist while the app is running. Once the app is closed or the session ends, the data stored in the variables is lost. Therefore, if you need to retain data between sessions, you should consider using a data source like SharePoint, Dataverse, or SQL Server to store your data permanently. Importance of Variables in Power Apps Variables are crucial in Power Apps for several reasons: Data Management : They allow you to store and manage data dynamically. For example, you can store user input in a variable and use it later in your app without having to fetch the data again from a data source. Improving Performance : By using variables to cache data, you can reduce the number of calls to data sources, which can significantly improve the performance of your app. This is especially important in apps that handle large amounts of data or need to operate efficiently on mobile devices. State Management : Variables help in managing the state of your application. For instance, you can use variables to keep track of whether a user is logged in, the current step in a multi-step form, or the visibility of certain UI elements. Conditional Logic : They enable you to implement complex conditional logic. You can use variables to store the results of conditional checks and then use those variables to control the flow of your application, such as showing or hiding elements based on user actions. Simplifying Code : By storing intermediate results in variables, you can simplify your formulas and make your code more readable and maintainable. This is particularly useful in complex calculations or when the same value needs to be used multiple times in different places. Practical Example Consider a scenario where you are building a form that collects user information. As the user fills out the form, you can store each piece of information in a variable. Once the form is completed, you can use these variables to validate the input, display a summary, or submit the data to a database. This not only makes your app more responsive but also allows for a better user experience by minimizing delays and reducing the need for constant data fetching. In summary, variables are a foundational concept in Power Apps that enable you to create dynamic, efficient, and responsive applications. By understanding and utilizing variables effectively, you can enhance the functionality and performance of your apps, making them more powerful and user-friendly. Global Variables: How to Create Them and When to Use Them How to Create Global Variables Global variables are accessible from anywhere within your Power App. They are created using the Set function. Here’s how to create a global variable: Set(VariableName, Value) For example, to create a global variable named VarUserName and set its value to "John Doe", you would use: Set(VarUserName, "John Doe") When to Use Global Variables Global variables are ideal for data that needs to be accessed across multiple screens or throughout the app. They are particularly useful for storing user inputs, application states, or any data that needs to persist while the app is running. However, be mindful that global variables can consume significant memory resources, especially in larger apps. For most variable types the most common place you will see them is for OnSelect of a Button control Context Variables: How to Create Them and When to Use Them How to Create Context Variables Context variables are specific to the screen they are created on. They are defined using the UpdateContext function. Here’s how to create a context variable: UpdateContext({VariableName: Value}) For example, to create a context variable named VarPageTitle and set its value to "Home Page", you would use: UpdateContext({VarPageTitle: "Home Page"}) Are you struggling with learning the core concepts of Power Apps and Power Automate? Then check out our training classes! We have Live and On-demand classes no matter what your skill level is. Power Apps Training When to Use Context Variables Context variables are best used for screen-specific data. They are perfect for managing elements like pop-ups, loading spinners, or temporary states that only apply to a single screen. Since context variables are limited to their screen, they help optimize performance by reducing unnecessary data storage. Collections: How to Create Them and When to Use Them How to Create Collections Collections are used to store tables of data. They are created using the Collect or ClearCollect functions. Here’s how to create a collection: Collect(CollectionName, {Field1: Value1, Field2: Value2}) For example, to create a collection named ColContacts with fields for name and phone number, you would use: Collect(ColContacts, {Name: "John Doe", Phone: "123-456-7890"}) When to Use Collections Collections are ideal for managing tabular data within your app. They are useful for scenarios where you need to store and manipulate lists of records, such as contact lists, product inventories, or form submissions. Collections can also be used to cache data from a data source to improve app performance. With Function: How It Is and Isn’t a Variable, How to Create, and Why to Use It How to Create With Function The With function is used to create temporary variables within a specific block of code. It is not a true variable but serves a similar purpose for temporary calculations. Here’s how to use the With function: With({VariableName: Calculation}, Formula) For example, to perform a lookup and use its result in multiple places within a formula: With({UserRecord: Lookup(Users, Name = "John Doe")}, UserRecord.Email & " - " & UserRecord.Phone) Why to Use the With Function The With function is ideal for optimizing code performance by reducing redundant calculations. It is particularly useful in complex formulas where you need to perform the same calculation multiple times. By using With, you can perform the calculation once and reuse the result, making your code more efficient and easier to read. With is most commonly used in a Label to avoid repetive calls Named Formulas: How to Create Them and Why to Use Them How to Create Named Formulas Named formulas are similar to global variables but are defined in the app's formulas section and are automatically recalculated by Power Apps. Here’s how to create a named formula: NFVariableName = Calculation For example, to create a named formula that holds a static value: NFSport = "Soccer" Why to Use Named Formulas Named formulas are perfect for data that doesn’t change frequently and needs to be calculated once. They are managed by Power Apps, ensuring they are recalculated only when necessary. This makes named formulas efficient for static data or calculations that should remain consistent throughout the app’s lifecycle. However, remember that named formulas cannot be changed dynamically within the app. Named formulas can only be created from the Formulas property of the App object. Watch out their syntax is different than most others. Conclusion Understanding and effectively using variables in Power Apps is crucial for creating dynamic and efficient applications. By leveraging global variables, context variables, collections, the With function, and named formulas appropriately, you can manage your app's data more effectively and optimize performance. Each type of variable serves a unique purpose, and knowing when and how to use them will significantly enhance your app development process. If you need help with this or any Power Apps concept, then scroll down the page and fill out our Contact form. We can do everything from 30-minute screenshares to fix your problem to full on consulting projects to build everything for you. Just let us know how we can help.

  • Power Apps Code View for Pro & Non Developers

    Look, I admit, a concept like Code View can be scary to someone who already thinks the concept of "Low-Code" already had too much code. And then you find out that it is YAML and you are like, I am out! Well calm down a minute. Remember, I am not a pro developer either. I don't write C# or Python or whatever. It is okay. YAML is very similar to JSON and remember how happy we all were when we learned that? It is all just text with a specific format. So, let's learn what does code view get us. How about the ability to quickly see what has been modified in a control. How about the ability to copy that code and send it to a co-worker in a Teams chat or email and then they can paste it straight into their app and it just works. How about the ability to paste that code into Notepad or VS Code and edit that code before pasting it back into Power Apps. This opens a lot of doors! Below let's talk about it a bit and give you some examples. But if you are thinking I want to see a deeper dive and I want to see it in action then check out this video Power Apps View Code and VS Code with YAML View Code and Copy Code in Power Apps This one is pretty simple. Now anytime you want to know what properties have been set for a control, right click on it and select View code. Works for controls, containers, and even screens! Once you click you now see all of the non-default properties for that control. Meaning if you have set the Color, you will see the Color, if you are using the default, you will not. You cannot edit through this experience, but you can click Copy Code in the bottom left which will put the code in your clipboard. If you know you want to just copy thecode,e then you can also right click on the control and select Copy > Copy Code. Edit Power Apps code with Notepad Now that you have copied the code you can edit it with any text editor, like Notepad. (In a later section we will talk about VS Code but for now let's keep it easy.) Open up Notepad and paste it in. This text, formatted the way it is, is called YAML. Like JSON, it is just a fancy name for text with some formatting rules. Don't over think it, it is just text. The cool thing is you can edit it and then take it back to Power Apps. In the screenshot below I pasted in our boring button code and added an OnSelect property to create a global variable called varDog and set its value to Buddy. 🐶 Now highlight all of that code and copy it back to your clipboard. Enjoying this? Then you will love our training! Click training at the top of the page and join us for live or on demand training. Everything from intro Power Apps to Copilot AI or even a full 6-month deep dive University! Paste Code in Power Apps Head back over to Power Apps, right click on your screen and select Paste > Paste Code And now look. It creates the button, automatically updated the button name to avoid duplicate Button1 and the OnSelect property is set to Set(varDog, "Buddy") When it comes to pasting in code you can paste single controls, multiple controls, and even containers with all of their child objects. The only thing you cannot paste right now is a whole screen. Very cool. One of the neat scenarios this opens is if I want to give you a control configured with a bunch of awesome settings, I can just give you the text now. 😎 So take this cool image of Buddy going for a swan dive into the pool. All you need to do to get it is steal this fancy YAML. 😜 - Image1: Control: Image Properties: Image: ="https://static.wixstatic.com/media/263017_282af94507eb474d8a8a6dc99e1e7586~mv2.jpg" BorderColor: =RGBA(246, 88, 16, 1) BorderThickness: =10 Height: =277 RadiusBottomLeft: =100 RadiusBottomRight: =100 RadiusTopLeft: =100 RadiusTopRight: =100 Width: =336 X: =40 Y: =36 Boom! You have the diving pup! What about Pro Developers Truth be told, you are why they started all of this. Why? This will open doors for you using Source Control like Github with all of your branches and forks and stuff. And if you install the YAML extension from Red Hat, you can even add the Power Apps Schema. 🤯 Allowing more IntelliSense, throw in some Github Copilot and now you are cooking! To see how to get all of that fun configured check out the video list at the top of the article. This blog post has gotten too long to explain VS Code, and if you are a pro dev, you probably know more than I do anyway. 🙃 Summing it up This is an interesting twist, which opens new doors of understanding and sharing controls for all of us. Yes, it is also meant to power pro developers to do more powerful stuff but doesn't mean the rest of us cannot benefit. If you need help with any of your Power Platform projects let us know, we have lot of options from training, to mentoring, to full scale consulting to help you out. Scroll down a bit more and fill out that contact form and we will be happy to help.

  • Power Apps Text Functions Deep Dive

    In today's post, we're diving into the world of text (or string) functions in Power Apps. If you're working with any kind of data, chances are you'll need to manipulate strings at some point. Whether it's reformatting text, cleaning up user inputs, or extracting specific data, these functions are a key ninja skill you should develop. 🥷 Below we will talk through 17 different Power FX functions that allow you to manipulate your Power Apps data in all ways regardless of if it comes from your users via inputs or from your data sources like Dataverse, SharePoint, SQL, or the other twelve hundred that are available. And because I am super nice there is a code example of each so you can see the practical example and easily cut and paste. 😁 Finally, if you want to see the examples and hear the more detailed explanation of using these Power FX functions, then check out my video on Power Apps Text Functions . It might not win an Emmy, but maybe a Golden Globe? Split, Last, and First Functions One of the most common text challenges you'll encounter is splitting and reformatting strings. A classic example is converting names from "Last, First" format to "First Last". Using the Split function, you can break a string into pieces based on a delimiter (like a comma). From there, the Last and First functions come into play, allowing you to rearrange and clean up the data as needed. Example : Suppose you have a name formatted as "Young, Shane." By splitting on the comma and using First and Last, you can easily reformat it to "Shane Young." Trim(Last(Split(TextInput1.Text, ",")).Value) & " " & First(Split(TextInput1.Text, ",")).Value Index Function Need to grab a specific part of a string, like a middle name? The Index function is your go-to tool. This function retrieves a specific row from a table created by a split function. Example : Splitting "Shane Dog Young" on the spaces between the words would create a table with three rows. The Index function allows you to pull out the second row, which would be "Dog" in this case. Index(Split(TextInput2.Text, " "),2).Value Right, Left, Mid, and Find Functions When you're working with structured text, like invoice numbers or IDs, you'll often need to extract a fixed number of characters. The Right and Left functions allow you to grab a specific number of characters from the end or beginning of a string. For more complex cases, the Mid function is a lifesaver. It lets you extract characters from anywhere in a string, based on a starting point and length. Combine it with the Find function to locate specific characters or patterns in your text. Example : Use Right to grab just the last four digits of a string that represent the invoice number. Or use Left to get the first view characters. This works best when you know the structure of the data, and know it will not change. Right(TextInput3.Text, 4) Left(TextInput3.Text, 3) Example :  Combining Mid and Find is another way to locate part of a string, like earlier when we used Split. The difference here is you might be finding a specific character(s) within the string to start from. Mid(TextInput5.Text,Find("-", TextInput5.Text) + 1, 3) Len Function Sometimes, you just need to know how long a string is. That's where the Len function comes in. This function counts the number of characters in a string and is particularly useful when validating inputs or calculating positions in more complex formulas. Example : Use Len to ensure that phone numbers or codes meet length requirements before processing them further. Len(TextInput6.Text) Upper, Lower, and Proper Functions Standardizing text case is crucial for data consistency. Whether you need everything in uppercase, lowercase, or proper case, these functions have you covered. The Upper function converts all characters to uppercase, Lower converts them to lowercase, and Proper capitalizes the first letter of each word. This is especially useful for normalizing names or email addresses to avoid case-sensitive issues. Example : Use Lower or Upper to standardize email addresses before comparing them, or Proper to clean up user-entered names. Upper(TextInput7.Text) Lower(TextInput7.Text) Proper(TextInput7.Text) Are you enjoying this learning style? Be sure to check out some of my Power Apps and Copilot Training classes . Both Live and On-demand courses available. Trim and TrimEnds Functions Whitespace can be a sneaky issue in user inputs, causing mismatches and errors in your app. The Trim function removes all extra spaces from a string, including those between words. TrimEnds , on the other hand, only removes spaces from the beginning and end of the string. These functions are perfect for cleaning up user inputs and ensuring data consistency, particularly when dealing with form fields or imported data. Those people writing Power BI reports from your data will thank you. Example : Use Trim to clean up a user-entered address or TrimEnds to remove accidental trailing spaces in email inputs. Trim(TextInput9.Text) TrimEnds(TextInput9.Text) Replace and Substitute Functions Sometimes, you need to swap out certain text in a string. The Replace and Substitute functions allow you to do just that, but with a key difference: Replace targets a specific position in the string and replaces it with new text. Substitute finds all occurrences of a specific text and replaces them. Example : Replace a specific word in a sentence or substitute all instances of a special character in a text field. Replace(TextInput8.Text,9,4,"really love") Substitute(TextInput8.Text,"like","🥰") Concat Function The Concat function is the opposite of Split we learned earlier. It takes a table of data and combines it into a single string. This is extremely useful when you need to generate lists from selected items, such as creating a list of email addresses from a Combo Box SelectedItems output. Example : Use Concat to combine multiple selected values into a semicolon-separated list for an email field. Concat(ComboBox1.SelectedItems,Value,"; ") String Interpolation Finally, let's talk about string interpolation – the newer, fancier way to concatenate strings in Power Apps. With this method, you use dollar signs ( $ ) and curly braces ( {} ) to embed dynamic content within your strings. While the old-school & (Ampersand) method still works just fine, string interpolation offers a cleaner and more intuitive way to build strings. Though, thanks to muscle memory, I still use the old way. 🤷 Example : Use interpolation to dynamically insert user names, dates, or other variables into your strings with minimal fuss. As you can see, both ways produce the same output, really just a matter of what works best for you. $"The user {User().FullName} typed {TextInput10.Text} in the box." "The user " & User().FullName & " typed " & TextInput10.Text & " in the box." Wrapping up Power Apps Text Functions Text manipulation is a fundamental skill in Power Apps, enabling you to clean, structure, and transform your data with ease. Whether you're working on a simple form or a complex data process, mastering these text functions will make your apps more robust and reliable. I hope this guide helps you tackle your text challenges with confidence! As always, feel free to reach out if you need assistance, whether it’s a quick fix or a more involved project. Need Power Apps String Function Help? If you need help with this or any other Power Platform topic we are here to help. We can do everything from a quick 30-minute fix to a 30-year project. We also have lots of training classes. (I really want to say 30 courses to stick with the 30 theme but I'm not sure that is true. 🤣 I guess I should count them.)

bottom of page