Blog

PowerApps Document Translator app

Today I would like to present you one of my favorites apps of my own. I think it’s insanely useful. Especially when you receive an email like below from your client:

The Story

//todo

Usage

Architecture

App consists of following steps:

  1. PowerApps present user interface to let him pick a document (Word or PowerPoint) and select languages he/she wants to translate document to.
  2. A document is uploaded to SharePoint with all metadata (author, desired translated languages)
  3. Microsoft Flow takes a document and pass it to Custom Azure Function
  4. Azure Function open the document and take out each paragraph separately from XML structure.
  5. The paragraph is then translated using Cognitive Service Translation Text API (Azure SaaS) – I used OOB service configuration but it allows for many different tweaks to improve translation output
  6. Azure Function put translated document all together and send it back to Microsoft Flow
  7. Flow saves each translated document as separate file in SharePoint. Thanks to this manner each document content is searchable in SharePoint search. Flow is also responsible to notify user that the documents has been translated.
  8. User can access translated documents directly from the email or using the PowerApps app.

Share PowerApps to external users

This week I wanted to test out new PowerApps capability that is sharing PowerApps Canvas Apps to guest users. And as you may already know – it works like a charm! 🙂

If you’d like to know more about it here is great resource that cover this topic in details (licensing, connectors that supports it etc).

How to use Flow on elevated privileges in SharePoint Online

In this article I’ll show you what is elevated privileges, when you may need it and how to run a Microsoft Flow in elevated privilages in SharePoint Online.

Elevated Privileges

Back days, when I was a SharePoint on-premise developer, there was a code method named RunWithElevatedPrivileges() which allows to accomplishing an operation with a higher permissions. The same functionality was available in the SharePoint Designer for workflows under the name: “App Step”

Technically speaking: using RunWithElevatedPrivileges() method run code with Full Control rights despite of the permissions that come from the user context. It was possible due to executing code under the Application Pool Identity (System Account), which has Site Collection Administrator privileges on all Site Collection hosted by that Application Pool.

However In Microsoft Flow there is no such option of running flow with higher permissions. But this is not without a reason! Even though you may think the best way is to override user permissions just to accomplish one operation, a good practice is to improve your solution architecture first. But sometime you won’t have another choice. When it may happen?

When you may need to elevate user permissions?

Some time ago on polish Microsoft 365 User Group I saw following question: “Can I create / configure the flow to be run on elevated privileges for SharePoint Online?”.

First tendency of repliers were to discourage the author of doing so. But he had a good reason.

Case 1

The author tried to achieve a two-level approval. Everything setup on a list of requests and a status field on it. Users and approvers should only have read access on this list and the logic (status update) should be done seamlessly “under the hood”. So in this case, no matter from which list or platform (ie. PowerApps) you start the flow, it still run under user context…a user who shouldn’t have access to the list with requests.

To be honest, when I though for a seconds I’ve found next example when you may need to run flow with an elevated privileges.

Case 2

Imagine that your users need to submit a request or an order that is stored in a simple SharePoint list. But in the same time you want to submit a record anonymously that is HIDE USER CONTEXT.

Is it possible? Actually it is 🙂

Impersonating Microsoft Flow

Please note that from now on I’ll stop using “elevated privileges” or “elevated permissions” and use “Flow Impersonation” because it’s more coherent to what we will really do. We will not give the user higher permissions, we will use another account with a higher permissions instead.

To explain you the architecture I’m going to use the sample of another solutions of mine: Whistleblowing app. The architecture of that app is as followed:

  • PowerApp gets information from a user and pass to flow. On this stage everything is personalized in PowerApps and Flow. We know who send what.
  • Flow A pass over HTTP request data to a Flow B. This is the exact moment where we pass data that is essential for the business logic, lose all context information, and impersonate user.

Impersonation is possible because connectors in Flow triggered by HTTP request runs under the accounts which was used during configuration step.

The whole IKEA-alike instruction of setting this up you can find in below video 🙂

How to work with option set in PowerApps

In this article I’ll share my experience and everything I learned about Option Set in PowerApps. Check out my cheat sheet.

Prepare for a battle

Before I start a project I prepare myself and gather all information that helps me to avoid getting into technical dead ends, improve project delivery pace and work efficiency. I read documentation, articles, watch tutorials and do proper exams (for PowerApps & CDS I can recommend MB-200 exam). Like Abraham Lincoln once said:

Image result for abraham lincoln give me six hours meaning

At the same time, no matter how hard you try you won’t be prepared to everything. Especially in IT projects where you can expect the unexpected. Sometimes you’ll need to solve those corner cases which are “very specific only to your project & to this very unique setup” only you have. But sometimes you just try to do some “ordinary operation” (at least as you think about it) and you discovered that it’s not possible or at least is not easy. The common reason for such situations is that the functionality or feature is so new that documentation does not cover it sufficiently and you can’t find ANYTHING (video, article, blog) that completely covers the topic.

Option Sets for PowerApps Canvas apps are one of those topics and this article is about to group all information together.

CDS Option Set cheat sheet for PowerApps

Did you know: You can contact me if you need my help with PowerApps and Flow. I conduct trainings, consultations, build PoC or Solution and also make an audit of your PowerApps app.

What is Option Set? A field type
What it contains? List of text values
Technical synonyms A dictionary, an array of enums
Main pros Centrally managed
Dynamic extending No, only predefined values
When not to use it? Case 1: 
If you need to reference to Option Set values without creating connection to Entity with this Option Set.
Solution:
For local usage use Collection.
For global usage use Entity.

Case 2:
You need additional metadata to Option Set values (ie. Country Population)
Solution: Use Entity.

Option Sets in PowerApps

In PowerApps Option set is one of the field types you can use in your Entity. The information type that Option Set stores is a list of text values. And here comes the Option Set advantage – once you define its text values you can centrally managed it.

Imagine you have a list of countries you have offices in. Once you define such list you can use it in any of your apps. And even more than that – you can use it in PowerBi reports, Flow, Dynamics365 and all other applications that can integrate with CDS.

CASE 1: You’re doing so well that you’re opening a new office in a new country. Would you update all solutions that use your Option Set? Of course not! You only need to update your Option Set definition.

Case 2: You’re doing even better and your office in England start to operate all over United Kingdom. Would you add new text value to a list and update all solutions that use your Option Set? Of course not! You only need to rename England to United Kingdom. And that’s it – this is possible because technically speaking Option Set is a table with 2 columns: Id and Text.

The Text column is only for us – the humans. The Id is used by them – computers, programs, solutions etc. And this is where all misunderstandings begins. People are confused “why I can’t use a text value to set Options Set value? Machines are confused “why humans does not appreciate I can distinguish 2 options even if they have the same text value?”

Yes, in CDS Option Set you can have 2 items with the same name. CDS will use Id value to differentiate them.

How to work with the field in PowerApps and Flow?

Let’s split the above question on 2 parts:

  1. How to reference an Option Set Value in Microsoft Flow?
  2. How to use Option Set field in PowerApps?
    • Option Set with Dropdown
    • Filter by Option Set field
    • Update Option Set field using Patch function

How to reference an Option Set value?

Long story short: use the item Id. How to find it?

  1. In PowerApps website open Option Sets
  2. Open your Option Set
  3. Click on “…” > View More

Elaiza Benitez recorded a video where she shows how to use option set value in Flow so I’ll skip reinventing a wheel and just give you a link to the video already starting in the right time.

How to use the field?

Option Set with Choice dropdown

Using Choices function with a name of Option Set works great.

Filter by Option Set field

Use special [@ColumnName] reference that directly point to the Option Set. You’ll see the Option Set values you can easily choose from.

Disclaimer: Last year there was anupdate that improved how PowerApps makers could reference to Option Set field values but…somehow it doesn’t work for me no matter on how many tenants I tried that :(. But I’m sure sooner or later described in above article method (that is reference using ‘OptionSetName (Entity Name)’.Value) will work so stay tuned and treat my post as workaround.

To turn this feature on go to App Settings > Advanced Settings > “Relational data, option sets and other new features for CDS”

Update Option Set field using Patch function

Use the same method as I’ve described in previous section (use [@ColumnName].
Following formula works for me like a charm:

Patch('MyEntity',Gallery1.Selected,{cr10a_country:[@Country].France})

Hope this will be useful for you.

If you have any questions – let me know.

Add fields to SharePoint List using Flow

Last week I’ve explained how to create SharePoint list or library using Microsoft Flow. This time I’ll show you how you can add fields to your SharePoint List using Microsoft Flow, and add items to your list. This will complete the scenario so you’ll get a full solution for dynamic creation SharePoint List along with fields and values.

Automation is the key

Just before I’ll deep dive into the details let’s first cover the question of: why you may even need such dynamic list creation with fields and values?

So imagine you have multiple PowerApps apps for different purposes each ie:

  • time tracking
  • resources booking
  • goals review
  • team members praise
  • retrospective meetings notes

Each app stores data in SharePoint and is team specific – this means some team may want to have it, others not. Also the app data should be team related.

Other often scenario is when you have an app that you want easily deploy in your client’s environment. This was my case when I’ve created my Delegation Playground app that uses SharePoint list – I wanted to automate the process of list creation so app user don’t need to create it manually. I wanted it to be as simple as possible.

In PowerApps there is a Solution concept but it applies only to PowerApps with data stored in Common Data Service (which I highly recommend – check this post of mine) so if your app works with SharePoint Online lists or libraries you may need the below Flow.

The Plan

Ok, so last time we end up with created SharePoint list. Now we need to:

  • Add Number and Boolean fields
  • Add 3000 rows to the list
Image result for over 9000 meme
I wish to make it 9001 but…there are some limits 🙁

Add new fields to SharePoint list using Microsoft Flow

To create new SP field we’ll going to use SP REST API (by using Send an HTTP request to SharePoint action). However this time we need to use new Uri – the one dedicated to list modification. As you can see in this POST request example we need to know list guid to make proper operation. The Uri need to be like:

http://<site url>/_api/web/lists(guid'<your_new_list_guid')

But how to get a newly created list GUID? Oh that’s simple – make a sample call of the Flow we’ve made last time and use data it returns.

Disclaimer: Some of you may already know that there is a simpler Uri API endpoint _api/web/lists/GetByTitle(‘<list name>’) as described here but the way I present brings an additional learning value.

Just follow guideline below 🙂

1. Run Flow that creates list in SharePoint site location
2. Copy its output JSON
3. Add Parse JSON action
4. Put “body” in Content property
5. Click “Generate schema”, paste JSON and click Done
6. Add new string variable
7. As value add id field
8. Selected it and paste into the Expression field
9. Remove closing } and opening @{
10. Add split( on the beginning – we’ll use Split function and use id field value as first argument
11. Add ,’_api’)[1] on the end – we’ll split the string by ‘_api’ substring and take second element from the output collection
The whole expression looks like this:
split(body(‘Parse_JSON’)?[‘d’]?[‘__metadata’]?[‘id’],’_api’)[1]

Now once we have the Uri of our newly create SharePoint list we can use example from this documentation page and use a field type value related to expected field type (all possible sharepoint field types values are here).

Disclaimer: As you can see we’re now working a lot with Microsoft official documentation. I recommend this as a really well written and complete reference source for any O365 developer.

Your action should be configured this way now:

Warning: please note that for number field I used Number field type type value, not the Integer field type value. The latter won’t work

Create similar action to create Boolean field:

Protip: Use copying action to clipboard – it’s new and fancy and I love it. And everyone was waiting for it 😀

Add SharePoint items to SharePoint list using Microsoft Flow

To add 9001 items we’re going to use Microsoft Flow “Do Until” loop. It will do defined operations and at the end of the iteration it will increase the iterator. Once the iterator exceed 9001 flow will know that it’s the right time to go out of the loop.

So add new variable called “Iterator”

Now add Do Until loop and select Iterator variable as value property. Set the check to be “is greater than 3000”. Remember also to unfold Change limits section and increase Count to 3000 items and Timeout to PT5H (just in case 1 hour will be to short)

Warning: Do Until has hard limit on 5000 iterations at maximum.

At this point we’ll normally use “Create item” action for SharePoint in Microsoft Flow. However we’ve just created the list and the mentioned action won’t work with dynamically created list. So…for the forth time we’ll use Send HTTP request to SharePoint 🙂

Protip: “Send HTTP request to SharePoint” is sooo universal and powerful. You can do almost ANYTHING using this action. One of my favorite.

You can find here documentation page where the example Create List Item POST HTTP request is made (see? I told you it’s well written and helpful). Let me show you configured action and code first and then I’ll describe it:

{
  __metadata:  
            {  
                type: "SP.Data.Delegation_x0020_PlaygroundListItem"  
            }, 
Title: 'Item @{variables('Iterator')}',
Integer_x0020_Field:@{variables('Iterator')},
Bool_x0020_Field:@{if(equals(mod(variables('Iterator'),2),0),'true','false')}}

So what I’ve done is (follow my steps):

  1. Add “Send HTTP Request to SharePoint” action inside Do Until loop
  2. Fill Site Address, Method, Uri and Headers as in the screenshot
  3. Paste above code but please make sure to:
    • swap Delegation_x0020_Playground with your list name
    • have ListItem suffix. So for your list named “MyList” the type string will be SP.Data.MyListListItem
    • swap all special characters (like space) in the list name. Good article about it was written here by Stefan Bauer
    • When providing field names remember about special characters rule described above
    • In my case I used expression with modulo function so every even item has Bool field = true

Last thing we need to do is to increase the iterator by 1 inside Do Until loo to not end up with infinite loop.

AND THAT’S IT!

WOOHOO!

You’ve just created flow that create list with fields and list items. And everything done with one push of a button to trigger your flow 🙂

Automation is beautiful.

And just in case you want to download ready made solution – you can download it from here 🙂

Hope this post was helpful. Write me a comment if you have any question or used my flow.

Create SharePoint list using Flow

Microsoft Flow is a great automation tool. It integrates with over 230 services using connectors where each of them contains multiple triggers and actions. One of those connectors is a SharePoint Online connector with a set of 10 triggers and 47 actions(!). Such big set allows to create many scenarios. Starting from managing simple resource list to invoice approvals along with permissions on different levels. Even though, SharePoint Online connector does not contains actions like “Create list”. Such actionmay be useful if you want to create those elements dynamically. Before you think “what a bummer” and turn your eyes on custom code solutions please read this article. I’ll show you how you can create SharePoint List or SharePoint Library using Microsoft Flow.

Create list from list template

Before I’ll show you how I did that let me explain why I need this kind of solution.

Last week I’ve publishing Delegation Learning App. The app was an extension to what has been described in article How to overcome 500 items limit in PowerApps. Using my app a user is walkthrough different integration scenarios – static data, excel from onedrive and SharePoint Online. To make all steps easy I wanted the data sources to be already prepared for the user. With static and excel data there was no problem – I’ve simply attached them to app package. But how to prepare SharePoint Online list? I had 2 options:

  1. Give access to my environment – however I didn’t want to add external access for anyone who want to use an app. I didn’t want to create an account which I would be shared to others too.
  2. Prepare an excel that a user can import to his SharePoint Online – however this option has some import column limitations and I my aim was to create an universal solution.
  3. Create a list dynamically using Microsoft Flow – for me this method was perfect. I could defined any list definition and add items to this list. The only thing that the user had to do is import import flow (which is done automatically if you import PowerApps package) and run it.

Now you know why I decided to go with this option. Now let me explain what I’ve used and how it works.

Create SharePoint list using Flow

To achieve my goal I need use “Send as HTTP request to SharePoint” action which allows to execute any action that is available through SPO REST API.

SharePoint Online REST API is a special way of sending instructions to SPO using HTTP requests. I.e. by making HTTP GET call to https://<Site ABCD url>/_api/web/lists you can get a list off all lists in ABCD site.

Did you know?
Your browser is constantly using such way of communication. Every time when you open some web site your browser is making an HTTP GET request. Go ahead, open a new browser tab and try it: paste https://<Site ABCD url>/_api/web/lists URL (of course swap <Site ABCD url> with your own SPO site url) to see the XML representation of all lists that exists in the site along with metadata

To create a SharePoint list I need to do what is described in this section. In above section you can find below example:

1. url: "http://<site url>/_api/web/lists"
2. type: "POST"
3. headers:{
            "content-type": "application/json;odata=verbose",
            "accept": "application/json;odata=verbose"
}
4. body: { '__metadata': { 'type': 'SP.List' }, 'AllowContentTypes': true,
 'BaseTemplate': 100, 'ContentTypesEnabled': true, 'Description': 'My list description', 'Title': 'Test' }
           

Let me quickly translate it for you.

1. Hey SharePoint, I'm going to do something with your lists...
2. ...and that'll be a modification (create or update)...
3. ...And in step 4 (that is body) I'll send you the details using JSON notation ("content-type" header). If you want to communicate with me please use the JSON notation ("accept" header)...
4. Ok, so the message is this: <the body>

Normally you would also need to authorize yourself providing an token – OAuth token to be precise – but thanks to MS Flow action, the connector is taking care of it 🙂

The last question you may have now is: “how should I know what to put in the body?”. There is a wonderful resource that explains everything you can do using SharePoint REST API: REST API references and samples (add it to your bookmarks, trust me).

Now, in above knowledge base there is a sub-page where you can find all properties you can use in the body: List Properties. You can find there the definition of all used properties. I.e. Base Template represents a ListTemplateType value (see ListTemplateType reference for template type values).

So the last thing is to…

Bring everything back together

Now let’s convert theoretical knowledge into our Microsoft Flow solution.

Disclaimer: Normally I would paste some image below and describe what it shows + what you need to do to achieve the presented result. But thanks to Clarissa Gillingham I realized that if an image is worth a thousands words, a movie is worth a thousands images (23 images per second to be precise #GeekContent). That’s why I’ll just leave with a movie – I hope it’s self explanatory 🙂

Code used for Send an HTTP request to SharePoint is below:

URI:
_api/web/lists

HEADERS:
content-type = application/json;odata=verbose
accept = application/json;odata=verbose

BODY:
{ '__metadata': { 'type': 'SP.List' }, 'AllowContentTypes': true, 'BaseTemplate': 100, 'Description': 'List with items to work with delegations in PowerApps', 'Title': 'Delegation Playground' }

Ready Flow you can download from here.

PERFECT! Now you can click Flow button, provide ANY SharePoint Site URL you have access to and the defined list will be created there. Is that everything? OF COURSE NOT! A list with the default settings contains only built-in fields which won’t be enough in 99% cases. So now we should add some fields…but this part I’ll cover next week 🙂

Stay tuned!

Delegation Learning App

For last few weeks I was preparing a special app for all my readers. And today it has been finally finished. The Delegation Playground App is ready for you to be downloaded! What this app is all about?

Short brief

In january and february I was struggling with delegation in my PowerApps. I’ve noticed that it was not only problem for me – many people have it as well. Interesting part is that was not because of poor documentation – the official PowerApps documentation is really done well (I was a SharePoint On-Premise developer, I know what I’m talking about). Anyway – after reading documentation, few blogs and resolving all delegation warning in my PowerApps apps, I decided to gather all my knowledge in my own article: How to overcome 500 items limit in PowerApps. For my surprise it was very warmly welcomed by community and is the most read article in my blog

And even more than that – it is the most popular in the internet. I perceive that as a effect of giving true value to people learning and developing PowerApps. Every content author cannot imagine better price for helping others.

Learn by doing

There is a saying that says: “To write a code one must write a code” which means that if you want to do something well you must practice it. There is no way around. There is no shortcut and no book that will give you more than you can achieve by trying, making mistakes, fixing and finishing your job.

That’s why I’ve decided to create an app Delegation Playground App.

Using this app you can play with delegation and check how it behaves in scenarios like static assets, excel from onedrive and sharepoint online list.

And of course all resources are in the zip package so you won’t need to prepare anything.

Download Delegation Playground App, import it and bring learning to a higher level.

Have a great delegation time 🙂

Multiple RSS feeds to LinkedIn using Flow

In this blog post I’ll show you how you can build your own Microsoft Flow that is triggered by RSS feed and then re-post it to your social media channels eg. LinkedIn, Twitter or Facebook. I’ll give you example scenarios as well as show how you can aggregate multiple RSS feeds and handle them using Microsoft Flow.

Oh, and I also share my flows – download them, import and use them 🙂

Keep updated

Today, it is not enough to be good at something. To be an expert in technology, to sell services / products or to be an influencer (vloger, blogger, podcaster) one should constantly observe changes in the area subject he specializes in. And here comes the challenge – we have a lot of sources on the Internet (news sites, blogs, internet forums, facebook groups, twitter etc) that create information content. Some of them, especially the most official ones (eg the official PowerApps blog), create content at irregular intervals. So in order to be up to date you can:

  • Check manually every day using a web browser if the new content appeared on the site. However, this solution is not very scalable (at 10 sources it starts to be uncomfortable. At 30 we start to think about the meaning of life).
  • Use tools such as Feedly, which observe the latest content using a special summary page with the latest information, the so-called RSS. Today, RSS has the majority of blogs, forums and information services. However, such a solution still requires that we regularly check the selected tool in search of new content.

But if it could be more…

“Keep updated” automated

I love automation. I really do. Automation free my brain memory and processing units so I can focus on more important things. It’s like setting up the alarm instead of constantly checking “what time is now?”.

Some examples of how a one can automate being update:

  1. When a new post appeared on Microsoft Flow blog add me a task to my Todoist (or any other task organizer). BUT! If the new post has been published after 12 PM add the task for tomorrow (so I can keep myself well organized).
  2. When a new app appeared in Power Users PowerApps Gallery reshared in on my LinkedIn

Create RSS feed to LinkedIn Flow

Using Microsoft Flow it’s very easy to do.

3 steps:

  1. In Microsoft Flow portal go to templates and search for RSS (and LinkedIn in my case)
  2. Hit “Create Flow”.
  3. Provide RSS URL

Done.

Want to do it from scratch? No problem.

3 steps:

  1. Add a new Automated Flow and use the RSS trigger
  2. Provide RSS URL
  3. Add LinkedIn (V2) action and fill up the fields

RSS feed connector

The heart of the Flow is the RSS connector. It contains multiple fields which you can use in further Flow actions. The list of all fields is displayed below:

If you’re curious how the example RSS trigger data would be look like check code below – it contains everything I received in the Flow once my previous article has been published:

{
  "id": "https://michalguzowski.pl/?p=1544",
  "title": "5 steps that increased Office365 adoption",
  "primaryLink": "https://michalguzowski.pl/5-steps-that-increased-office365-adoption/",
  "links": [
    "https://michalguzowski.pl/5-steps-that-increased-office365-adoption/"
  ],
  "updatedOn": "0001-01-01 00:00:00Z",
  "publishDate": "2019-07-05 16:42:42Z",
  "summary": "<p>Implementation of the Office365 environment in an organization is a complex process. It is not enough to create a company account in Office365, buy subscriptions, add users and connect the organization’s domain. You also have to take care of the transfer of company resources, as well as transfer the solutions used in the organization (or … <a href=\"https://michalguzowski.pl/5-steps-that-increased-office365-adoption/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> \"5 steps that increased Office365 adoption\"</span></a></p>\n<p>The post <a rel=\"nofollow\" href=\"https://michalguzowski.pl/5-steps-that-increased-office365-adoption/\">5 steps that increased Office365 adoption</a> appeared first on <a rel=\"nofollow\" href=\"https://michalguzowski.pl\">Michał Guzowski Consulting</a>.</p>\n",
  "copyright": "",
  "categories": [
    "Flow",
    "In english",
    "IT",
    "Microsoft",
    "PowerApps",
    "SharePoint Online",
    "Teams"
  ]
}

Multiple RSS triggers

Once you’ll use RSS trigger you’ll notice that it allows only to put one and only one RSS URL. What to do if you have 3 or 10 RSS feeds to follow? Is there a way to subscribe to multiple RSS feeds using Microsoft Flow?

Answer: yes there is but instead of using simple action or action configuration you need to use a bit of architecture pattern of your whole Flow solution. For reference and instruction please check my video below:

#ProTip: it’s good idea to pass an extra information from a RSS triggered Flow to your Aggregator Flow with the name of the origin Flow. When something goes wrong this field shortcut the time of inspecting the communication flow (which flow send the specific data to aggregator).

And that’s it – hope you find this post helpful. If you have any question feel free to leave a comment below or DM on my twitter account.

P.S.

Thanks to Brad Sams for an inspiration of this post

5 steps that increased Office365 adoption

Implementation of the Office365 environment in an organization is a complex process. It is not enough to create a company account in Office365, buy subscriptions, add users and connect the organization’s domain. You also have to take care of the transfer of company resources, as well as transfer the solutions used in the organization (or take care of their integration) – that is, make the so-called migration. However, it does not guarantee the success of Office365 implementation. In order for the entire operation to be successful, it should be persuaded to change people in the organization. In this article, I will present 5 steps that will increase your chance for effective adoption.

Disclaimer: The steps have been written as a retrospection of the cooperation with one of my clients. Each company is different and requires an individual approach. I encourage you to make an conscious decision which of following steps will be useful to you.

Step 1: Discover the product you bought

Office365 is much more than Outlook, Word, Excel and PowerPoint. Even if we add OneDrive, SharePoint Online, Microsoft Flow and PowerApps to this list, there are still many left! And using only platforms mentioned above, you can achieve a lot (examples can be found here). So what is the total number of platforms/applications in Office365? A very successful combination was made by the jump365.com team:

Be sure to try the interactive version! https://app.jumpto365.com/

It is worth remembering that each of the products has a huge range of its own functionalities and various configurations that allow you to cover countless scenarios.

Finally, the maximum use of the built-in capabilities of Office365 seems to not have a limit – Microsoft constantly improves its products and adds new opportunities, so the answer to the question “to build yourself or to wait a while” is not obvious at all . I.e. recently appeared the possibility of integrating the Common Data Service with Outlook, which is another argument to use the CDS database as a data container instead of SQL or SharePoint.

Tip # 1: Make sure you have used the maximum of Office365 built-in features before you approach the development of custom solutions

Step 2: Keep it Simple and Straightforward

We, consultants, know that everything can be achieved in various ways. For example, sharing the file can be done from the level of SharePoint, OneDrive application, synchronized folder on the computer, Teams etc. For many people a lot of options are freedom of choice and high integration. But for many, it’s chaos (“so you mean…again…how many ways can I do it?”), lack of coherence (“why sometimes you share file using browser and sometimes directly from a folder on your computer?”) And this makes them want to return to “the safe places “: the old habits and methods they used to use so far – those that were simple, transparent and consistent.

That’s why:

  1. Choose the best and the only right way to proceed. At least at the beginning of implementation. For example, to share a file with people outside the organization, you must first synchronize the OneDrive folder on your computer. Period.
  2. Create instructions for the most key scenarios. For us, these were:
    • Document scanning (using the mobile application)
    • Synchronize all team files on your computer
    • Providing a file to a person outside the organization
    • Submitting the attachments from the email to the channel in the team
    • Planning a meeting with the Teams conference
  3. The statement can not be based on an action that has not been described. For example, if you need to synchronize a folder on your computer at some point, remember to create an instruction to set up such a synchronization

Tip # 2: Choose the best and only right course of action. Clearly communicate it in the organization.

Step 3: Segmentation of users

The language of the needs is important (see the next paragraph), but if the organization is of medium size (more than 50 people) or more, it is impossible to talk to each employee. So one should approach the topic methodically.

  • group employees according to the areas they deal with, for example: finance, processes, IT
  • identify “key people”, ie people who have a high impact on others and / or decision-making and have resistance to implementing new solutions
  • identify “influencers” or people who will be promoters of change. They will help others adapt the change not only out of a sense of duty, but they will also realistically see the benefits of the upcoming changes. Important: try as hard as possible to not force people to take this role! They should be natural, not controlled and managed.

Step 4: Learn the language of needs

Users themselves will not start using ready-made tools. Even if the company thinks otherwise, for some employees, “excel on the local computer is enough”. The reason is simple – tools are just tools. They are there to meet needs. So in order to implement tools effectively:

  1. Understand the needs of users: get to know the context of their work. See what difficulties are currently. Understand why new solutions would not help them (if they say so)
  2. Express your needs: explain to users the needs for which change is being implemented (see scenario 1)
  3. Speak the language of the users’ needs: show them what benefits they will get thanks to the change. How this change will affect their work (see scenario 1)
  4. think out-of-the-box: declaring the user that something can not be done is not testimony. Because what the user actually says is “it can not be done differently for the adopted assumptions, limitations and understanding of the whole process”. He built a wall around his process. Your task is to move every brick of this wall and remove one after another until the wall collapses. It is important that it involves the process itself (that is, the business would continue its goal). (see scenario 2)

Scenario 1 (real life example)

  • [User] “Using OneDrive is pointless, I already have all the files on my disk and when I need it, I send them to other people by email. Why should we move all the files to another place?”
  • [Consultant] “We want to limit the e-mails we send in the organization, and we also want to archive all documents and maintain version history.”
  • [User] “Nothing is lost in emails, but I understand. I will send messages less frequently”
  • [Consultant] “Hm, and remember how much time it takes you to find the last version of the document in email messages. And imagine that you work on the document for 3 days and it was supposed to be sent in an email, but suddenly the computer broke down and you are not able to recover your 3-day job … “
  • [User] “Eh … I understand … maybe it’s actually better. But I have all the shortcuts on the desktop, how do we transfer the files, where are they going to be?” [here was the real reason for the resistance]
  • [Consultant] “Do not worry, we’ll do all the files will be available from your computer and all desktop shortcuts will work. Only the place where these files will be stored will change.”
  • [User] “super!”

Scenario 2 (real life example)

  • [Accountant] “We can not digitize the invoice circulation, because every invoice requires a president’s stamp, unless it is possible to attach a picture of such a stamp … but this is only an additional step in the whole process.
  • [Consultant] “Why is this stuff?”
  • [Accountant] “For the accounting department to know that the president read and accepted the invoice”
  • [Consultant] “And the invoice with the stamp stays later inside the company only?”
  • [Accountant] “Yes”
  • [Consultant] “And if the president came and said:” I read and accept it”, that would be enough?
  • [Accountant] “Yes”
  • [Consultant] “So you use stamps, because it’s faster than personal confirmation and also faster than writing an email. If it was just as simple as: The president gets a notification on the phone and only clicks “accepts” or “reject” and all further communication takes place automatically?
  • [Accountant] “Hm …. well … all in all it could be so …”

Bingo! 🙂

Tip # 3: Challenge “because we work like this”. Inquire. Be inquisitive. 5x Why.

Tip # 4: To learn about the needs of users, conduct a training / workshop with them. At the beginning for the groups of users and later on carry out ad hoc consultations 1 : 1.

Step 5: Make small step at a time

When you enter a lot of new tools, some users may be scared of the number of changes. They will feel lost and will return to the old known processes in which they felt comfortable. Therefore, add new tools and improvements slowly, one by one. If possible, do not multiply new applications. Integrate everything in one place. A good idea is, for example, to start with communication through Teams and define teams there. Then incrementally build a daily work process around Teams. Then talk to the identified employees / employee segments and slowly move the subsequent processes.

Tip # 5: Keep yourself updated – Office365 is constantly evolving.

10 tips I wish to know before I’ve started with PowerApps

When you’re doing something for the first time there is always the same feeling of chaos. So many new things, uncountable number of topics to learn, mechanisms and concepts that are similar to nothing. How to know it all? Where to start? Of course, from one side, when it comes to IT, every software has its documentation (and in case of PowerApps it’s truly well written). However from the others side…show me at least ONE person who have read the whole documentation before started with something (programming, using tools, develop new app in PowerApps) :). Of course there is none – otherwise people like me, consultants & trainers, won’t have much to do. That’s why I’ve created below a list of 10 tips I wish to know before I’ve started with PowerApps.

Image result for heroes of might and magic 3 war fog
When you do something for the first time you feel like a hero in my favorite game from the childhood – HoM&M3. You see gems & crystal, mines and powerful artifacts (that was the promise) but you don’t know how to get them. The fog of war covers the paths. You have to find it by discovering unknown areas. Most of the time you just travel, searching and trying. From time to time you fight an imp or zombie and finally (but rarely in comparison to other activities) you pick your dreamed artifact.

Learning PowerApps

If you read the image description above you probably see a lot of similarities to learning anything. Let’s take PowerApps for example. You want to build an app, create a solution to support your process or build that powerful customized SharePoint list form. For the most of the time you try different approaches, different controls and just discover new functionalities of the platform. From time to time you need to solve an error or warning (eg. my favorite one: delegation) and rarely (in comparison to other activities) you’re completing your dreamed app. And that’s ok – you’re learning. You need to get an experience. Is there a way to increase the effectiveness of your learning path? Yes there is. Follow me 🙂

Minimal effort to maximum effect

To shorten your launch with powerapps I’ve noted down 10 things I wish to know earlier – on the beginning of my PowerApps adventure. Treat them as my footprints you can follow to get your “artifact” quicker.

1. Templates

In PowerApps portal when you go to “Create” page you’ll see bunch of tiles. First three are for creating your app but all the others (28 tiles) are ready-made applications. They presents final solution to a specific requirement (Help Desk, Budget Tracker, Leave Request etc). By clicking on them you’ll add them to your environment and be able to use them. But that’s not all! You can edit them and see how they’re were built! It’s an awesome opportunity to investigate the app structure, logic, used controls and functions to learn the PowerApps. Moreover you can copy app parts and paste into your solution – why not!

Play, test & analyse at least 1 of them.

Tip #1: If you’re beginning with PowerApps focus on templates with the “Canvas app” label

Tip #2: There are two app templates you can’t miss: PowerApps Training and PowerApps Training for Office. A must for everyone who wants to know PowerApps better.

2 . Controls & Properties

There are many controls you can use in your app. Text input, Slider or Timer are just few examples. Use them to interact with a user on multiple ways: display information, gather some data or even record video or take a picture. All controls are under the “Insert” ribbon tab and grouped in categories (Text, Controls, Media etc). Take 10 minutes to discover all the controls in PowerApps. In most cases reading control label is enough to get the general context of it. However take in mind some controls are more complex (eg. gallery or forms).

Another great things about controls are their properties that are for customization. Want this label text to be red? No problem! You don’t like those rounded corners of a button? Sure thing, I don’t like it neither. Properties extends capabilities of the controls. Thank to them you can use a control in multiple ways and in different contexts.

Tip #3: Hardly abused controls are: label, text input, icons, button, gallery, forms. Starts with them. Almost any application needs them.

Tip #4: Check the Advanced tab from the properties pane (the above image). It contains much more properties than Properties tab.

3. Functions

Interaction with a user is one thing but what will happen if a user click this button? And how to show error message once user forget about providing required data? You won’t do much without a logic in your app. And that’s what PowerApps functions are for. Controls, properties and functions are PowerApps bread and butter. Without knowing them you’ll be like a kid in the dark.

There are 155 functions and they are fully described here. In documentation each function description contains a note what it does, when to use it, required arguments and some usage examples. And to be honest probably never use all of them. But below list is really worth of those 30 minutes to check them in documentation.

Tip #5: Some functions are unknown even to those who builds PowerApps professionally. They waste a ton of time to make workarounds for I’m solving in a minute. Some of those functions: User, Param, Language, HashTags,ColorFade, PlainText. Make sure you know them 🙂

4. Connectors

True power of PowerApps (and PowerPlatform generally speaking) lays not in the platform itself but in the integration with other platforms. Thanks to that your app can use the capabilities of another service. I like to think about integration as “borrow the power of other service” in a way. PowerApps contains over 230 connectors to different (! not only Microsoft) services.

You can find list of all connectors here.

From that list few connectors deserve for special attention because of their flexibility and how they greatly improve PowerPlatform extendibility:

  • Office 365 Users
  • Power BI
  • HTTP with Azure AD
  • HTTP / HTTP Request (available as an action/trigger via Flow)

Tip #6: You want to integrate your own service? Check out Custom Connectors

5. Store data in the right place

Ok, before I’ll say anything more I have to announce one really important thing.

Generally speaking. Ok to store simple tabels. Perfect to store documents. But for storing tabels with relationships model? Absolutely not!

Side note: why some people pick Blob Storage over SharePoint? Versioning, Permissions model, Sharing capabilities, Integration with Teams and Onedrive – SharePoint has it all!

Uf, I’m good now.

So when it comes to storing data there are few places you can do it: OneDrive (Excel), SharePoint and common database (CDS, SQL). First two are a common pick for PowerApps adepts and after some time they always search for help. Because neither excel nor SharePoint are not relational database. But CDS and SQL are! And from my perspective, after last updates, CDS is the first pick when it comes to PowerApps solutions. I won’t dive into my approach details in this post but I’ll definitely cover that in the nearest future. CDS made huge progress and is safe and trustworthy relational database.

Tip #7: Files? SharePoint. Relational database? CDS.

6. Delegation

When it comes to data source connection there will be a moment in time when you’ll see below warning.

But don’t worry! It’s the delegation thing. The delegation mechanism is well described in the documentation. However sometimes delegation is not a solution. If you’ll get to such point read my post: https://michalguzowski.pl/500 . I’ve described 4 workarounds for the 500 limitation (whereas delegation is only 1 of them) + 2 extra my own methods which you won’t find in the Microsoft official resources 😉

7. Turn on Advanced Settings

If you want to build your apps more efficiently and faster there are few options hidden from you by default(!). But as a app maker you can easily turn them on.

Go to File -> App Settings -> Advanced settings

There are awesome functionalities that will boost your productivity. 2 examples:

Components

It’s a group of controls that you can reuse across screen and apps! It’s like you build your own control! Example:

If you want to read more about how to build components and my best practices, patterns and tricks check this blog post.

Formula bar result view

Normally there is no way to see what your filter function will actually return in result unless you display the data using some control (eg. gallery). However turning on “Enable formula bar result view” allows you to see first few results right in your formula bar. Like this:

8. Extra content

The old saying says: “Don’t reinvent the wheel”. When you start with something it’s impossible to always avoid this mistake of reinventing the wheel. Because finding out what has been already made is actually a part of the learning process, right? Sometimes you’ll read about it in documentation, sometimes you’ll see it in one of the PowerApps templates and sometimes you read about in a blog post. That’s why I’ve put this part here 🙂

  1. 10 Reusable Components: tab control, calendar, dialog box, map control and more
  2. Experimental tools from Microsoft: PowerApps Review Tool, Theme Editor, App Merger, Phone to Tablet Layout Converter
  3. Templates from PowerApps portal are not enough? Then go to PowerUsers Community Gallery for more.

9. Community

Remember those times when a 3 hours task already taken 6 hours and you’re not even in the middle of it? That’s the moment when your time management (plan control, reality observations, taking action based on measurements) is crucial but what’s even more important is…your self-control. Quit the berserker mode. Stop the “ohhh…I’ve already spent so much time on this task that now I HAVE TO finish it”.

Follow below:

  1. Your app/task is estimated to be done in X hours
  2. Make a checkpoint every 1/4 * X
  3. Define what you want to have on the particular checkpoint.
  4. If there is “expectations vs reality mismatch” -> ask for help. PowerApps Community & #PowerAddicts are here for you.

Protip #8: don’t be obsessive, know when to quit. Ask for help earlier

10. Practice practice practice

This is universal but very true sentence: “To make apps you have to make apps”. In other means no knowledge gives you as much expertise as practice. If you want to make great apps there is no other way than just make 100 of them.

Every 100 starts with 1.

Task for today: make a simple app.

Eg. with a button that sends you an email on click. But make it so good you could use it in the future. Eg. email can be send to your family member with a random message:

  • “Will be late – traffic today is horrible”
  • “Sorry for late, had some bugs in one of my projects but I’m close to fix them. Need ~30 minutes more. Love you!”
  • “My client asked me to help him in emergency case: they have some problems on production environment! Will be in 2 hours :(”
  • Can’t find the keys – did you see them?

Was it helpful? Or maybe you think I’ve missed anything?

LET ME KNOW IN THE COMMENTS! 🙂