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

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


1 badge earned


Participate in fun challenges

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


Gift kudos to your peers

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


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!


Come for the products,
stay for the community

The Atlassian Community can help you and your team get more value out of Atlassian products and practices.

Atlassian Community about banner
Community Members
Community Events
Community Groups

Update Issue Listener: check if something changed

Hello all!

Sorry, this is the first time I try to create my own custom listener with Script Runner Listeners. And I don't know a lot of groovy, so I maybe tell some enormous mistakes...

My use case is:

When a ticket is updated, I want to check if a field A value was changed during this update, and maybe to edit this ticket 

The A field could be system field (description) or custom field, it depends.


I have many problems doing that:

1. The "IssueEvent" object doesn't have the Issue BEFORE the update and the Issue AFTER the update (but why... :( ), so I try to find what was changed during this update. But when i have a look on event.toString(), i just see that:

changelog=[GenericEntity:ChangeGroup][issue,17543][author,c_droobi][created,2019-04-21 18:24:28.473][id,80599],eventTypeId=2,sendMail=true,params={eventsource=action, baseurl=},subtasksUpdated=true]

There is nothing!

I saw on different other topics solutions like this (for example in

def change = event?.getChangeLog()?.getRelated("ChildChangeItem")?.find {it.field == "SelectListA"}

but I can't find anything, my "change" variable is empty...


2. When i try to change the value of one of my fields, for example "description field", i see that the Issue object has no setter... I can see with the help of Google I should have a "mutable Issue" object, but I don't find how to transform my original Issue on mutable issue to work with...


Could you please help me to go further on this issue?

Thank you very much. Appreciate! :) 

2 answers

1 accepted

8 votes
Answer accepted
Peter-Dave Sheehan
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
Apr 22, 2019 • edited Apr 23, 2019

It might help to break some of those long lines down and output some messages to the log.

For example, change:

def change = event?.getChangeLog()?.getRelated("ChildChangeItem")?.find {it.field == "SelectListA"}


def changeLog = event?.changeLog //with groovy, all get methods can be accessed with this sort of shortcut)
def changeItems = changeLog.getRelated("ChildChangeItem")
def change changeItems?.find{ it.field == "SelectListA"}
//no changes found, let's try to see why not
log.debug "There are no changes values in this event"
} else {
log.debug it

 This should show you the before and after of every change (if none are found that match SelectListA


For your second option, it's more than just getting a mutable issue. I think by default the issue associated with the event is mutable. I've never bothered to try to cast it to a specific type.

The following should just work:

event.issue.description = "my new description"

But that doesn't impact the db, it's just updating the object instance in memory. To complete the process and fully replicate the UI, you have to perform the following.

  1. call updateIssue() method from IssueManager to store the issue in the db
  2. call createChangeGroup() method from ChangeLogUtil to create the change history (optional)
  3. call reIndex(issue) method from IssueIndexingService to update the index and have the new values available for searching.

Something like this:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.index.IssueIndexingService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.event.type.EventDispatchOption
import com.atlassian.jira.util.ImportUtils
import com.atlassian.jira.issue.history.ChangeLogUtils

def issueManager = ComponentAccessor.issueManager

event.issue.description = "my new description"

issueManager.updateIssue(event.user, event.issue, EventDispatchOption.DO_NOT_DISPATCH, false)

def wasIndexing = ImportUtils.isIndexIssues()

Wow, Peter-Dave, you're wonderful!

Thank you SO MUCH for helping me. That's perfect.

I succeeded to do what I wanted to do. I won't use your second part because I just wanted to change the Assignee so I used this method:

(with ValidateAssign and Assign methods).


Just for some people who would see this topic, you have some little mistakes in your code:

childChangeItem => should have a cap ChildChangeItem

( it.field == "SelectListA"}


{ it.field == "SelectListA"}




Thank you again!! :) :)

Peter-Dave Sheehan
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
Apr 23, 2019

Thanks for catching my typos. I corrected them.

Glad I was able to help.

Hi All, 

Have you any experiences in updating changes custom field when Indicator (TimeTOSLA field) changed?

I had below code to change value of custom field 2 when Indicator (TTS type) changed but it did work

Issue issue = event.getIssue()
def changeHolder = new DefaultIssueChangeHolder()

def customFieldManager = ComponentAccessor.getCustomFieldManager()
def issueService = ComponentAccessor.getIssueService()

def Indicator = "customfield_10815"

def change = event?.getChangeLog()?.getRelated("ChildChangeItem")?.find {it.field == "Indicator"}

def customField1 = customFieldManager.getCustomFieldObject("customfield_10815") ---Indicator field
def customField2 = customFieldManager.getCustomFieldObject("customfield_13007")
def customField1Value = customField1.getValue(event.issue).toString()
def customField2Value = customField2.getValue(event.issue).toString()

if (change) {
def issueInputParameters = issueService.newIssueInputParameters()
issueInputParameters.addCustomFieldValue(customField2.idAsLong, customField1Value)
def validationResult = issueService.validateUpdate(event.user,, issueInputParameters)
if (validationResult.isValid()) {
issueService.update(event.user, validationResult)
} else {
log.warn "Did not update issue: $validationResult.errorCollection.errors"



Suggest an answer

Log in or Sign up to answer