Example scripts
To homepage
Jira Service Desk

Add Service Management Ticket Request Participants and Reporter as Watchers on Linked Issues
App in script

ScriptRunner For Jira
by Adaptavist
Compatibility

Jira Service Desk (4.0 - 4.6)

ScriptRunner For Jira (5.6.14)
Language |
groovy
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLinkTypeManager
import com.atlassian.jira.issue.search.SearchResults
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.user.ApplicationUser
import groovy.transform.Field
final projectKey = 'TEST'
final weeks = '1'
final issueLinkTypeName = 'Cause'
final PAGE_SIZE = 100 // limit JQL search to only retrieve 100 issues at a time
def searchService = ComponentAccessor.getComponentOfType(SearchService)
def issueLinkTypeManager = ComponentAccessor.getComponent(IssueLinkTypeManager)
def projectManager = ComponentAccessor.projectManager
@Field Set issuesUpdated = []
@Field def loggedInUser = ComponentAccessor.jiraAuthenticationContext.loggedInUser
def project = projectManager.getProjectByCurrentKey(projectKey)
assert project: "Could not find project with key $projectKey"
assert weeks: 'You must specify how many weeks back to search for issues to update'
def issueLinkType = issueLinkTypeManager.issueLinkTypes.findByName(issueLinkTypeName)
assert issueLinkType: "Could not find link type with name $issueLinkTypeName"
def jqlSearch = "project = ${project.key} and issueFunction in hasLinkType('${issueLinkType.name}') AND created >= endOfDay(-${weeks}w) AND status != Done AND level is EMPTY"
def parseResult = searchService.parseQuery(loggedInUser as ApplicationUser, jqlSearch)
if (!parseResult.valid) {
log.error('Invalid query')
return
}
def query = parseResult.query
def pagerFilter = PagerFilter.newPageAlignedFilter(0, PAGE_SIZE)
def searchResults = null
while (!searchResults || (searchResults as SearchResults).total > pagerFilter.start) {
searchResults = searchService.search(loggedInUser as ApplicationUser, query, pagerFilter)
searchResults.results.each {
addWatchersFromLinkedIssues(it, issueLinkType.name)
}
pagerFilter.start += PAGE_SIZE
}
['updatedIssues': issuesUpdated]
void addWatchersFromLinkedIssues(Issue issue, String linkTypeName) {
def requestParticipantsFieldName = 'Request participants'
def watcherManager = ComponentAccessor.watcherManager
def customFieldManager = ComponentAccessor.customFieldManager
def requestParticipantsCF = customFieldManager.getCustomFieldObjectsByName(requestParticipantsFieldName).first()
def linkedIssues = findInwardIssuesByLinkType(issue, linkTypeName)
linkedIssues.each {
def participants = it.getCustomFieldValue(requestParticipantsCF) as List
def potentialWatchersToAdd = [] as Set<ApplicationUser>
potentialWatchersToAdd.add(it.reporter)
if (participants) {
potentialWatchersToAdd.addAll(participants)
}
def currentWatcherCount = issue.watches
def resultingIssue = null
potentialWatchersToAdd.each { candidateWatcher ->
resultingIssue = watcherManager.startWatching(candidateWatcher, issue.refresh())
}
if ((resultingIssue as Issue)?.watches > currentWatcherCount) {
issuesUpdated << resultingIssue
}
}
}
List<Issue> findInwardIssuesByLinkType(Issue issue, String linkType) {
def serviceDeskProjectTypeKey = 'service_desk'
def issueLinkManager = ComponentAccessor.issueLinkManager
def issues = issueLinkManager.getLinkCollection(issue, loggedInUser as ApplicationUser, true).getInwardIssues(linkType)
issues.findAll { it.projectObject.projectTypeKey.key == serviceDeskProjectTypeKey }
}
Having an issue with this script?
Report it here