Change due dates of template - scriptrunner?
Asked by Reto Eggenberger:

Hi all

I have a template with tasks. Kind of a timetable.

![](https://productsupport.adaptavist.com/servicedesk/customershim/secure/attachment/13311/13311_Macro_101216_042053_PM.jpg)

On the template only the difference between the dates matter. Task 2 is ten days later den Task 1 ...

Now I want a possibility to change all the due dates. Say I want to start the timetable on 01.11.2016. The result should be:

* 01.11.2016 ...
* 10.11.2016 ...
* 14.11.2016 ...

The same difference between 01.11.2016 and 01.01.2000 gets applied to all the due dates. Or according to the offset in brackets.

* Ideal would be, if the date gets asked on creation of the page.
* Or a button to change the date.
* Or an event listener which changes all the due dates automatically.

I think with the Scriptrunner Add-On this should be possible, but I don't know where to start ...

Thanks for any hints on this.

Reto  
[](https://community.atlassian.com/t5/Confluence-questions/Change-due-dates-of-template-scriptrunner/qaq-p/329191?attachment-id=7059){#link_118647a24c22f6}  
[](/tnckb94959/attachments/tnckb94959/confluence-questions/55480/1/due_dates_101116_083724_AM.jpg){#display_118647a24c22f6_0}


Answers:
author: Reto Eggenberger
body: I found a way to change the values according to a offset in brackets with scriptrunner. Works perfect.

```
import java.text.SimpleDateFormat;import java.util.Date;import java.util.regex.Pattern;import java.util.regex.Matcher;import java.util.Calendar;Date date = new SimpleDateFormat("dd.MM.yyyy").parse("${parameters.releasedate}");SimpleDateFormat isord = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat rd = new SimpleDateFormat("dd.MM.yyyy");Calendar cal = Calendar.getInstance();String[] lines = body.split("\\&lt;/li\\&gt;", -1);body = "";for (int i = 0; i &lt; lines.length; i++) {    Pattern p = Pattern.compile("\\[(.*?)\\]");    Matcher m = p.matcher(lines[i]);    while(m.find()) {        cal = Calendar.getInstance();        cal.setTime(date);        cal.add(Calendar.DATE, Integer.parseInt(m.group(1)));        lines[i] = lines[i].replaceAll("01.01.2000",rd.format(cal.getTime())).replaceAll("2000-01-01",isord.format(cal.getTime()));    }    body = body + lines[i];}body;
```

But I made a huge mistake...

The change is only to the visual layer. The dates are stored as they are without the offset. Doesn't work with reminders and so on ...

comments: author: Jonny Carter
body: I'm a little unclear on how your template takes information about existing tasks and creates the table of dates and such. That's the critical point, as that's where you might capture the task object's ID. From your script, it looks like you're assuming that the task table is already present in the macro body, which I assume your template takes care of. Can you elaborate on the template a bit?


author: Reto Eggenberger
body: Yes. You're right. The tasks are already predefined in the template (approx. 20 tasks for different users). After the tasks, there are different headings and tables and so on. But the tasks are on top framed by a macro (as you see it in the screenshot). This might help to define which tasks shall get modified with the macro.


author: Jonny Carter
body: How does the template know which tasks to look at? Are they always new tasks?


author: Reto Eggenberger
body: Since it has to change the tasks (not only the 'visual layer' as my script above does), it would have to trigger only once. Maybe on creation of the new page from template (if you can input the release date). Or manual triggering with a button (or webitem) on the page (+ input dialog for the release date).


author: Jonny Carter
body: What if your macro parameter just took a task ID (or list of task IDs) as a parameter? You could also provide the number of days to add/subtract as a parametr. Then it would lay out the table for you based on the task dates.

Since the WorkBox is a plugin, you'll need the [@WithPlugin and @PluginModule](https://scriptrunner.adaptavist.com/latest/jira/scripting-other-plugins.html) annotations.

```
import com.atlassian.mywork.service.TaskServiceimport com.atlassian.mywork.model.TaskBuilder@WithPlugin('com.atlassian.mywork.mywork-common-plugin')@PluginModuleTaskService taskServiceTaskBuilder taskBuilder = new TaskBuilder()def task = taskBuilder.user("whoever").createTaks() //use more of the methods on the TaskBuilder class to set your tasks' details?taskService.createOrUpdate("whoever", task)
```

See the API documentation for TaskBuilder, Tasks, and so on at

<https://docs.atlassian.com/mywork-api/1.0.3/com/atlassian/mywork/model/TaskBuilder.html><https://docs.atlassian.com/mywork-api/1.0.3/com/atlassian/mywork/model/Task.html>   
<https://docs.atlassian.com/mywork-api/1.0.3/com/atlassian/mywork/service/TaskService.html> [](https://docs.atlassian.com/mywork-api/1.0.3/com/atlassian/mywork/model/TaskBuilder.html)

That would create or update a task, which you could then render your list from.

Not quite a full solution, but hopefully enough to get you started.


Tags: confluence-administration

scriptrunner