Debugging Office Dev PnP Powershell

As you know the Office Dev PnP is always improved by many contributors. The latest code and setup is available on git. But sometimes you are receiving unexpected errors and dont know what is going wrong. In this situation you would like to investigate this issue. It is possible to debug the Office Dev PnP Powershell. See here below a tutorial how to do this in Visual Studio. read more…

Building PowerApps using data from a Custom Connector

PowerApps (and Flow Buttons) have the possibility to use the GPS device on you phone or tablet to access your current location. This is quite nice, because it gives you the possibility to log your location. But coordinates are just numbers, Longitude and Latitude, and sometimes you would like to log a “meaningfull” location based on your coordinates. We can use the Google Places webservice to find known places within your proximity. 

In Flow you could access the service directly by using Actions, but PowerApps do not have that possibility by default, so we will be needing a Custom Connector. I would also like to show you how you can trigger the custom connector from within your PowerApp and use the data that is returned.

Google Places – OpenAPI

Creating a Custom Connector is actually pretty simple if you have the correct description of the service you are going to connect to. We are going to use the OpenAPI specifications to create this description of the Google Places webservice.

Consuming the Google Places webservice

Using the Google Places API is free. There is a Premium plan, but we do not need this for our application.

First you will need to create a Google Places API key, this key is needed to authenticate against the API. You will need a google account for this. Just browse to the Google Places API site (https://developers.google.com/places/web-service/get-api-key) and press the  button.

Now we are able to consume the service. The Google Places service uses the following format:

The first part https://maps.googleapis.com/maps/api/place/nearbysearch/ will always be the same. The output need to be replaces with either json or xml. We will use json, because we want the service to return a response in json format.

The parameters we are going to use are the minimal required parameters:

  • key – this is the application’s API key you generated
  • location – this is the location specified as “latitude,longitude”
  • radius – this is the distance in meters within which to return results

There are a lot more possibilities you could explore depending on the application you are building. These can be found on the Google Places webservice developers guide: https://developers.google.com/places/web-service/search

To test the service in our browser, replace the <APIKey> text with your API key:


Check out the result, it should be a json file showing the locations that are known to google within 50 meters from the geometrical location 52.0314208,5.1004413. (and Portiva should be in there somewhere 😉 )

Generating the OpenAPI specification

We now have a working Google Places webservice URL. We are going to use this URL to generate a OpenAPI specification for the service. Fortunately we can get help doing this by using the OpenAPI generator from http://specgen.apistudio.io.

The steps are pretty easy, I will only go through the steps where you will probably change something:

First paste the URL we used to test the service in the browser in OpenAPI generator. We will need to use a GET operation.

Now click Next step until you reach API info. Change the Operation Id and Summary to your liking. These are the operations names you will be using in the Custom Connector.

Click Next Step until you reach Open API Spec look a the generated json file. You can download the spec to use it to create a Custom Connector.


There is a small problem with generating the OpenAPI spec file. The format is not always correct, so may you will need to edit the file after generating is. In my case it was missing some “type” definitions. I included a working OpenAPI specification for Google Places which you can use. If you compare the included specification with the generated one you will notice the differences.

Creating the Custom Connector

Now that we have the OpenAPI spec we can start creating the Custom Connector. Let’s walk through the steps.

Browse to https://web.powerapps.com and login with you credentials. On the left select Custom Connectors.

In the top right of the screen click on Create custom connector and choose Import an OpenAPI file.

Give your connector a name and choose the OpenAPI file included in this blog (or the one you created).

If the import is successful we can walk through the steps to do some configuration. You can leave the defaults on the General page, so click on Continue in the bottom of the page.

The second page is the Security page. We will be using a API key in the query string. For services requiring other types of authentication you can also choose: Username/Password or OAuth 2.0.

Now click on Continue to go to the Definition page. Make Shure the fields Summary, Description and Operation ID  are filled in.

Scroll down until you reach the Request settings. You can delete the key parameter here because we defined this in the security tab.

The connector is now ready to be created by clicking on Create connector.

Using the Custom Connector

Now that we have created a Custom Connector we will want to use it. It is actually quite simple and by using available connectors and services you can build really powerfull apps. I will not go into to much detail in how PowerApps work in this blog. I will demonstrate a simple way to use this connector within your PowerApps. I will leave it to your imagination how to apply this in your situation. A little bit of PowerApps experience could help, but you should be able to follow the steps without experience.

We still have our PowerApps environment opened in the browser. On the left choose App and in the top right click on Create an app.

We will start with a blank App in Phone layout.

First let’s put some controls on the screen. In the Ribbon select Insert and Button.

Give the button a text to your liking and move it to the bottom of the screen.

On the Insert tab in the Ribbon choose Gallery and select Blank vertical. This control will show the places we are going to retrieve in a list.

Resize the gallery control to almost fill up the screen.

To check if we are getting locations from the GPS device we will add a Label control below the Gallery control.On the Insert tab in the Ribbon select Label. Move the label to a position between the gallery control and the button.

We are now going to retrieve the location from the GPS device and display it in the Label control.

Select the Label control and in the formula bar type the following formula:

Substitute(Text(Location.Latitude),”,”,”.”) & “,” & Substitute(Text(Location.Longitude),”,”,”.”)

Let’s explain what we are doing here: The location need to be in the “Latitude,Longitude” format. As I am located in the Netherlands the coordinates will be formatted as “50,123456”. Notice the comma! The webservice expects a dot in that location. The way decimals are divided defers based on location.

The formulas: Location.Latitude and Location.Longitude will get you the GPS coordinates of your device at that moment. With the Substitute function the “,”  will be replaced by a “.”. With the & operator we will create a string with the latitude and longitude as expected by the Google Places webservice: <latitude>,<longitude>.

It should now look like this:

Creating a new Data Source connection

We will want to retrieve the places and put the result in a variable which we can bind to the gallery control. First we will need to create a connection to our Google Places custom connector.

Click on View in the Ribbon and select Data sources.

A panel with all possible connections opens. Scroll the list of connectors until you will find your custom connector. Select the connector. You will be prompted for your Google Places API key. Paste it in the textbox and click Create. The connector will be added.

Query the Google Places webservice

We now have the controls in place and we have a connection to query the Google Places webservice. Let’s put the logic in the button to query the Google Places webservice and display the results in the Gallery control

Select the Button control and checkout the formula bar.

Make Shure the OnSelect property is selected. By default this will be set to false, which means it will do… nothing. Using a connection to a datasource is easy in PowerApps, let’s look at the command we will use.

We want to store the results in a context variable called places. To create and/or update a context variable we use the function UpdateContext({<variable_name>: <value>}).

The function GooglePlacesapi.GetPlaces(<location>, <radius>) initiates the connection to the Custom Connector to retrieve values from Google Places. Be aware that the function GooglePlacesapi might be different in your situation. 

Because we only want do use the results part from the json response from the webservice we will append .result to the function call.

Now the last thing we need to do is to bind the places variable to the gallery control and to make Shure each item in the gallery control shows the name of the Place.

Select the Gallery control. Now in the properties panel on the right select the Advanced tab. In the Data section under Items type in the variable name places. This will bind the variable wich will contain all result from the service to the Gallery control.

In the Data panel select a Layout. In this case I have chosen the layout that only shows a Title. We will want to bind the name property from the results to the Title.

If everything went as expected you should now be able to run the application by clicking the Preview app button or pressing <F5>.

Click on the Get Places button and checkout the result. In my case it show places within proximity of the Portiva main office. It also show the coordinates of the location where I am. If you do not see coordinates this may be because your computer does not allow it to share the location, you could build in some formula to use a fixed location if no location is available.

Save and publish the App

To test your app on you mobile device click on File -> Save and then Publish the app.

Start your PowerApps app on your device and login with your credentials. Your app should be available now… run it and test it 😊.

Showing more information in the Gallery control

The webservice return more information than the name of the place. Currenty PowerApps also has the possibility in preview to view the contents of variables. To do this click on File -> Variables and Click on the little table icon.

Click on the table icon and you will see all columns available.

By changing the layout of the gallery control you can show more information about a place.

This is just a little demonstration of how you can use Custom Connections within PowerApps. PowerApps are very powerful and the way you can use external services with them opens up a huge amount of possibilities.



Notities digitaliseren

Een aantekenboekje met afscheurbare blaadjes… oftewel een notitieblok. Veel mensen zijn er nog erg aan gehecht en ik was dat tot voorkort ook nog. Het notitieboekje, in mijn geval, was alles. Nog te doen voor de diverse klanten, aantekeningen tijdens vergaderingen en andere sessies, brainstormen, lay-outs schetsen ter illustratie voor de klant. Daarna gingen de belangrijkste zaken de digitale wereld in en andere zaken werden nog steeds vanuit het boekje geregeld. Als ik dat boekje dan vergat, was ik erg onthand, daarnaast kostte het digitaliseren van die zaken toch weer extra tijd en had ik een hoop plekken waar ik mijn informatie moest opzoeken. Laat staan de opmerkingen om mij heen; ‘je bent toch een IT-er?! Wat heb jij bij je?!’. Maar dat gevoel van taken afstrepen gaf altijd voldoening.

Met de komst van de cloud, de mobiele devices en dus altijd en overal toegang tot informatie heb ik beetje bij beetje het notitieboekje aan de kant geschoven. Al geef ik eerlijk toe dat een papier en pen af en toe nog zeker in mijn tas terug te vinden zijn. Mijn digitale vervanger voor mijn notitieblok is Microsoft OneNote geworden. En via deze weg laat ik je graag de punten zien die ik zo ideaal vind aan OneNote. read more…

K2: SQL FMTONLY problemen met stored procedures

Ik hoor je denken: een blogpost over K2 en SQL? Nou, een beetje kennis van SQL, want daar gaat het deze keer vooral over, is nooit weg voor een SharePoint consultant.



In een K2 project, waarbij ik ook als databasebeheerder betrokken was, liepen we tegen het volgende aan. Zoals je misschien weet, is K2 Blackpearl een workflow pakket die informatie vanuit SharePoint kan gebruiken op formulieren en in workflowtaken. Echter, je kunt ook informatie ophalen uit andere systemen, SharePoint is, in tegenstelling tot bijvoorbeeld Nintex, slechts één van de informatiebronnen van het pakket. Binnen het project waar ik bij betrokken was, gebruikte de klant geen SharePoint en werd voor alle informatie een, door ons zelf ontworpen, SQL database gebruikt. K2 werkt nooit rechtstreeks op een databron, maar gebruikt een soort tussenlaag, de Smart Objects, die bestaan uit de definitie van elke methode van elke table, view en stored procedure die in de database aanwezig is. Je gebruikt bijvoorbeeld de list methode om een overzicht van klanten op een formulier te tonen en vervolgens gebruik je de update methode om de gegevens van één klant bij te werken. So far, so good.



Het wordt lastiger als je een stored procedure gebruikt die met temporary tables werkt, of een pivot toepast. Beide zijn hele handige mogelijkheden om bijvoorbeeld meerdere resultaten samen te voegen of om een draaitabel te maken. Het nadeel is dat uit de code van je stored procedure niet duidelijk is, tenminste voor K2 niet, uit welke kolommen je result bestaat. Het gevolg is, dat het Smart Object niet weet uit welke kolommen hij moet bestaan en daarom leeg blijft. Op die manier kun je niet die handige, maar complexe, stored procedure gebruiken in je oplossing.


read more…

Cloud Journaal – aflevering 27

Allereerst de beste wensen voor 2018 aan alle kijkers van mijn Cloud Journaal! Het is weer de eerste donderdag van de maand en dus tijd voor een nieuwe aflevering. In deze aflevering de volgende onderwerpen:

– Bing Image Search voor afbeeldingen zoeken in moderne SharePoint pagina’s (2:02)
– Nieuwe web parts voor moderne SharePoint pagina’s (4:37): Bestandsvoorbeeld, Gemarkeerde inhoud, Personen, Microsoft Forms, Opvulling & scheidingslijn
– SharePoint lijstformulieren aanpassen in PowerApps (10:25)

Bekijk aflevering 27 hier:

Bron: eekels.net/cloud-journaal-aflevering-27/

Possibilities of Delve within organizations

Firstly this blog will provide a short summary on the workings of Delve and will then cover the connection between machine learning and Delve. Finally, this blog will present ways in how Delve can support networks in organizations. In doing so, this blog will cover the current and future possibilities of Delve within organizations.

What is Delve?

Delve helps in providing a new way to gather information. But what exactly is Delve and what role does it play within organizations?

Delve can be described as:

“a new way to discover relevant information and connections from across your work life. Delve displays information that is most relevant for each person based on the work they are doing and the people with whom they are engaging.  With Delve, information finds you versus you having to find information”[1]

This novel way to gather information is different from finding (clicking) your way through an array of databases. Delve instead finds its information from OneDrive for Business, SharePoint, Video content, Yammer and email attachments[2]. Delve provides this information by applying machine learning to content and interactions within the Office 365 environment. Delve hereby helps in the discovery of content that is shared with you, related to you or is otherwise relevant to you[3] read more…

Is PowerApps een waardige opvolger van InfoPath?

Recent kreeg ik bij een klant de vraag waarom zijn formulier niet goed meer werkte. Na een blik op het formulier geworpen te hebben, bleek dit een InfoPath formulier te zijn. Omdat ik dit formulier niet gebouwd had, was er enige tijd nodig om het formulier goed te begrijpen. Zo trof ik bijvoorbeeld 290 kolommen aan in 1 bibliotheek, waarop 4 type formulieren draaide. Het bleek dat er zo nog een aantal van dit soort formulieren te vinden waren in dezelfde site. Ik moet toegeven de formulieren zagen er wel gelikt uit. Maar om als “new-bie” in de omgeving, iemand anders zijn bouwmerk te ontrafelen is lastig. Zeker als je minder ervaren bent met InfoPath. Voor de duidelijkheid het ging hier om een SharePoint 2013 On-premises omgeving. Omdat Microsoft gaat stoppen met de ondersteuning van InfoPath (2023), Microsoft sinds 2012 al niets meer aan InfoPath heeft doorontwikkeld, de betrouwbaarheid niet heel hoog is en er geen duidelijke documentatie aanwezig is, heb ik voorgesteld om formulieren op te bouwen met standaard SharePoint formulieren.

PowerApps als opvolger voor InfoPath formulieren

Veel opties van de InfoPath formulieren kun je oplossen met standaard SharePoint functionaliteit. Maar als het aankomt op styling of geavanceerdere opties, voldoen de standaardformulieren vaak niet voldoende. Dit is jammer, zeker als je bedenkt wat er bijvoorbeeld in SharePoint Online mogelijk wordt met PowerApps. Onlangs heeft Microsoft op Ignite (oktober 2017) aangekondigd dat zij de PowerApps gaan integreren in SharePoint lijsten en bibliotheken. Helaas geldt dit niet voor SharePoint 2013.

PowerApps konden al gegevens uit SharePoint lijsten gebruiken, maar Microsoft gaat ook de mogelijkheid bieden om de formulieren uit PowerApps in SharePoint te tonen. Waarmee ze zelf een waardige opvolger voor InfoPath formulier gecreëerd hebben. En als je het mij vraagt heeft PowerApps nog een heel aantal voordelen. Zo kun je ze o.a. ook makkelijk vanaf een mobiel apparaat benaderen, zijn ze eenvoudiger te maken dan InfoPath formulieren en zijn ze stabieler. Mijn collega Jeroen Trommel heeft over PowerApps al eerder een blog over geschreven. Het grote verschil met toen is, PowerApps is “general available“ en heeft inmiddels nog meer connecties gekregen. read more…

Cloud Journaal – aflevering 26

Vanmorgen is aflevering 26 van mijn Cloud Journaal gepubliceerd op YouTube. In deze aflevering de volgende onderwerpen:

– Microsoft Teams rapportages beschikbaar in het Admin Center (2:18)
– Meer dan 270 bestandstypen bekijken in SharePoint (4:24)
– Bestanden delen met externen via one-time-password (5:48)
– Kolommen opmaken in moderne lijsten (8:30)

Bekijk aflevering 26 hier:

Bron: eekels.net/cloud-journaal-aflevering-26/

Waar blijft het Employee-Centric intranet

Ons dagelijks leven wordt tegenwoordig beïnvloed door allerhande app’s gebaseerd op een klantprofiel. Dit klantprofiel zorgt bijvoorbeeld voor de nieuwste restauranttips, faciliteert het bestelproces voor de aankomende Sinterklaas of regelt de vliegreis. Helaas blijft onze digitale werkomgeving op dit gebied achter. De klantgerichtheid bevindt zich nog steeds in de jaren 90: de organisatie stuurt zonder echt rekening te houden met onze klantwensen.

Graag illustreer ik dit met een voorbeeld. Recentelijk was ik in verband met projectwerkzaamheden in Liechtenstein. Uiteraard moest er ook geluncht worden. Zoals gebruikelijk buiten Nederland is de lunch een warme maaltijd. Hiervoor waren drie keuzemogelijkheden beschikbaar. Deze werden bij binnenkomst van het restaurant prominent gepresenteerd, zodat de medewerker direct de menukeuze kon bepalen. Ik koos voor het vegetarische menu 2 en liep vervolgens enthousiast rechtstreeks naar het foodcourt van menu 2. Wat schetste mijn verbazing: geen dienblad, bord en bestek. Hiervoor moest ik terug naar de ingang van het restaurant, om vervolgens weer aan te sluiten in de rij bij het foodcourt van menu 2.

Logistiek gezien snap ik de gekozen indeling: liever één plek om dienbladen, borden en bestek te verzamelen in plaats van drie. Denkend vanuit de klant compleet onlogisch! De klant werd namelijk bij binnenkomst van het restaurant lekker gemaakt en geënthousiasmeerd een menukeuze te maken. Vervolgens wil je deze keuze ook direct geserveerd zien. En niet moeten nadenken over de vervolgstap in een star organisatorisch proces. read more…

Follow us on Twitter

Neem contact op

Coltbaan 4E
3439 NG Nieuwegein

+31 (0)85 - 489 1008

Meer informatie?