In this article, I want to share my experience working with SharePoint Workflows via SharePoint Designer. Sometimes it may be very painful, but I hope after reading this article you will not step on the same rake.
Do not log Dictionary variable to Log to History
This is a very common issue, your workflow just stucks in the started state with following error:
Retrying last request. Next attempt scheduled in less than one minute. Details of last request: HTTP InternalServerError to https://plumsail.sharepoint.com/sites/Test/_api/web/lists(guid'04dc3f6a-968e-4ce0-a7cc-10949dfb15db')/Items Correlation Id: f54b9d7e-5242-1408-b066-5239a7b01c0a Instance Id: 967e7b1b-96cd-4fbf-b6d4-4df91199831b Invalid text value. A text field contains invalid data. Please check the value and try again. Retry now
It occurs because your data is too big. This workflow action can display a limited number of symbols. Otherwise, such error occurs. As a workaround, you can use Send E-Mail with Attachments (SMTP) action instead of Log to history.
If you send dictionary by email you can receive its structure in JSON format. It is very helpful to understand the structure.
Be careful using Get an Item from Dictionary
Usually, you need to get an item from an array and you use ‘Get an Item from Dictionary’ workflow action like this:
However, please be careful because if you have extra whitespace in the path, your workflow can be stuck into suspended status with the following error:
RequestorId: 261892b4-cf71-e580-0000-000000000000. Details: An unhandled exception occurred during the execution of the workflow instance. Exception details: System.FormatException: The DynamicValue property '(0) ' was incorrectly formatted. at Microsoft.Activities.Dynamic.DynamicValueBuilder.PathSegmentFactory.Parse(String segmentText, String fullPathName) at Microsoft.Activities.Dynamic.DynamicValueBuilder.PathSegmentFactory.Create(String segment, PathSegment next, String path) at Microsoft.Activities.Dynamic.DynamicValueBuilder.PathSegmentFactory.Create(String path) at Microsoft.Activities.GetDynamicValueProperty`1.Execute(CodeActivityContext context) at System.Activities.CodeActivity`1.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation) Exception from activity GetDynamicValueProperty Sequence Microsoft.SharePoint.WorkflowServices.Activities.LoopNTimes Test WF Sequence Flowchart Sequence GetGroupMembers.WorkflowXaml_a9b1b4bd_9995_41a1_9da2_f8f57ce75c54
SharePoint Designer Cache Errors
The following error is very common when you work with SharePoint Designer:
“Failed to Load this workflow. To correct this problem, restart SharePoint Designer.”
To resolve it, you need to clear SharePoint Designer cache
And here is a command for the command line to do it:
rmdir "%LOCALAPPDATA%\Microsoft\WebsiteCache\" /s /q rmdir "%APPDATA%\Microsoft\SharePoint Designer\ProxyAssemblyCache\" /s /q
Create self-documented workflow using stages
You should know how fast you can forget something that you did some time ago when you are using workflow. Please, try to use correct stage names and divide your workflow into small pieces of actions (like procedures in programming languages). In addition, you can use Add a Comment workflow action to leave additional comments in your workflow.
Use Dynamic Value Evaluator to check your expression
It is useful when you use ‘Get an Item from Dictionary’, you can easily check your expression using Dynamic Value Evaluator. For example, you have some data in your dictionary and want to build a path to retrieve it. This is a tool which can help you to do it. Just past JSON structure of your dictionary into a textbox and write your path, then click ‘Run’. It will show what result you can expect.
Lookup User Name/Login/Email by ID
Indeed, this is one of my favorite features, you can use any string variable with an integer value and lookup user data by ID. The example below returns correct display name of the user by specific ID.
You just have an ID, but retrieve a display name.
Get Date in required format
You can use out of the box method as in the figure below:
Use Requestb.in to check your query
When you use ‘Call HTTP Web Service’ you need to see how your request looks. RequestBin service can help you with that, it just logs all queries and shows them to you.
Use App Step to get access
This is a hard to use feature, but in some situations, it is the only way to get required data. Moreover, you can use app-step to get data (for example via REST request) from another web. To use it you have to activate the feature that is called ‘Workflows can use app permissions’. After that, you need to manually grant necessary permissions to your workflow via AppInv.aspx page. You can find more info on MSDN.
In this article, I have tried to collect most interesting notes, which I hope can save a huge amount of your time while creating your workflows. SharePoint 2013 workflows are quite flexible and allow you to use complex objects and loops, but sometimes they just hit you in the stomach with some non-obvious errors.