ストップウォッチ式の作業タイマー
このワークフローにより、課題の処理に費やされた時間を追跡するタイマーが有効になります。動作は進行中の作業タイマーに似ています。このワークフローでは、状態の値を使用してタイマーを開始および停止する代わりに、独立したタイマーフィールドの値を使用します。
状態フィールドの値に影響を与えることなく、課題の処理に費やした時間を追跡する場合は、このワークフローを使用します。
このワークフローを有効にするには
プロジェクトのタイムトラッキングを有効にして構成します。手順については、タイムトラッキングを有効にする説明を参照してください。
タイマーという名前の enum タイプを格納するフィールドをプロジェクトに追加します。
単一の値を格納するようにフィールドを構成します。
空の値を許可するようにフィールドを構成します。
値開始および停止をフィールドに追加します。
タイマー時間という名前の date and time タイプを保存するフィールドをプロジェクトに追加します。
ストップウォッチ式の作業タイマーワークフローをプロジェクトにアタッチしてください。
ユースケース
このワークフローにより、課題の処理に費やした時間を追跡するために使用できるタイマーが有効になります。タイマーを停止すると、経過時間が作業項目として課題に自動的に追加されます。
課題の作業を開始するとき、タイマーフィールドの値を開始に設定します。

他の課題の場合と同様に作業を続けます。気晴らしを避けるようにしてください — ウォッチは刻々と過ぎています !
作業が完了したら、タイマーフィールドの値を停止に変更します。

各作業項目には、次の値が割り当てられます。
現在のユーザーが作品の作成者として設定されます。
作業日は、Date.now() メソッドを使用して現在の日付に設定されます。
コメントはタイマーによって自動的に追加されるワークアイテムに設定されます。
経過時間は、タイマー時間フィールドの値と現在の日時の差に基づいて計算されます。デフォルトでは、タイマーは平日の時間のみを記録し、1 日あたりの定義された労働時間を超えることはありません。
ワークフローは、作業タイプを作業項目に割り当てません。特定の作業タイプをプログラムで追加する場合は、タイマーを停止して作業項目を生成する変更時ルールを変更できます。例については、「タイマー」の値が「停止」になったらタイマーを停止するルールの推奨されるカスタマイズを参照してください。
モジュール
このワークフローには 2 つのモジュールがあります。
「タイマー」の値が「開始」になったときにタイマーを開始する
最初のモジュールには、タイマーを開始する変更時ルールが含まれています。
const entities = require('@jetbrains/youtrack-scripting-api/entities');
const workflow = require('@jetbrains/youtrack-scripting-api/workflow');
exports.rule = entities.Issue.onChange({
title: 'Start timer when the value for "Timer" becomes "Start"',
guard: (ctx) => {
return ctx.issue.fields.becomes(ctx.Timer, ctx.Timer.Start);
},
action: (ctx) => {
ctx.issue.fields.TimerTime = Date.now();
workflow.message('The timer is started.');
},
requirements: {
Timer: {
type: entities.EnumField.fieldType,
Start: {}
},
TimerTime: {
type: entities.Field.dateTimeType,
name: 'Timer time'
}
}
});
2 番目のモジュールには、タイマーを停止する変更時ルールが含まれています。経過時間は、作業項目として課題に追加されます。
「タイマー」の値が「停止」になったらタイマーを停止する
const entities = require('@jetbrains/youtrack-scripting-api/entities');
const workflow = require('@jetbrains/youtrack-scripting-api/workflow');
exports.rule = entities.Issue.onChange({
title: 'Stop timer when the value for "Timer" becomes "Stop"',
guard: (ctx) => {
return ctx.issue.fields.becomes(ctx.Timer, ctx.Timer.Stop) && ctx.issue.fields.TimerTime;
},
action: (ctx) => {
const issue = ctx.issue;
if (issue.fields.was(ctx.Timer, ctx.Timer.Start)) {
let duration = issue.project.intervalToWorkingMinutes(issue.fields.TimerTime, Date.now());
if (duration) {
const newWorkItem = {
description: 'The work item automatically added by the timer.',
date: Date.now(),
author: ctx.currentUser,
duration: duration
};
issue.addWorkItem(newWorkItem);
workflow.message('Work time added');
}
} else {
workflow.message('Looks like the timer hasn\'t been started.');
}
},
requirements: {
Timer: {
type: entities.EnumField.fieldType,
Stop: {},
Start: {}
},
TimerTime: {
type: entities.Field.dateTimeType,
name: 'Timer time'
}
}
});
デフォルトのワークフローでは、作業タイプの値は設定されません。このワークフローによって生成される作業項目のデフォルトの作業タイプを設定する場合、このルールをカスタマイズできます。
次のコードは、action プロパティを設定するための代替アプローチを示しています。ここで、workItemType 変数は、現在のプロジェクトで開発という名前の作業項目型を見つけ、それを作業項目に追加します。
action: (ctx) => {
const issue = ctx.issue;
if (issue.fields.oldValue(ctx.Timer).name === ctx.Timer.Start.name) {
const workItemType = entities.WorkItemType.findByProject(ctx.issue.project).find(function (workType) {
return workType.name === 'Development';
});
const newWorkItem = {
description: 'The work item automatically added by the timer.',
date: Date.now(),
author: ctx.currentUser,
type: workItemType,
duration: issue.project.intervalToWorkingMinutes(issue.fields.TimerTime, Date.now())
};
issue.addWorkItem(newWorkItem);
workflow.message('Work time added');
} else {
workflow.message('Looks like the timer hasn\'t been started.');
}
}
2026 年 9 月 10 日