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

Jira Scriptrunner中如何用Groovy更新Original Estimate且不留变更历史

Scriptrunner Groovy更新Jira Original Estimate无痕迹方案

完整可运行脚本

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.index.IssueIndexingService
import com.atlassian.jira.util.ImportUtils

// 替换为你的目标issue,实际场景可从上下文获取或通过issueKey查询
def issue = ComponentAccessor.issueManager.getIssueObject("TEST-123")
// 新的Original Estimate值,单位为秒,示例为2小时 = 2 * 3600 = 7200秒
def newEstimateSecond = 7200L

// 获取时间跟踪字段实例
def timeTrackingField = ComponentAccessor.fieldManager.timeTrackingField
// 获取当前issue对应的字段布局项
def fieldLayoutItem = ComponentAccessor.fieldLayoutManager.getFieldLayout(issue).getFieldLayoutItem(timeTrackingField)
// 构造ModifiedValue参数:第一个参数为旧值,第二个为新值
def modifiedValue = new ModifiedValue(issue.originalEstimate, newEstimateSecond)

// 执行无痕迹更新:最后一个参数传null即不会生成变更历史记录
timeTrackingField.updateValue(fieldLayoutItem, issue, modifiedValue, null)

// 可选操作:更新后重新索引,保证看板、搜索等场景的值即时同步
boolean originalIndexState = ImportUtils.isIndexIssues()
ImportUtils.setIndexIssues(true)
ComponentAccessor.getComponent(IssueIndexingService).reIndex(issue)
ImportUtils.setIndexIssues(originalIndexState)

注意:脚本运行身份需要拥有目标issue的编辑权限,否则会更新失败

问题解答

  • 如何获取对应Issue的该字段实例?
    Original Estimate属于Jira内置的时间跟踪复合字段,可直接通过ComponentAccessor.getFieldManager().getTimeTrackingField()获取对应的字段实例。再调用ComponentAccessor.getFieldLayoutManager().getFieldLayout(issue).getFieldLayoutItem(时间跟踪字段实例),即可拿到当前issue对应的FieldLayoutItem参数。
  • 代码中的ModifiedValue参数应当如何构造?
    ModifiedValue的构造方法直接接收两个参数,第一个为字段当前旧值,第二个为要设置的新值。Original Estimate在Jira中以秒为单位存储,新旧值均需传入Long类型的秒数:旧值可直接从issue.originalEstimate获取,新值按需求换算为秒数传入即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:36:03