Since you can't use JQL operator "was" or "changed" for custom field, I'm resorting to ScriptRunner Console.
I have issue types Bug and Story that both uses a radio button custom field (let's say with options 1,2,3,4 etc). When a Bug or Story is created, it might have "Option 1" selected. But later on, the radio button custom field was changed to "Option 2".
How do I pull issues that were once "Option 1" as well as all issues that are still "Option 1" on the Console?
I have looked up these references, but we don't have easybi and would like not to resort to purchasing apps. https://community.atlassian.com/t5/Jira-questions/How-to-get-historical-values-from-custom-field-with-scriptrunner/qaq-p/1879270
Using issue.getCustomFieldValue for radio button IS Option 1
Using changeHistoryManager.getChangeItemsForField to retrieve updated histories of radio button in specific issue.
def radio_field = ComponentAccessor.customFieldManager.getCustomFieldObjectsByName(RADIO_FIELD_NAME)[0]
// radio button IS Option 1
Closure<Boolean> is_option_1 = {Issue i ->
i.getCustomFieldValue(radio_field).value == 'Option 1'
}
// radio button WAS Option 1
Closure<Boolean> was_option_1 = {Issue i ->
// retrieve histories of specific customfield in issue
def radio_field_histories = ComponentAccessor.changeHistoryManager.getChangeItemsForField(
i, radio_field.name
)
// histories were once changed from Option 1
radio_field_histories.any{ChangeItemBean changed_item ->
changed_item.fromString == 'Option 1'
}
}
// issue = looped Bug & Story issue
return is_option_1(issue) ?: was_option_1(issue)
Hi @Tim Chen
Sorry for late response.
I'm getting a variable undeclared error under "changed_item" in the "changed_item.fromSting". My groovy language skills is subpar.
For the "return is_option_1(issue)" etc, how do I looped Bug and Story issue there?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi @Tim Chen
Just want to say I have figured out a simple method! Many thanks to Ravi Sagar's video: https://www.ravisagar.in/videos/scriptrunner-retrieve-specific-field-change-history
This works for me:
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.link.IssueLink
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.user.ApplicationUser
import org.apache.log4j.Logger
import org.apache.log4j.Level
def log = Logger.getLogger("My Username Here")
log.setLevel(Level.DEBUG)
log.debug("Script started")
IssueManager im = ComponentAccessor.getIssueManager();
MutableIssue issue = im.getIssueObject("ABC-12345")
//to see all field changes
def changeHistoryManager = ComponentAccessor.getChangeHistoryManager()
changeHistoryManager.getAllChangeItems(issue).each { it ->
log.debug(it.created.toString() + ": " + it.field + " - " + it.from + "->" +it.to)
}
//to specific a single field
changeHistoryManager.getChangeItemsForField(issue, "Custom Field Name Here").each { it ->
log.debug(it.created.toString() + ": " + it.field + " - " + it.fromString + "->" +it.toString)
}
The only downside is that I can only search 1 issue at a time. I'm pretty sure if I add more conditions to my liking, then I can achieve my end goal which is to find a way to use this script and insert a type of JQL query. Like "find all Bugs and Story issues in Project ABC and in Sprints 1, 2, 3"
But I wanted to share this so that others can use and maybe build on.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi, @Diana Gorv
Sorry for late response.
You can use JQL in SR for searching all story and bug issues like below:
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.issue.Issue
import com.atlassian.query.Query
String jql_string = "issuetype in (Story, Bug)" // JQL search string
Query parsed_query = ComponentAccessor.getComponent(JqlQueryParser).parseQuery(jql_string)
PagerFilter page_filter = new PagerFilter(100) // 100 means searching 100 satisfied issues
// PagerFilter page_filter = PagerFilter.unlimitedFilter // for searching all satisfied issues
ApplicationUser current_user = ComponentAccessor.jiraAuthenticationContext.loggedInUser
List<Issue> story_and_bug_issues = ComponentAccessor.getComponent(SearchService).search(
current_user, parsed_query, page_filter
).results
story_and_bug_issues.each{Issue i ->
// check the value of the radio field by combining with previous script :)
}
Hope it helps. :)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi @Tim Chen
Thank you for the jql parse code!
Is there a way I can make List<Issue> as some sort of MutableIssue?
Right now, I'm trying to achieve like this
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.issue.Issue
import com.atlassian.query.Query
String jql_string = "issuetype in (Story, Bug) AND radiobutton IS NOT Empty" // JQL search string
Query parsed_query = ComponentAccessor.getComponent(JqlQueryParser).parseQuery(jql_string)
PagerFilter page_filter = new PagerFilter(100) // 100 means searching 100 satisfied issues
// PagerFilter page_filter = PagerFilter.unlimitedFilter // for searching all satisfied issues
ApplicationUser current_user = ComponentAccessor.jiraAuthenticationContext.loggedInUser
List<Issue> story_and_bug_issues = ComponentAccessor.getComponent(SearchService).search(
current_user, parsed_query, page_filter
).results
//to specific a single field
changeHistoryManager.getChangeItemsForField(story_and_bug_issues, "Custom Field Name Here").each { it ->
log.debug(it.created.toString() + ": " + it.field + " - " + it.fromString + "->" +it.toString)
}
But I can't get a matching method while using a List<Issue> from the query.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
The first argument of changeHistoryManager.getChangeItemsForField is a single Issue object. Therefore story_and_bug_issues is List<Issue> so it is not allowed. You should to use that method while looping story_and_bug_issues, like:
story_and_bug_issues.each{Issue i ->
changeHistoryManager.getChangeItemsForField(i, "FIELD NAME").each{
// your log message
}
}
Besides, for changing Issue object to MutableIssue object, using IssueManager to retrieve the MutableIssue object, like
story_and_bug_issues.each{Issue i ->
MutableIssue mutable_issue = ComponentAccessor.issueManager.getIssueByKey(i.key)
}
And it is able to change List<Issue> to List<MutableIssue> like:
List<MutableIssue> mutable_issues = story_and_bug_issues.collect{Issue i ->
ComponentAccessor.issueManager.getIssueByKey(i.key)
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Spend the day sharpening your skills in Atlassian Cloud Organization Admin or Jira Administration, then take the exam onsite. Already ready? Take one - or more - of 12 different certification exams while you’re in Anaheim at Team' 25.
Learn more
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.