Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

Scriptrunner script for linking tasks based on the common value of customfield.

uvo3 main public name
Contributor
July 7, 2023

jira server script runner
how to find and link current issue by common value of customfields automatically
Exmample: New and Old ticket in the project have common value of customfield. How to find Old ticket from New ticket and linked those, and update a couple fields in New ticket from Old automatically.
Is it achievable by script runner. Please help with a script

3 answers

2 accepted

3 votes
Answer accepted
Evgenii
Community Champion
July 7, 2023

Hi, @uvo3 main public name 

It can be made with scriptrunner, but maybe it's better to make with Jira Automation?

You won't need to write scripts, it can be done much easier.

uvo3 main public name
Contributor
July 7, 2023

The automation should be applied in Jira Server 8 environment.
I'm afraid it not possible to add automation.

Could you provide guidelines how to implement that?

or if it possible to provide same script example

uvo3 main public name
Contributor
July 7, 2023

The script was find in community as example doesn't work for me.

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.user. ApplicationUser
def issueManager = ComponentAccessor.getIssueManager()
def currentIssue = issueManager.getIssueObject("TEST-11")
//def currentIssue = event.getIssue()
def linkManager = ComponentAccessor.getIssueLinkManager()
def cfm = ComponentAccessor.getCustomFieldManager()
def jqlParser = ComponentAccessor.getComponent(JqlQueryParser)
def searchProvider = ComponentAccessor.getComponent(SearchProvider)
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() as ApplicationUser
def queryIssue
def ipVal = currentIssue.getCustomFieldValue(cfm.getCustomFieldObjectByName("Domino Aplicativo"))


def jql = jqlParser.parseQuery("${ipVal}

def results = searchProvider.search(jql, user, PagerFilter.getUnlimitedFilter())

results.getIssues().each {documentIssue ->

queryIssue = issueManager.getIssueObject(documentIssue.id)
if(queryIssue != null) {
linkManager.createIssueLink(currentIssue.Id, queryIssue.Id, 10309, 1, user )

}
}

Evgenii
Community Champion
July 7, 2023

No, no automation for server.

Ok, then let it be script. I will send it later

uvo3 main public name
Contributor
July 7, 2023

Thank in advance.
The script was detected in community as example doesn't work for me and it not complete all needs:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.user. ApplicationUser
def issueManager = ComponentAccessor.getIssueManager()
def currentIssue = issueManager.getIssueObject("TEST-11")
//def currentIssue = event.getIssue()
def linkManager = ComponentAccessor.getIssueLinkManager()
def cfm = ComponentAccessor.getCustomFieldManager()
def jqlParser = ComponentAccessor.getComponent(JqlQueryParser)
def searchProvider = ComponentAccessor.getComponent(SearchProvider)
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() as ApplicationUser
def queryIssue
def ipVal = currentIssue.getCustomFieldValue(cfm.getCustomFieldObjectByName("Coomon field"))


def jql = jqlParser.parseQuery("${ipVal}

def results = searchProvider.search(jql, user, PagerFilter.getUnlimitedFilter())

results.getIssues().each {documentIssue ->

queryIssue = issueManager.getIssueObject(documentIssue.id)
if(queryIssue != null) {
linkManager.createIssueLink(currentIssue.Id, queryIssue.Id, 10309, 1, user )

}
}

Evgenii
Community Champion
July 7, 2023

I think, something like this, added to postfunction, will work

/*
* Created 2023.
* @author Evgeniy Isaenkov
* @github https://github.com/Udjin79/SRUtils
*/

import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.search.SearchResults
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.query.Query

JqlQueryParser jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser) as JqlQueryParser
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()
SearchService searchService = ComponentAccessor.getComponent(SearchService)

Issue issue = issue as Issue
// Set custom field name, you're looking
String fieldName = "Common Field"
CustomField cf = customFieldManager.getCustomFieldObject(fieldName)
def cfValue = issue.getCustomFieldValue(cf)

// Set link sequence and link type ID
Long sequence = 1L
Long linkType = 10000L

ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()

// This JQL will look for issues with similar custom fields
String jql = "project = '${issue.getProjectObject().name}' AND key != ${issue.key} AND '${fieldName}' = '${cfValue}'"
Query query = jqlQueryParser.parseQuery(jql)
SearchResults search = searchService.search(user, query, PagerFilter.getUnlimitedFilter())
List<Issue> foundIssues = search.results

foundIssues.each { Issue foundIssue ->
ComponentAccessor.issueLinkManager.createIssueLink(issue.id, foundIssue.id, linkType, sequence, user)
}

0 votes
Answer accepted
uvo3 main public name
Contributor
July 10, 2023

My pleasure Evgeniy!

Big thanks for my problem solving.
The script works great.

One more thing : As part of assignments How does update a couple fields in New ticket from Old automatically.
For example: Update custom TEXT field in New ticket called INFO with value from Old ticket TEXT field called the same INFO
Could you please to share same example too

Evgenii
Community Champion
July 10, 2023

Hi, @uvo3 main public name 

Yes, sure

/*
* Created 2023.
* @author Evgeniy Isaenkov
* @github https://github.com/Udjin79/SRUtils
*/

import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.event.type.EventDispatchOption
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.index.IssueIndexingService
import com.atlassian.jira.issue.search.SearchResults
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.query.Query

JqlQueryParser jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser) as JqlQueryParser
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()
SearchService searchService = ComponentAccessor.getComponent(SearchService)
IssueManager issueManager = ComponentAccessor.getIssueManager()
IssueIndexingService issueIndexingService = ComponentAccessor.getComponent(IssueIndexingService)

MutableIssue issue = issue as MutableIssue
// Set custom field name, you're looking

CustomField cf = customFieldManager.getCustomFieldObject("Common Field")
CustomField cfToCopy1 = customFieldManager.getCustomFieldObject("Common Field 1")
CustomField cfToCopy2 = customFieldManager.getCustomFieldObject("Common Field 2")
def cfValue = issue.getCustomFieldValue(cf)

// Set link sequence and link type ID
Long sequence = 1L
Long linkType = 10000L

ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()

// This JQL will look for issues with similar custom fields
String jql = "project = '${issue.getProjectObject().name}' AND key != ${issue.key} AND '${fieldName}' = '${cfValue}'"
Query query = jqlQueryParser.parseQuery(jql)
SearchResults search = searchService.search(user, query, PagerFilter.getUnlimitedFilter())
List<Issue> foundIssues = search.results

if (foundIssues) {
Issue foundIssue = foundIssues.first()
def cfToCopy1Value = foundIssue.getCustomFieldValue(cfToCopy1)
def cfToCopy2Value = foundIssue.getCustomFieldValue(cfToCopy2)

ComponentAccessor.issueLinkManager.createIssueLink(issue.id, foundIssue.id, linkType, sequence, user)
issue.setCustomFieldValue(cfToCopy1, cfToCopy1Value)
issue.setCustomFieldValue(cfToCopy2, cfToCopy2Value)
issueManager.updateIssue(user, issue, EventDispatchOption.DO_NOT_DISPATCH, false)
issueIndexingService.reIndex(issue)
}

uvo3 main public name
Contributor
July 10, 2023

Hi, Evgeniy

awesome.
The script works accurately.
Many thanks for you support.

Like Evgenii likes this
0 votes
uvo3 main public name
Contributor
July 7, 2023

duplicated comment

Suggest an answer

Log in or Sign up to answer
DEPLOYMENT TYPE
SERVER
VERSION
8
TAGS
AUG Leaders

Atlassian Community Events