Hello,
Looking for help in a scripted field for scriptrunner.
I have two number fields:
Incorrect
Correct
In the scripted field, I'm trying to do this If/Else equation:
IF:
Correct && Incorrect do not equal zero:
return the number from this equation:
Correct/(Incorrect + Correct) * 100
IF:
Incorrect equals zero && Correct does not equal 0:
return the number 100
Else:
return the number 0
Here is something to get you started
import com.atlassian.jira.component.ComponentAccessor
def customFieldManager = ComponentAccessor.customFieldManager
def correctField = customFieldManager.getCustomFieldObjectsByName('Correct')[0]
def incorrectField = customFieldManager.getCustomFieldObjectsByName('Incorrect')[0]
if(!correctField || !incorrectField){
log.error "Can't evaluate script field '$name'. Missing custom field 'Correct' or 'Incorrect'"
return 0
}
def correct = issue.getCustomFieldValue(correctField)?.toDouble() ?: 0
def incorrect = issue.getCustomFieldValue(incorrectField)?.toDouble() ?: 0
if(correct && incorrect){
correct/(incorrect + correct) * 100
} else if (correct && !incorrect) {
100
} else {
0
}
This assumes that both fields are correctly configured as number fields. Otherwise, the toDouble() method will fail.
The "?: 0" mean if there is no value for the custom field, assume a value of 0.
I'll point out that the second condition is equivalent to the first one. For example, 2 correct and 0 incorrect 2/(2+0)*100 = 100. So no real need for that condition. So this would work too:
if(correct ){
correct/(incorrect + correct) * 100
} else {
0
}
Note that in groovy, "thrutiness" for number means that a condition will be false if the number is zero or null. Anything else is true. But if it makes it easier for you, you could write if(correct >0)
Thanks for the solid response and help Peter,
I ended up figuring out the below code which is working for me, but I plan on implementing some of your code as modifications/improvements. Particularly the "?:0", that's really helpful.
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.user.ApplicationUser
import com.opensymphony.workflow.WorkflowContext
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def incorrectCf = customFieldManager.getCustomFieldObjectsByName("Incorrect")
def correctCf = customFieldManager.getCustomFieldObjectsByName("Correct")
def incorrect = issue.getCustomFieldValue(incorrectCf) as Integer
def correct = issue.getCustomFieldValue(correctCf) as Integer
if (correct != 0 && incorrect != 0){
return correct/(correct + incorrect)*100 as Integer
}
if (correct != 0 && incorrect == 0){
return "100"
}
else{
// return to some code to indicate a null value in one of the fields
return "0"
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Glad to help.
Just be careful with getCustomFieldObjectsByName and getCustomFieldObjectByName (one has objectS). The singular one is deprecated as of Jira 8 and the other will return an array of customfields. So you may need to look for item 0 in the list.
Or else, use getCustomFieldObject(Long customFieldId) to be absolutely certain you are getting the correct field.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.