求Jira Cloud版ScriptRunner监听器Groovy脚本实现字段自动赋值
需求概述
使用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) } } }
监听器配置步骤
- 进入ScriptRunner管理界面,选择Listeners -> Create Listener
- 选择触发事件:Issue Updated
- 添加触发条件(可选但推荐):仅当
Issue category字段被修改时执行,可通过ScriptRunner条件编辑器设置 - 将上述脚本粘贴到脚本输入框,替换脚本中字段名称、项目名称、分类映射等与你的Jira实例匹配的内容
- 保存并启用监听器
内容的提问来源于stack exchange,提问作者user3699338

