3 回答
- 210
こちらは JIRA の機能だけではできません。方法はいくつかありますが、例えば下記のアドオンを使ってスクリプトを書くという方法ならやった事が有ります。
- Script Runner for JIRA
- Jira Misc Custom Fields
上記のアドオンを利用するためには、Groovy か Java でスクリプトを書く必要が有ります。サンプルを見て、JIRA API を利用する必要が有ります。
コメントを追加... - 10-1
Listenerとして親チケットのIssueUpdateイベントで配下の子チケットをすべて更新するので、IssueInputParametersを使って一括更新を試みたのですが、リストフィールドが更新できませんでした。
APIを見るとaddCustomFieldValueメソッドの引数は「Long カスタムフィールドID、String 設定値」となっているので、テキストフィールドと同じやりかたではだめなのでしょう。
どのクラス、メソッドを使えばいいのでしょうかね。
- Shuzaburo Doba
以下の内容を Listener に設定して
親チケットの選択リストのオプションをサブタスクにも反映させられたように思いますが
いかがでしょうか...?import com.atlassian.jira.component.ComponentAccessor; import com.atlassian.jira.issue.CustomFieldManager; import com.atlassian.jira.issue.fields.CustomField; import com.atlassian.jira.issue.Issue; import com.atlassian.jira.issue.customfields.option.Option; import java.util.List; import com.atlassian.jira.issue.ModifiedValue; import com.atlassian.jira.issue.util.DefaultIssueChangeHolder; CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager(); CustomField customField = customFieldManager.getCustomFieldObject(<カスタムフィールドID>); // サブタスクを取得 List<Issue> subTasks = issue.getSubTaskObjects(); // 親課題のオプションを取得 Option parentFieldValue = issue.getCustomFieldValue(customField); for (Issue subTask : subTasks) { ModifiedValue modifiedValue = new ModifiedValue(subTask.getCustomFieldValue(customField), parentFieldValue); customField.updateValue(null, subTask, modifiedValue, new DefaultIssueChangeHolder()); }
- 樋口晃
Shuzaburo Doba さんのスクリプトでも良いと思うのですが、イベントリスナーだと複数リスナーが入っているとタイミングにより動作が変わるので、個人的にあまり好きではないです。Script Fieldでサブタスク用の選択リストを Script Runner の Script Field で作成して下記のスクリプトを設定したら実行できました。
カスタムフィールドIDは、管理画面でカスタムフィールドの編集画面を開いた時に URL にecure/admin/EditCustomField!default.jspa?id=xxx と表示されるので確認する事ができます。
この案の欠点は、親チケットと子チケットでフィールドが違うという事です。課題一覧で見た時に不便です。
import com.atlassian.jira.component.ComponentAccessor; import com.atlassian.jira.issue.fields.CustomField; import com.atlassian.jira.issue.CustomFieldManager; import com.atlassian.jira.issue.Issue; import com.atlassian.jira.issue.IssueManager; String getParentValues(Issue issue,parentFieldId){ IssueManager issueManager = ComponentAccessor.getIssueManager(); Issue parentIssue = issue.getParentObject(); if(parentIssue == null) return ""; CustomField customField = ComponentAccessor.getCustomFieldManager().getCustomFieldObject("customfield_" + parentFieldId); if (customField == null) return ""; return parentIssue.getCustomFieldValue(customField); } getParentValues(issue, "選択リストのカスタムフィールドID");
- だい
親チケットのIssueUpdateイベントで子チケットのリストの値を更新しようと考えていました。
他のリスナーではリストの値を変更したり取得したりすることはしないのですが、
リスナーの動作タイミングって影響するものなのでしょうか?あと、Script Fieldでリストってどうやって作成するのでしょう?
テンプレートではそのような選択できなさそうですが。Custom選択ですか?樋口晃さんのスクリプトはCustom Script FieldのInlineスクリプトに記述すればいいのですよね。
- だい
Shuzaburo Dobaさんのスクリプトの15行目、17行目のissueが定義されてないと怒られます。
何がいけないのでしょう。。。 - Shuzaburo Doba
issue が怒られるというのは
以下のような状態でしょうか...?
ScriptRunner で内部的に issue は取得してくれるので
そのまま Add しちゃって問題ないかと思います。 - だい
エラー.pngの通りです。
なるほど、undeclaredってエラーメッセージにあったので未定義エラーで動かないのかと思ってしまいました。
ちょっと動かしてみます。
コメントを追加... - 10-1
ScriptRunner導入しました。
カスタムフィールドのオプションで
1. 東京
2. 大阪
の設定をしてみましたが、groovy等に不慣れなこともあり、どのようなスクリプトを組めばいいのかよくわかりません。
親チケットのリスト設定値は取得することができたのですが、親の情報を子にセットするにはどのように組めばいいでしょうか?
以下リスト設定値を取得した際のスクリプトです。
import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.fields.CustomField import com.atlassian.jira.issue.Issue Issue issue = ComponentAccessor.getIssueManager().getIssueObject("<課題番号>") CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager() CustomField customField = customFieldManager.getCustomFieldObject(<カスタムフィールドID>) String str = issue.getCustomFieldValue(customField ) return str.toString()
コメントを追加...
子チケット作成・更新時に親チケットでの単一選択リストの値をセットしたいのですがどのようにすればよいでしょうか?
例えば選択リストが
東京
大阪
となっていて、親チケットで「東京」が設定されているとき、子チケット作成時に「東京」と表示したいです。
また、親チケットの値を「大阪」に更新したとき、子チケットすべても「大阪」に更新したいのですが、
こちらの方法もご教示ください。