Sometimes it may be very painful, but I hope after reading the article you will not step on the same rake.
Logging a Dictionary variable to Log to History
Do not log a Dictionary variable to Log to History. This is a very common issue, your workflow is just stuck in the started state with the 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 an error occurs. As a workaround, you can
Send E-Mail with Attachments (SMTP) instead of logging to history.
If you send a dictionary by email you can receive it's structure in JSON format. It is very helpful to understand the structure.
Using Get an Item from DictionaryBe careful using Get an Item from Dictionary. Usually you need to get an item from an array and you use a "Get an Item from Dictionary" workflow action as in the following.
However, please be careful because if you have extra whitespace in the path, your workflow can be stuck in the 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<DynamicValue> Sequence Microsoft.SharePoint.WorkflowServices.Activities.LoopNTimes Test WF Sequence Flowchart Sequence GetGroupMembers.WorkflowXaml_a9b1b4bd_9995_41a1_9da2_f8f57ce75c54
SharePoint Designer Cache ErrorsThe following error is very common when you work with the SharePoint Designer:
“Failed to Load this workflow. To correct this problem, restart SharePoint Designer.”
Figure 1 Faild to load
To resolve it, you need to clear the
SharePoint Designer cache.And here are the commands 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 stagesYou should understand how fast you can forget something you did some time ago when you are using a workflow. Please try to use the correct stage names and divide your workflow into small pieces of actions (like procedures in programming languages). In addition, you can use an "Add a Comment" workflow action to leave additional comments in your workflow.
As an example of the self-documented workflow I can provide a notification workflow that I described in my
previous article.
Use Dynamic Value Evaluator to check your expressionIt 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 path to retrieve it. This is a tool that can help you to do it. Just past the JSON structure of your dictionary into a TextBox and write your path, then click "Run". It will show what result you can expect.
Figure 2 Dynamik Value Evaluator
Figure 3 Dynamik Value Evaluator2
Lookup User Name/Login/Email by IDIndeed this is one of my favorite features. You can use any string variable with an integer value and look up the user data by ID. The following example returns the correct display name of the user by specific ID.
You just have the ID, but retrieve the display name.
Figure 4 Look For String
Get Date in required formatYou can use the out-of-the-box method as in the figure below:
Figure 5 Look For String2
Additionally you can use the
free custom action "
Format Date" from the Plumsail Workflow Actions Pack.
Use Requestb.in to check your queryWhen 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 the queries and shows them to you.
Figure 6 Headers
Use App Step to get accessThis is a hard-to-use feature, but in some situations, it is the only way to get the required data. Moreover, you can use an app-step to get data (for example via REST request) from another web. To use it you need to activate the feature that is called "Workflows can use app permissions". Then, you need to manually grant the necessary permissions to your workflow via AppInv.aspx page. You can find more info on
MSDN.
ConclusionIn this article, I have tried to collect the most interesting notes that I hope can save a huge amount of your time when creating your workflows. SharePoint 2013 workflows are quite flexible and allow you to use complex objects and loops, but sometime they just hit you in the stomach with some non-obvious errors.
The original article is available on
our blog.