Create
cancel
Showing results for 
Search instead for 
Did you mean: 
Sign up Log in
Celebration

Earn badges and make progress

You're on your way to the next level! Join the Kudos program to earn points and save your progress.

Deleted user Avatar
Deleted user

Level 1: Seed

25 / 150 points

Next: Root

Avatar

1 badge earned

Collect

Participate in fun challenges

Challenges come and go, but your rewards stay with you. Do more to earn more!

Challenges
Coins

Gift kudos to your peers

What goes around comes around! Share the love by gifting kudos to your peers.

Recognition
Ribbon

Rise up in the ranks

Keep earning points to reach the top of the leaderboard. It resets every quarter so you always have a chance!

Leaderboard

Script Listener Updates Custom Field to Wrong Value-Cloud

I have a script listener on issue updates that copies the latest value in the Sprint field to another read-only custom field called 'Current Sprint.' So anytime the Sprint field is updated, the Current Sprint field is updated as well. 

It mostly works well, but I'm having a problem when issues aren't completed in a sprint & are rolled over to the next sprint. Ex. The Sprint field shows an issue is in Canopy Sprint 15, but Current Sprint says Canopy Sprint 14, the previous sprint. If I try to update this manually, either through a bulk edit or the Scriptrunner script console, it works but then my script listener immediately runs & sets it back to the previous, incorrect sprint. Any ideas on what's causing this, or ways to improve my script? I'm newer to scripting so I'm sure this could be improved a bit. 

def issueTypes = ['Story', 'Epic']
def thing

if (!issue.fields.issuetype.name in issueTypes) {
return
}

def issueKey = issue.key

def returnLatestSprintName(issueSprints) {
def latestSprint
if (issue.fields.customfield_10115) {
def sprints = []
issueSprints.each { sprint ->
def sprintMap = sprint.substring(sprint.indexOf('[')+1, sprint.indexOf(']')).tokenize(',').collectEntries { [(it.tokenize('=')[0]): it.tokenize('=')[1] ]}
sprints.add(sprintMap)
//sprints.sort { it.name }

}
latestSprint = sprints.sort { it.id }[-1].name
} else {
latestSprint = ''
}
return latestSprint
}

def latestSprint = returnLatestSprintName(issue.fields.customfield_10115)

if (issue.fields.customfield_10752 != latestSprint && latestSprint != '') {
put("/rest/api/2/issue/${issueKey}")
.queryString("overrideScreenSecurity", Boolean.TRUE)
.header('Content-Type', 'application/json')
.body([
fields: [
customfield_10752: latestSprint
]
])
.asString()
}

 Thanks!
Keri

2 answers

Suggest an answer

Log in or Sign up to answer
0 votes
Jon Bevan [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.
Jun 11, 2018

Hi Keri,

I'm not sure how to do this programmatically because the Jira Software REST APIs don't give enough of the information you need.

Could you just temporarily disable your Script Listener whenever you manually fix the issues?

Thanks,
Jon

0 votes
Marcos Sanchez
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.
Jun 06, 2018

Hi Keri,

 

I had a little script that does something like that, I adapted it a bit to your requirements and it works fine for me. You could try it and I hope it works to you:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.event.type.EventDispatchOption

def cfManager = ComponentAccessor.customFieldManager
def issueManager = ComponentAccessor.issueManager

def currentSprint = cfManager.getCustomFieldObject(11101L) //Replace ID with your custom field ID
def sprint = cfManager.getCustomFieldObject(10104L) //Replace ID with your original sprint ID

def invalidIssueTypes = ["Story", "Epic"]

if(invalidIssueTypes.contains(issue.issueType.name)){
return
}else{
issue.setCustomFieldValue(currentSprint, Arrays.toString(sprint.getValue(issue).name).replace("[", "").replace("]", ""))

issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), issue, EventDispatchOption.DO_NOT_DISPATCH, false)
}

 

I tried it two ways:
- Moving issue between sprints on backlog view.
- Editing Sprint field

Both of them work as expected.

 

Regards,
Marcos

Jon Bevan [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.
Jun 11, 2018

Marcos your code is for Jira Server not Jira Cloud, so it won't work for Keri.

Marcos Sanchez
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.
Jun 11, 2018

Oh, right.

I absolutely forgot about the cloud, so sorry...

TAGS
AUG Leaders

Atlassian Community Events