Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

Using scriptrunner I need to know how to create multiple subtasks as a postfunction

rhianfarrell
Contributor
August 8, 2017

Hi,

I need to know how to create muliplte subtasks as a postfunction through a workflow transition.

I have to create upwards of 20+ subtasks per workflow status and need to know how they can be automatically added through transitions.

Does anyone have any script that will be of assistance.

2 answers

0 votes
Janet Whyde September 27, 2021

//This is a variation of Joshua Yamdogo's script above. I actually use two in the same //transition, since the value of the custom field determines additional subtasks

import org.apache.log4j.Level
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue

log.setLevel(Level.DEBUG)

def cfManager = ComponentAccessor.customFieldManager

def stList = []

//Validate the value in custom field to determine if the additional subtasks need to be created
final cfTypeName = 'cf Field Name'
def cfType = cfManager.getCustomFieldObjects(issue).find {it.name == cfTypeName }
assert cfType : "Could not find this field on this issue $cfTypeName"

//Declare utility managers
def subTaskManager = ComponentAccessor.getSubTaskManager()
def issueManager = ComponentAccessor.getIssueManager()
def issueFactory = ComponentAccessor.getIssueFactory()

//Capture the parent key value (should not be an issue inside a post function)
final parentIssueKey = issue.getKey()
def parentIssue = ComponentAccessor.issueManager.getIssueByCurrentKey(parentIssueKey)
assert parentIssue : "Could not find parent issue with key $parentIssueKey"

//Set the subtask item type to be created (5='Sub-task')
final issueTypeId = '5'

//Current user is the Reporter on the subtasks
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
final reporterKey = user

//Assignee is the person assigned within the transition
final userKey = issue.getAssigneeId()

//Priority is inherited from parent issue
final priorityName = issue.getPriority()

//Create an array of subtask objects

stList = [
[summary:'Summary 1',description:"Description 1",originalEstimate:1800,estimate:1800],
[summary:'Summary 2',description:"Description 2",originalEstimate:1800,estimate:1800],
[summary:'Summary 3',description:"Description 3",originalEstimate:900,estimate:900]
]


stList.each { it ->
MutableIssue newSubTask = issueFactory.getIssue()
newSubTask.setAssigneeId(userKey)
newSubTask.setSummary(it.get('summary').toString())
newSubTask.setDescription(it.get('description').toString())
newSubTask.setOriginalEstimate(it.get('originalEstimate').toLong())
newSubTask.setEstimate(it.get('estimate').toLong())
newSubTask.setParentObject(parentIssue)
newSubTask.setProjectObject(parentIssue.getProjectObject())
newSubTask.setIssueTypeId(issueTypeId)
// Add any other fields you want for the newly created sub task

newSubTask.setPriority(parentIssue.priority)
newSubTask.setReporter(reporterKey)

Map<String,Object> newIssueParams = ["issue" : newSubTask] as Map<String,Object>
issueManager.createIssueObject(user, newIssueParams)
subTaskManager.createSubTaskIssueLink(parentIssue, newSubTask, user)
log.info "New item with summary ${newSubTask.summary} created"

}

0 votes
Joshua Yamdogo @ Adaptavist
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
August 9, 2017

Hi Rhian,

Do you need each of these sub-tasks to have different information? Or will all of the sub-tasks contain all of the same information? Creating sub-tasks automatically on a workflow function is already a feature built-in to ScriptRunner.

  1. Go to the workflow step you want to create sub-tasks on
  2. Click add Post Function
  3. Click Script Post Function
  4. Select "Create a sub-task"

Screen Shot 2017-08-09 at 8.29.08 AM.png

This built-in feature would work well if you need each sub-task to have different information, since you could customize each sub-task individually as a post-function. However, if you just need to create 20+ sub-tasks with the same information, you'd probably be better off with a post-function custom script like this:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.MutableIssue

def constantManager = ComponentAccessor.getConstantsManager()
def user = ComponentAccessor.getJiraAuthenticationContext().getUser()
def issueFactory = ComponentAccessor.getIssueFactory()
def subTaskManager = ComponentAccessor.getSubTaskManager()
def issueManager = ComponentAccessor.getIssueManager()

Issue parentIssue = issue

if (parentIssue.getIssueTypeObject().getName() == 'Sub-task')
return

if (parentIssue.getIssueTypeObject().name != 'Feature')
return

def summariesList = ["Summary 1", "Summary 2", "Summary 3"]

summariesList.each {
MutableIssue newSubTask = issueFactory.getIssue()
newSubTask.setAssigneeId(parentIssue.assigneeId)
newSubTask.setSummary(it)
newSubTask.setParentObject(parentIssue)
newSubTask.setProjectObject(parentIssue.getProjectObject())
newSubTask.setIssueTypeId(constantManager.getAllIssueTypeObjects().find{
it.getName() == "Sub-task"
}.id)
// Add any other fields you want for the newly created sub task

Map<String,Object> newIssueParams = ["issue" : newSubTask] as Map<String,Object>

//for JIRA v6.*
issueManager.createIssueObject(user.directoryUser, newIssueParams)
subTaskManager.createSubTaskIssueLink(parentIssue, newSubTask, user.directoryUser)
// for JIRA v7.*
issueManager.createIssueObject(user, newIssueParams)
subTaskManager.createSubTaskIssueLink(parentIssue, newSubTask, user)

log.info "Issue with summary ${newSubTask.summary} created"
}
rhianfarrell
Contributor
August 9, 2017

Thanks for replying Joshua,

 

I need to have different subtasks at different stages of the transition however there will be many subtasks and I have been told that a custom script will be best for this.

I have tried the custom script you have provided however I am still getting a failed response:

unable to resolve class for:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.MutableIssue

Struggling to get a working script at the moment haha.

Suggest an answer

Log in or Sign up to answer
TAGS
atlassian, jira cloud certification, managing jira projects, jira project administration, jira cloud exam, atlassian certification, agile project management, jira workflows, jira permissions, jira training, jira cloud skills, atlassian learning

Become a Certified Jira Service Project Expert 🦸🏻‍♂️

Validate your expertise in managing Jira Service Projects for Cloud. Master configuration, optimize workflows, and manage users seamlessly. Earn global 🗺️ recognition and advance your career as a trusted Jira Service management expert.

Get Certified! ✍️
AUG Leaders

Atlassian Community Events