Creative Commons License



Azure Logic Apps: Build SharePoint Workflows by clicking buttons: a picture guide


TOC: Azure Logic Apps

  • Build SharePoint Workflows by clicking buttons [This article]
    • Introduction
    • SharePoint Online
    • Office 365
    • Connect them all
  • Hybrid Workflows - SharePoint On-Premise
  • "Code", Template Language Expression
  • Observations
  • Social
  • XML


Introduction - What are Azure Logic Apps


Microsoft announced a series of Azure App Services today:


Specifically, I want to focus on Azure Logic Apps.

In Microsoft's words.

Azure App Service is a fully managed Platform as a Service (PaaS) offering ... allow any technical user or developer to automate business process execution via an easy to use visual designer.

Best of all, Logic Apps can be combined with API apps and Connectors from our Marketplace to help solve even tricky integration scenarios with ease.


Microsoft has a tutorial on how to create Azure Logic Apps:

You should go through these first.  There are a number of new Azure templates that are wordy to describe, but a video will show how it all works together fairly quickly.

So I only want to focus on the SharePoint Online Connectors.  They are easy to set up, but actually, tricky to find.


Create the Logic App


The Workflow:

  • Grab tweets from my twitter timeline and put them into my SharePoint Online List, then email me.


Once you watched the video and we start by creating our own Azure Logic App. 



Once it's ready, head into Triggers and Actions - this is where the rules are defined.


On the right hand side you wouldn't have any API Apps in the resource group.  We'll configure them in a minute.  Click Visit the Marketplace


Configure the Office 365 Connector



There is a giant header at the top to add Office 365 Connector.  We should go ahead and add that. 

Note, in your happiness to add the Office 365 connector, you will, like me, completely fail to read "send and receive emails, calendar and contacts".  No files, or SharePoint sites.  Essentially, this connector is only for Exchange-related services.

Still useful for sending emails, so let's configure it.




You will be seeing this box a lot!


I had a look inside once it is created - there isn't much to see, or change.

You'll notice we haven't authenticate the API App - we'll do that later.


Go back to Triggers and Actions on the Logic App


  • Sometimes - the API Apps are listed by their template name and not the API App Name that you've assigned.  This is actually very confusing, I'm sure it'll be fixed soon.
  • Adding either the Office 365 Connector or the SharePoint Online Connector will also add the HTTP and Recurrence API Apps automatically.



Configure the SharePoint Online Connector

So far so good.  Let's do the next one.  And I think you'll fall into another hole.

You look at this and you say, surely.  That one is for SharePoint, since the earlier Office 365 connector isn't.




Yes, I say.  That's exactly what I want.  Those are the right triggers and actions!


And here is the next hole I fell in.

Chances are, you got all the way to the end and thought why do I need a service bus for Azure Logic App to talk to Office 365.  Something don't smell right.

I have failed to read the text again - this one is for On-Premises SharePoint, and you will need to install a listener proxy that will talk to Azure Logic Apps via an Azure Service Bus.

We'll cover that later when we talk about Hybrids.

For now, go back to the Marketplace.


Use the search filter.  There are 2 SharePoint connectors.  The SharePoint Online Connector isn't shown in the default view.



Create -> Package Settings -> OK <- Create



While you wait for the API App to be created, your Startboard is currently looking like a mess.  Right click on the other connectors and unpin from Startboard.


Add the Twitter Connector

This is in the video above.  So I'll jump through this one really quick.



More spinning.  All done!  OK now we have all our connectors.  Let's look at them.





I want to show the various different triggers from different connectors.  But I won't actually use these in the later example.


Office 365 Trigger looks like this.



SharePoint Online Trigger looks like this:


Twitter Trigger looks like this:



The trigger I want to use is a simple Recurrence timer.  It will run every hour.





Next, pull down some tweets.

Add Twitter Connector and Authorize


Twitter Authorize



I'm interested in my timeline.


I want to put them into SharePoint Online.


Click Authorize - you'll see a pop up


  • I want this to talk to my Office 365 Work Account - so pick the top one. 
  • Note - sometimes, it doesn't seem to work, I would close the pop up and try Authorize again.  I consider this another Preview Bug


You should see these actions to perform on the connector.  Notice it connects to two lists specified during the setup, and there doesn't seem to be a way to change that afterwards.

Pick Insert Into tasks



We'll need to loop through the tweets and insert each one.




We need to change the TweetText reference from the First tweet to Each Repeating Item tweet.


Change it from:

  • @first(body('twitterconnector')).TweetText


  • @repeatItem().TweetText



Last action is an email.  Add the Connector.


The Office365 Connector (Exchange) is the same as Office 365.



I set the body to the created date of the first tweet (in descending order, so actually the latest tweet).

  • @first(body('twitterconnector')).Created_at


The big picture:







You save and close the Triggers and Actions editor.



Thanks.  I think you forgot I had just saved...  (another preview bug)


Back on the Logic App screen, I see this:


With a Recurrence trigger I find it always run first time I save.  But if it doesn't, you can manually Run Now


The run





And the results


Here we have it.

The list, in my Tasks list on my SharePoint Online.






  • I don't know why the email is default to send with low importance.  You can change this.



Click the Pencil - not intuitive that it's clickable.  I think it should be next to the cog wheel.



And that's quite possibly the easiest Tweets to SharePoint Online List example (including set up the infrastructure) that I have ever done.



  • Created Office 365, SharePoint Online, Twitter connectors.
  • Created Azure Logic App on recurrence schedule
  • Write tweets to SharePoint List
  • Next episode, we'll look at Hybrid.  Going Cloud to/from On-Premises. 

Nintex Workflow - Modifying your Farm UDA


The Problem

I love Nintex UDA - it lets me push commonly used logic into a reusable User Defined Action.  Then lets me reuse it in multiple workflows.  What's even better, is when I update the UDA, I can choose to republish all the workflows that currently use this UDA, which updates them all too.

There are however two problems with the UDA:

  • They are scoped at Site, Site Collection or Farm levels, and they are stored with a unique UDA-ID in the Nintex workflow database.
    To share the UDA in two different Site Collections, you have to promote the UDA to the high level Farm scope.

  • Once you have promoted them to Farm level, you can no longer modify them.  Because they are managed via the Central Administration website, and WorkflowDesigner.aspx doesn't work there.


A solution


The solution I've gone with, which I hated.  Was this:

  • in our development environment, we keep the UDA in the site collection level. 
  • in our production environment, we keep the UDA in the farm level.
  • we modify in development environment via WorkflowDesigner and then we export the UDA and import them in production to override the old version.



  • Dev and Prod aren't the same configuration.
  • You always have to export and import.  You can't change a single setting in production.

I've actually done this for the last 3 years.  At one point, I was so unhappy with this I send meme pictures to the Nintex Workflow team.




A better solution


My colleagues Justin Nash and Bart Bouwhuis told me that actually, I can just hack the WorkflowDesigner.aspx URL and modify a farm level UDA.

For example, here is a Site Collection UDA:

I can modify the farm UDA if I know the WorkflowId and the UdaId.  Well, the UdaId is simple.

Here's a farm level UDA:

You can find the WorkflowId if you export the UDA from Farm, and open it up in a text editor. 
You'd see:  <Id>3c2d163c-41da-4966-90ca-a2727d94ead8</Id>

So combined the two together,

Opens the Farm UDA and lets me modify and publish it.

There is an extra note.


When Publishing the UDA, don't click the republish checkbox.  Since that is filtered to workflows only in the current Site Collection.

Instead, after you published your UDA.  Go back to Central Administration.

Click the Analyze UDA Ribbon and Republish from Central Admin.



A quick SQL view


If you can't be bothered digging around for the WorkflowId - you can dump this from Nintex Workflow Database:


    '/_layouts/NintexWorkflow/WorkflowDesigner.aspx?Category=UserDefinedAction&WorkflowId=' + ltrim(StaticId) + '&UdaId=' + ltrim(Id)
    SiteId is null
    WebId is null



Nintex Form - working with managed metadata fields


This is a post I wrote late last year, and applies to the Managed Metadata Fields in Nintex Forms via some "JavaScript middle-tier magic". 



My conversations with the Nintex Form team back then was that at some point they might stop using the SharePoint Managed Metadata Fields and switch to their own control (similar to what they do with the people picker).  Then the following JavaScript code around Managed Metadata fields would stop working.



Nintex has a JavaScript wrapper API (NF.PeoplePickerAPI) around their People Picker Control.

Create something similar that allows me to wrap a Managed Metadata Field.




(function (SPG, $, undefined) {

    var ctor = function (elem) {
        this.$elem = $(elem);

        var $taxonomyEditor = this.$elem.find(".ms-taxonomy");
        if ($taxonomyEditor.length) {
            this.controlObject = new Microsoft.SharePoint.Taxonomy.ControlObject($taxonomyEditor.get(0));

    ctor.prototype = {

        replaceTerm: function(label, termGuid) {
            var self = this;
            if (self.controlObject == undefined) return;

            var term = new Microsoft.SharePoint.Taxonomy.Term(label + "|" + termGuid);

        clear: function() {
            var self = this;

        setRawText: function (text) {
            var self = this;
            if (self.controlObject == undefined) return;


    SPG.ManagedMetadataApi = ctor;
})(window.SPG = window.SPG || {}, NWF$);




  • List: My List
  • Field: MMField


    using "normal" GET REST request doesn't bring back ManagedMetaDataFields, this is a workaround.
    because GetItems is a method on the List, this needs to be a POST operation.

var url = _spPageContextInfo.webAbsoluteUrl +
    "/_api/Web/Lists/getByTitle('My List')/GetItems(query=@v1)" +
    "?@v1={'ViewXml':'<View><Query><Where><Eq><FieldRef Name=\"ID\"/><Value Type=\"Integer\">" + siteID +  

var promise = NWF$.ajax({
    type: "POST",
    url: url,
    headers: {
        "accept": "application/json;odata=verbose",
        "X-RequestDigest": NWF$("#__REQUESTDIGEST").val()
    contentType: "application/json;odata=verbose",
    dataType: "json",
    cache: false,
    processData: true

promise.done(function (data) {

    var row = data.d.results[0];

    // similar syntax as NF.PeoplePickerApi
    var $mmField = new SPG.ManagedMetadataApi("#" + fieldMMField);
    if (row.MMField) {
        $mmField.replaceTerm(row.MMField.Label, row.MMField.TermGuid);


taskeng.exe command prompt - get out of my face


So I was minding my own business working, and suddenly, a command prompt popped up, blocking my work for a few seconds and then disappeared. 

Very annoying.  Because now I'm distracted.  I need to hunt this thing down.


Figure: It can look like this.


A quick Bing search reveals that this is actually frequently reported, but most people have the wrong idea to go about fixing this.  They think "oh this is a virus, because I don't know what it was", so I'm going to run anti-virus and just blast away everything.


Here's what you should do.


Task Engine is Windows' Schedule Tasks.  It is running something.  That something can be a virus, but most likely, something you have installed.

  • So run Task Scheduler
  • Expand the "Task Status" area - this shows you tasks that has run in the selected time period.  You will see there are hundreds of tasks that has ran and will be running.
  • Change the time period filter to the smallest setting "Last hour"
  • Now pick off the single task just just ran.  Moments ago.




Dell SupportAssistAgent AutoUpdate


Task Schedule Library


  • Head to Task Schedule Library on the side menu
  • Find the task that's the culprit




Strangely, this app checks for update at 2:33PM every Thursday, right after lunch.  It's been annoying me for nearly a month.  I must have installed it on 13/02/2015.

Now, it's a fairly harmless app doing it update check.  Instead of just disabling the task, I can also:

  • Move the trigger to logon
  • Change the time to 1pm (lunch)
  • Or my favourite - wait for Idle




So, at Thursday 1PM, wait for up to an hour (so between 1pm to 2pm) for my computer to be idle for 15minutes.  Then you can run this app.  When I'm not watching.




Working with XML in Nintex Workflows (simplified)



You call an XML web service with Nintex Web Service or Web Request actions.  You get back a lot of XML, and it is very difficult to work with the namespaces getting in your way.




1. Do a quick XSLT post processing in the action, remove all the namespaces with XSLT transform.

<xsl:stylesheet xmlns:xsl="" version="1.0">    
<xsl:template match="*">        
    <xsl:element name="{local-name()}">            
    <xsl:apply-templates select="@* | node()" />        
<xsl:template match="@*">        
    <xsl:attribute name="{local-name()}">            
    <xsl:value-of select="." />        
<xsl:template match="text() | comment() | processing-instruction()">
    <xsl:copy />    


2. Force top level XML node.

This ensures if your service returns multiple top level elements they get wrapped together.


3. Use XPath in Query XML Action like this:



Sometimes, after you've wasted half a day working with XML, you just want the simple, no frills, just make it work version.

This will hopefully help you too.


Big thanks to Jumpei Yamauchi for helping me with this one.


Feb 2015 CU SP2013: Workflow CurrentSiteUrl is fixed

Assume that you create a SharePoint 2013 workflow by using SharePoint Designer 2013, and that the workflow contains an action that retrieves data from the "Current Site URL" field in the "Workflow Context" data source. When you run the workflow, the value retrieved from the "Current Site URL" field is missing a forward slash ("/") at the end of the URL.


A few months ago, Microsoft released an update to SharePoint 2013, and it broke many SharePoint Designer Workflows.

If you use the new capabilities in SharePoint 2013 to call REST services, it is very common to concatenate the URL using a combination of the Current Site Url as well as the api/ path.

"http://server/site/" + "_api/web/lists/getbytitle('Announcements')"

The problem is that Microsoft removed the trailing / in the Current Site Url.  This broke many REST calls.

"http://server/site" + "_api/web/lists/getbytitle('Announcements')"

Is no longer valid.  The fix is to reopen all your workflows that are showing this problem, and add a preceding / before _api.  Like this:

"http://server/site" + "/_api/web/lists/getbytitle('Announcements')"


Now, with the February 2015 patch, Microsoft is fixing the workflow action again.  Guess what.

"http://server/site/" + "/_api/web/lists/getbytitle('Announcements')"


I think this looks dirty


Technically, your workflow probably won't break over this.


Should return you the same values as



But it looks terrible.


SharePoint 2016 - debunking confusion and concerns


The announcement of SharePoint 2016 should not come as a surprise (Office 2016 was previously announced, and SharePoint has always been a product released in parallel).

What was the surprise, to me, is how many people immediately jump the gun and asks is there another version of SharePoint after 2016, I don't recall a time where when Microsoft announces Office 2010 is coming and people immediately ask is there an Office 2013.


Why the confusion


I think the confusion, or concern, is that customers can clearly see Microsoft's heavy investment in Office 365, and even the attitude of cannibalizing its own existing products to move forward. 

I think this is the right thing to do for Team Office.  Apple let iPhone ate the iPod.  Windows didn't evolve and got stagnant.

But our concern is genuine.  Many customers can not move to the cloud.  They are indeed worried whether they should continue spending in the on-premises product, or invest elsewhere.  It seems that Microsoft has not been investing in existing features, instead it has been investing only in Office 365 and very little is coming down the pike.

There are also much FUD spread by competitors implying Microsoft has abandoned on-premises and thus a customer should consider abandoning Microsoft and go with a competing on-premises product.


What we can safely assume


There are areas that Microsoft is playing to its strengths.  Many companies - Facebook for Work, Google Apps - are entirely cloud (or mobile) offerings.  SharePoint and Office 365 is a hybrid offering.  And in this strength, Microsoft is uniquely in the cloud, but also in your enterprise and cross-platform in your devices.  This isn't going to change, in fact, this is an area Microsoft will continue to expand the offering.

A decade ago, we can distil Microsoft and Windows down to A PC on Every Desktop

I'd like to think that for Team Office, it should be Office anywhere you do Work.

This means that perhaps while SharePoint the brand is fading into an on-premises only product, SharePoint the product is never going away.  It has not been given the 10-year support life line.  And Microsoft continues to invest in the product.


What could the next version of SharePoint look like?


I see two possibilities with the shape of the next version of SharePoint. 

It could be a stand alone product, in the shape of SharePoint 2019, launched with Office 2019 desktop suite.

It is also possible that in the SharePoint 2016 timeframe, the product becomes Evergreen and future updates are rolled out in the form of Service Packs.


I would kiss the Microsoft Product Manager that makes SharePoint On-Premises Evergreen.  This isn't something unimaginable.  Office 365 has already gone that route.  Windows 10 is envisioned as Windows as a Service and new updates will just roll out new features.  An Evergreen SharePoint effectively means this would be the last release version of SharePoint - and that is great for customers.

It's worthwhile to note that this isn't a decision Team Office has to make in the 2015-2016 timeframe.  This is a decision that should be made in the 2016-2018 timeframe.  By that time, Microsoft and customers would be well-understood about what Microsoft means when it says Windows As A Service.


So no rush.  But you know what I want, Dear Team-Office-Santa.


What I want to see more

Reading between the lines in the Office announcement, I think Office 365/SharePoint announcements coming up in Ignite will be split into really three areas:

  • Office 365 / Cloud / SaaS - new features will appear here first.  That's what Cloud-First means.
  • SharePoint 2016 - boring backend updates, applicable learnings from Office 365 (probably not much - since we aren't big on hosting multi-tenanted environments in a single enterprise).  Database stuff.  High availability.  API updates and APPs that runs in the cloud but also on premises.
  • Hybrid, Hybrid, Hybrid - how to connect everything from Office 365 with On-premises SharePoint: Sway.  Video Portals.  The mystical "Next Generation Portals", Yammer, Groups, Delve and Hybrid Search. 


I expect news to be a bit light between now and Ignite conference, where Microsoft is storing up bags of product announcement goodies.


I'm preparing for everything to get more awesome.  And I don't think SharePoint is going away anytime soon.  If anything, it is still right in the middle of everything (if you are on the ground, not just in the cloud).


I'm Loving every bit of it.  Turn it up to v15!


Microsoft MVP Community Camp 2015


Microsoft MVPs in the Asia region continues with various events in 2015.  The first event is the MVP Community Camp held at the start of the year. 


Melbourne's starts "today" on January 30.

Sydney's will be the next Friday on February 6.

There are two tracks:

MS Technologies for Business


In-depth with Azure

Register for free here

While I won't be presenting a session, I'll be hanging around with the other MVPs across the Microsoft stack answering questions. 


Ask me anything about:

  • Office 365
  • SharePoint
  • TypeScript
  • JavaScript
  • WindowsPhone
  • Microsoft Band
  • XBox One
  • Windows 10

Quick - TSQL select XPath from XML Data Type with namespace


Examples on MSDN shows the full TSQL syntax for XPath query in a TSQL statement, this has been supported since SQL Server 2008.

SELECT CatalogDescription.query(' declare namespace PD=""; <Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" /> ') as Result FROM Production.ProductModel

This returns:

<Product ProductModelID="19"/>
<Product ProductModelID="23"/>

Wildcard in XPath Query

This is a much easier syntax with Wildcards that isn't well know.

SELECT CatalogDescription.query('/*:ProductDescription[1]/@ProductModelID') as Result
FROM Production.ProductModel

This returns:


Plenty of people will tell you using Wildcard matches in XPath is the worst thing in the world.  But I think if you just want to do a quick query, this is fine.


So, this is what can happen if you hack SP javascript files


SharePoint 2010's April 2014 CU introduced a bug with copy and paste. 

Bform.debug.js 381,869 11-Feb-2014 12:37
Bform.js 249,012 30-Jan-2014 16:39
Form.debug.js 211,134 11-Feb-2014 12:37
Form.js 126,783 30-Jan-2014 16:39


This was fixed and released in SharePoint 2010's August 2014 CU.

Bform.debug.js 381,888 15-Jul-2014 11:17
Bform.js 249,022 15-Jul-2014 11:17
Form.debug.js 211,153 15-Jul-2014 11:17
Form.js 126,793 15-Jul-2014 11:17



On December 10, 2014, before we patched to the August 2014 CU level.  A certain very naughty person (me) couldn't wait and decided to offer a quick hack to the Javascript for the users over the holidays.  He even did a bak backup file of the original Form.js




We have now applied the August patch, but unfortunately, you can see:

bform.js, bform.debug.js, form.debug.js all updated.

Form.js is NOT updated.

Copy and paste still doesn't work in our environment.




While a cheating way would be that we install the patch on another environment, and copy the correct Form.js file over. 

We'll be experimenting in this dev environment to see what is the best way to revert and go back to the supported path.  Stay tuned for a follow up article.