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

Script for retrieving Advanced Roadmap Team members

Viktoria January 31, 2025 edited

Hello everyone,
I spent a lot of time trying to figure out how to work with the Team field of the Advanced Roadmap plugin, so I share here some useful info.

Methods for the Team: https://docs.atlassian.com/portfolio-for-jira-server/javadoc/9.12.0/overview-summary.html

REST API (and also a useful scheme for understanding how to use methods): https://docs.atlassian.com/portfolio-for-jira-server/REST/9.15.0/teams/#/definitions/TeamDTO

Script for finding team id and name:

import com.onresolve.scriptrunner.runner.customisers.WithPlugin

import com.onresolve.scriptrunner.runner.customisers.PluginModule

import com.atlassian.rm.teams.api.team.GeneralTeamService

 

@WithPlugin("com.atlassian.teams")

@PluginModule GeneralTeamService teamService


def teams = teamService.getAllShareableTeams()

if (!teams) {

    log.warn("No teams found in Advanced Roadmaps")

    return

}

 

teams.each { teamId, team ->

    def title = team.getDescription()?.getTitle() ?: "No title found"

    log.warn("${teamId}: ${title}")

}
Script to check whether assignee is member of the Advanced Roadmaps Teams (particular teams) and if so, set this Team to the issue (it can be more optimized, ask chatGPT):
import com.onresolve.scriptrunner.runner.customisers.WithPlugin

import com.onresolve.scriptrunner.runner.customisers.PluginModule

import com.atlassian.jira.component.ComponentAccessor

import com.atlassian.jira.issue.MutableIssue

import com.atlassian.rm.teams.api.team.GeneralTeamService

import com.atlassian.jira.user.ApplicationUser

import com.atlassian.jira.issue.fields.CustomField

import com.atlassian.jira.event.type.EventDispatchOption

 

@WithPlugin("com.atlassian.teams")

@PluginModule GeneralTeamService teamService

 

// List of target team IDs

def targetTeamIds = [256, 257, 258, 259, 260, 261, 262]

 

// Map to store users by team ID (userKey of users)

def teamUsersMap = [:]

 

// Get UserManager for retrieving ApplicationUser

def userManager = ComponentAccessor.getUserManager()

 

// Get all teams

def teams = teamService.getAllShareableTeams()

 

if (!teams) {

    log.warn("No teams found in Advanced Roadmaps")

    return

}

 

teams.each { teamId, team ->

    // Log to check the data type of team ID

    log.warn("Team ID type: ${teamId.getClass().name}, Team ID value: ${teamId}")

 

    // Convert teamId to the correct type for comparison

    def teamIdString = teamId.toString()

 

    // Check if teamId is in the list of targetTeamIds

    if (teamIdString in targetTeamIds.collect { it.toString() }) {

        def title = team.getDescription()?.getTitle() ?: "No title found"

        log.warn("Team ID: ${teamId}, Team Name: ${title}")

 

        // Map to store userKey of users in the current team

        def usersInTeam = []

 

        // Get team resources (persons associated with the team)

        def resources = team.getResources()

        resources.each { resource ->

            def person = resource.getPerson()

 

            // Get person ID (if available)

            def personId = person?.getId() ?: "No person ID"

            // Get jiraUser via getDescription()

            def personDescription = person?.getDescription()

            def jiraUserString = personDescription?.getJiraUser()?.orNull()

 

            // Convert jiraUserString (userKey) to ApplicationUser

            def jiraUser = userManager.getUserByKey(jiraUserString)

 

            if (jiraUser) {

                def userKey = jiraUser.getKey()  // Get userKey of the user

                usersInTeam << userKey

                log.warn("Resource ID: ${resource.getId()}, Person ID: ${personId}, Jira User Key: ${userKey}")

            } else {

                log.warn("No ApplicationUser found for ${jiraUserString}")

            }

        }

 

        // Add the list of users to the map with the team ID as the key

        teamUsersMap[teamId] = usersInTeam

    }

}

 

// Log the users in teams map

log.warn("Users in teams: ${teamUsersMap}")

 

// Get the issue key

def issueKey = "TEST-1111"  // Replace with the real issue key

 

// Get the issue by key

def issueManager = ComponentAccessor.getIssueManager()

MutableIssue issue = issueManager.getIssueObject(issueKey)

 

if (!issue) {

    log.warn("Issue ${issueKey} not found")

    return

}

 

// Get the assignee of the issue

def assignee = issue.getAssignee()

 

if (!assignee) {

    log.warn("No assignee found for issue ${issueKey}")

    return

}

 

// Get the userKey of the assignee

def assigneeUserKey = assignee.getKey()

 

// Check if the assignee is in any of the teams

def isAssigneeInTeam = false

def targetTeamId = null

teamUsersMap.each { teamId, users ->

    if (assigneeUserKey in users) {

        log.warn("Assignee ${assigneeUserKey} is in team ${teamId}")

        isAssigneeInTeam = true

        targetTeamId = teamId // Store the team ID

    }

}

 

def targetTeam = teams[targetTeamId.find { it in teams.keySet() }] // Get the team by ID from targetTeamIds

 

if (isAssigneeInTeam) {

    // Get the custom field Team (customfield_11111)

    def customFieldManager = ComponentAccessor.getCustomFieldManager()

    CustomField teamField = customFieldManager.getCustomFieldObject("customfield_11111")

 

    if (teamField) {

        // Update the Team field with the team ID

        issue.setCustomFieldValue(teamField, targetTeam)

         

        // Use EventDispatchOption to update the issue

        issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), issue, EventDispatchOption.ISSUE_UPDATED, false)

         

        log.warn("Team field (customfield_11111) updated with team ID: ${targetTeam}")

    } else {

        log.warn("Team custom field (customfield_11111) not found")

    }

} else {

    log.warn("Assignee ${assigneeUserKey} is not in any of the target teams")

}

0 answers

Suggest an answer

Log in or Sign up to answer
TAGS
atlassian, team '25, conference, certifications, bootcamps, training experience, anaheim ca,

Want to make the most of Team ‘25?

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
AUG Leaders

Upcoming Jira Events