Just a heads up: On March 24, 2025, starting at 4:30pm CDT / 19:30 UTC, the site will be undergoing scheduled maintenance for a few hours. During this time, the site might be unavailable for a short while. Thanks for your patience.

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

Is there a way using JWT to do an operation over every element in a list?

Pierre Ibrahim
Contributor
January 31, 2024

Hi Atlassian Community!

The scenario I have is a multiselect custom field that I want to copy to a label type customfield (Not the issue label)

The issue I'm having is I can't copy the values one to one, I need to append the keyword "skill#" before each value returned by the multiselect, and replace all spaces with "_".

one thing that kinda worked was: "skill#" + findReplaceAll(%{issue.cf19904}, " ", "_")

That works great if I'm selecting one item, however for multiple I get:

skill#This_Is_The_First_Item,_This_Is_The_Second_Item

JWT error2.png

I'm wondering if there's a "for each" in the return of a multiselect. I understand a multiselect returns a string, not a list, but if I try toStringList(%{issue.cf19904},","), I get a generic error in JWT:

JWT error.png

I was able to achieve what I need using scriptrunner, but I'd really prefer to do it in JWT instead if possible.

For those curious, this is my script in scriptrunner:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.label.Label
import com.atlassian.jira.issue.label.LabelManager

CustomField skillsList = ComponentAccessor.getCustomFieldManager().getCustomFieldObject("customfield_19904")
def skillsListValue = issue.getCustomFieldValue(skillsList)

CustomField skillsLabel = ComponentAccessor.getCustomFieldManager().getCustomFieldObject("customfield_15300")

def currentUser = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
def labelManager = ComponentAccessor.getComponent(LabelManager)
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def skillFieldID = customFieldManager.getCustomFieldObject("customfield_15300").getIdAsLong()

def joinedList = skillsListValue.collect { "skill#$it" }

joinedList = joinedList.collect {it.toString().replaceAll(" ", "_")}

for (skill in joinedList){
labelManager.addLabel(currentUser, issue.getId(), skillFieldID, skill, false)
}



Thank you all in advance

1 answer

1 accepted

3 votes
Answer accepted
Nacho Moreno Ortega
Contributor
February 1, 2024 edited

Hi Pierre Ibrahim!

I'm Nacho, support member of Decadis AG.

When using the "Advanced text" parsing mode, the result returned has to be a text, so you would have to use the parser function toString() to transform the result to a text.

If I understood correctly, it could be separated in the following way, by using toStringList() and findReplaceAll() in order to operate with each element o the list (seed):

toString(textOnStringList(toStringList(%{issue.cf19904}), "#skill" + findReplaceAll(%{seed.text}, " ", "_")))

Is this the result that you are looking for?

If not, I invite you to create a ticket in our support portal so we can have a more convenient and fluid communication!

I look forward to hearing from you.

Best regards,

Nacho

Pierre Ibrahim
Contributor
February 1, 2024 edited

Hi @Nacho Moreno Ortega ,

Thank you so much for your response, I greatly appreciate it!

Unfortunately no, this brings back the same result as using "skill#" + findReplaceAll(%{cf}, " ","_")

What I'm looking for is really a way to loop over every element of a multiselect value, append "skill#" to the beginning of every value (not just the first value), and in every value, replace every instance of " " with "_".

For reference, let's say I have the following selections in my multiselect:

  • This Is The First Value
  • This Is The Second Value
  • This Is The Third Value

using the formula you provided I get the following

skill#This_Is_The_First_Value,_This_Is_The_Second_Value,_This_Is_The_Third_Value

vs what I need which is:

skill#This_Is_The_First_Value,skill#This_Is_The_Second_Value,skill#This_Is_The_Third_Value

 

I'm able to achieve this today using scriptrunner, but the problem here is it looks ugly in the issue history since scriptrunner has to add the values one by one to labels, I'm hoping by using JWT, I'm passing all the values at once to my labels field, and it would show just once in the issue history.

 

Edit: My apologies, your solution works perfectly! I was writing it incorrectly, thank you!

Like Nacho Moreno Ortega likes this

Suggest an answer

Log in or Sign up to answer
TAGS
atlassian, atlassian government cloud, fedramp, webinar, register for webinar, atlassian cloud webinar, fedramp moderate offering, work faster with cloud

Unlocking the future with Atlassian Government Cloud ☁️

Atlassian Government Cloud has achieved FedRAMP Authorization at the Moderate level! Join our webinar to learn how you can accelerate mission success and move work forward faster in cloud, all while ensuring your critical data is secure.

Register Now
AUG Leaders

Upcoming Jira Events