You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Jira Cloud版ScriptRunner监听器Groovy脚本实现字段自动赋值

Jira Service Management Cloud:ScriptRunner监听器实现级联字段驱动的字段自动赋值

需求概述

使用Jira Service Management Cloud版本,已授权ScriptRunner,需替换原Jira自动化规则:根据级联字段Issue category/sub-category的取值,自动为Functional area和Resolver group两个自定义字段赋值。

现有问题

原Jira自动化采用IF-ELSE逻辑实现,但单规则条件上限为65个,无法覆盖全部业务场景。已成功用ScriptRunner监听器完成简单需求,但未找到适配该多条件场景的实现方案。

原自动化规则逻辑片段

project = "Sigma SDM " AND issuetype in (Incident, "Service Request with Approvals", Problem) AND
"Issue category" in cascadeOption ("Application (Non-SAP)", "MedAdvisor") OR
"Issue category" in cascadeOption ("Application (Non-SAP)", "Fred") OR
...(省略其余同组子分类)

  • Functional area: Commercial / Resolver group: IT Commercial

project = "Sigma SDM " AND issuetype in (Incident, "Service Request with Approvals", Problem) AND
"Issue category" in cascadeOption ("Application (Non-SAP)", "Salesforce")

  • Functional area: Commercial / Resolver group: IT Salesforce

project = "Sigma SDM " AND issuetype in (Incident, "Service Request with Approvals", Problem) AND
"Issue category" in cascadeOption ("Application (SAP)", "Concur")

  • Functional area: Corporate / Resolver group: SAP Concur

project = "Sigma SDM " AND issuetype in (Incident, "Service Request with Approvals", Problem) AND
"Issue category" in cascadeOption ("Application (SAP)", "OpenText") OR
...(省略其余同组子分类)

  • Functional area: Corporate / Resolver group: SAP Finance Management

ScriptRunner Groovy脚本实现

以下是适配需求的Groovy脚本,可直接在ScriptRunner监听器中使用:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.fields.CustomField

// 获取Jira核心组件
def issue = event.issue as MutableIssue
def customFieldManager = ComponentAccessor.customFieldManager
def issueService = ComponentAccessor.issueService
def currentUser = ComponentAccessor.jiraAuthenticationContext.loggedInUser

// 定义目标字段(替换为你的字段ID或名称,确保与Jira实例一致)
def issueCategoryField = customFieldManager.getCustomFieldObjectsByName("Issue category").first()
def functionalAreaField = customFieldManager.getCustomFieldObjectsByName("Functional area").first()
def resolverGroupField = customFieldManager.getCustomFieldObjectsByName("Resolver group").first()

// 过滤目标项目与工单类型
def targetProjectName = "Sigma SDM"
def targetIssueTypes = ["Incident", "Service Request with Approvals", "Problem"]
if (issue.projectObject.name != targetProjectName || !targetIssueTypes.contains(issue.issueType.name)) {
    return // 不符合条件直接退出脚本
}

// 获取级联字段的父、子选项值
def cascadeValue = issue.getCustomFieldValue(issueCategoryField)
if (!cascadeValue) {
    return // 级联字段为空时不执行赋值逻辑
}
def parentCategory = cascadeValue.parentOption.value
def subCategory = cascadeValue.value

// 定义分类与目标字段的映射关系,可根据业务需求扩展
def categoryMapping = [
    // 非SAP应用分类组
    "Application (Non-SAP)": [
        // 多个子分类对应同一赋值
        ["MedAdvisor", "Fred", "HealthEngine", "KIA", "LAMLab", "Last Yard", "LOTS", "MINFOS", "Navision", "Plexus", "RPM", "Snap'n'Share", "Z", "Blueprint", "Corum", "JDA", "Qualtrics", "SpaceMan", "Wageloch", "eCommerce AMCAL/DDS"]: [
            functionalArea: "Commercial",
            resolverGroup: "IT Commercial"
        ],
        // 单个子分类对应独立赋值
        "Salesforce": [
            functionalArea: "Commercial",
            resolverGroup: "IT Salesforce"
        ]
    ],
    // SAP应用分类组
    "Application (SAP)": [
        "Concur": [
            functionalArea: "Corporate",
            resolverGroup: "SAP Concur"
        ],
        ["OpenText", "FICO", "Finance Supply", "Finance Tech"]: [
            functionalArea: "Corporate",
            resolverGroup: "SAP Finance Management"
        ]
        // 可继续添加更多分类映射规则
    ]
]

// 匹配映射关系并更新字段
def parentMap = categoryMapping[parentCategory]
if (parentMap) {
    def targetValues = parentMap.find { key, value ->
        // 匹配子分类:支持列表或单个值匹配
        key instanceof List ? key.contains(subCategory) : key == subCategory
    }?.value
    
    if (targetValues) {
        // 设置Functional area字段
        def functionalAreaOption = functionalAreaField.configs.first().options.find { it.value == targetValues.functionalArea }
        if (functionalAreaOption) {
            issue.setCustomFieldValue(functionalAreaField, functionalAreaOption)
        }
        
        // 设置Resolver group字段
        def resolverGroupOption = resolverGroupField.configs.first().options.find { it.value == targetValues.resolverGroup }
        if (resolverGroupOption) {
            issue.setCustomFieldValue(resolverGroupField, resolverGroupOption)
        }
        
        // 保存工单更新
        def issueInputParameters = issueService.newIssueInputParameters()
        issueInputParameters.setSkipScreenCheck(true)
        def updateValidationResult = issueService.validateUpdate(currentUser, issue.id, issueInputParameters)
        if (updateValidationResult.isValid()) {
            issueService.update(currentUser, updateValidationResult)
        }
    }
}

监听器配置步骤

  1. 进入ScriptRunner管理界面,选择Listeners -> Create Listener
  2. 选择触发事件:Issue Updated
  3. 添加触发条件(可选但推荐):仅当Issue category字段被修改时执行,可通过ScriptRunner条件编辑器设置
  4. 将上述脚本粘贴到脚本输入框,替换脚本中字段名称、项目名称、分类映射等与你的Jira实例匹配的内容
  5. 保存并启用监听器

内容的提问来源于stack exchange,提问作者user3699338

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:46:06