请求协助修复Youtrack工作流:将问题开始日期设为冲刺开始日期
问题排查与修复方案
针对你遇到的三个问题,逐个修复如下:
1. Requirements未生效的问题
Sprints字段在YouTrack中是专属的Sprint类型字段,而非枚举字段(EnumField),原代码中type配置错误,导致Requirements校验不通过。
2. Guard判断不正确的问题
原Guard仅判断字段是否变更,但未先校验字段是否存在;同时对于多值字段,建议补充判断变更后的值非空,避免无意义的执行。
3. 无法获取正确Sprint开始日期的问题
iterator().next()返回的是迭代器结果对象(包含value和done属性),直接赋值会拿到错误的对象而非Sprint实例;另外建议优先取当前活跃的Sprint,避免取到已归档或未开始的Sprint。
修复后的完整代码
const entities = require('@jetbrains/youtrack-scripting-api/entities'); const workflow = require('@jetbrains/youtrack-scripting-api/workflow'); exports.rule = entities.Issue.onChange({ title: 'Set StartDate to Sprint Start Date', guard: (ctx) => { // 先校验字段存在,再判断Sprints字段是否变更且变更后非空 return ctx.Sprints && ctx.issue.fields.isChanged(ctx.Sprints) && !ctx.issue.fields.Sprints.isEmpty(); }, action: (ctx) => { const issue = ctx.issue; // 优先获取当前活跃的Sprint const activeSprint = issue.fields.Sprints.find(sprint => sprint.state === ctx.Sprint.State.ACTIVE); // 如果没有活跃Sprint,取第一个关联的Sprint const targetSprint = activeSprint || issue.fields.Sprints.first(); if (targetSprint && targetSprint.startDate) { issue.fields.StartDate = targetSprint.startDate; workflow.message('Start date set to {0}', targetSprint.startDate.toLocaleString()); } else { workflow.message('No valid active sprint with start date found'); } }, requirements: { Sprints: { type: entities.Sprint.fieldType, // 修正为Sprint专属字段类型 name: 'Sprints', isMultiValue: true }, StartDate: { type: entities.Field.dateTimeType, name: 'StartDate' } } });
关键修复点说明
- Requirements修正:将Sprints的
type改为entities.Sprint.fieldType,匹配YouTrack的Sprint字段类型。 - Guard优化:增加字段存在校验,同时确保变更后的值非空,避免无效触发。
- Sprint获取逻辑:
- 使用
find方法筛选活跃状态的Sprint,更符合业务需求; - 用
first()替代迭代器,简化第一个Sprint的获取; - 增加对
startDate存在性的判断,避免赋值空值; - 用
toLocaleString()优化日期显示格式。
- 使用
内容的提问来源于stack exchange,提问作者idefixcert
相关产品推荐
相关产品推荐

