How to Create a Timer Job with SharePoint Designer 2013

In this post I’m going to show you how to create a no server side code timer job using a SharePoint Designer 2013 site workflow.

Scenario

We have a SharePoint Online (Office 365) site with a task list in it and we need to send daily alerts to users that have overdue tasks assigned to them.

sp_task_list

Problem

The obvious solution would be to create a timer job to do that… Unfortunately we are in an Office 365 environment so we do not have the possibility to implement a standard timer job using server side code.

office_365_red

Solution

We can simulate the behaviour of a timer job using a Sharepoint Designer 2013 site workflow.

Steps

1. Create a New Site Workflow in Sharepoint Designer 2013

Open SharePoint Designer 2013 and create a new site workflow

site_wotkflow

2. Get All Overdue Tasks that are not Completed

In the first stage (let’s call it “Getting Overdue Tasks”) build a dictionary to store the accept header for our rest request and get results in json:

accept: application/json;odata=verbose

tj_build_dictionary

tj_accept_header

Put the current date in a DateTime variable (let’s call it “today”).

tj_today

Then call the SharePoint REST Service to get the overdue tasks.
To do so insert the “Call HTTP Web Service” action in the workflow (in an App Step to avoid permission related problems).

tj_call_service

The action url must be constructed dynamically  using the “today” variable like this:

tj_request_endpoint

tj_today_iso_formatted

Set the action verb to GET, the request headers to the headers dictionary previously built and the response content to a dictionary to store the request result.

tj_rest_call_properties

Get and store the returned tasks in a separate dictionary to count them and loop through them later.

tj_store_tasks

3. Send Alerts to Overdue Tasks Assignees

Create a second stage (let’s call it “Sending Alerts”) to send alerts and then link the first stage to it.

Insert a loop and inside it extract the task id from the rest response and send an email to each overdue task assignees.

Use a loop index variable to address the current task and remember to initialize it to zero and increment it properly at the end of the loop.

tj_loop

tj_mail

To get the email address of the recipient (the task assignee) use the task id previously extracted from the rest response like this:

tj_recipient

4. Wait One Day and Start Over Again

Insert a pause action and configure it to wait one day.

Link the “Sending Alerts” stage to the “Getting Overdue Tasks” stage to start over again.

tJ_pause

Conclusion

Here is how the complete workflow will look at the end of the process:

tj_complete_workflow

Publish the site workflow and start it (you can access the “Site Workflows” page from the “Site Contents” page).

tj_start_wf

It will send the alerts daily as expected.

tj_receive_mail

References

Fabian Williams