2 回答
- 10-1
親チケットの管理番号はテキストフィールド(1行)タイプで、スクリプトで管理番号の値を一旦Integer.parseIntを
使って数値にキャストしインクリメントした値を再度文字列toString()にキャストしていましたが、Integer.parseIntでエラーが出ていました。
親チケットの非表示項目の値を取得した時にnullになっているのでコケたってことですね。
非表示項目の値の取得方法はどのように行えばよいかご教示ください。
エラーは下記のような感じです。2018-10-17 09:41:14,686 ERROR [runner.AbstractScriptListener]: Script function failed on event: com.atlassian.jira.event.issue.link.IssueLinkCreateEvent, file: <inline script> java.lang.NumberFormatException: For input string: "null" at java_lang_Integer$parseInt.call(Unknown Source) at Script3140.run(Script3140.groovy:49)
- 樋口晃
フィールド設定で非表示にする場合では無くて、画面でから削除するという事では如何でしょうか?
- だい
樋口晃 さん
フィールドは非表示ではなく、画面から削除しております。
ためしにScript Consoleで作成した親チケットの管理番号を取得してみたのですが、画面削除時はnullで画面表示時は設定した値が返ってきます。下記スクリプトです。
import com.atlassian.jira.compornent.CompornentAccesor; import com.atlassian.jira.issue.CustomFieldManager; import com.atlassian.jira.issue.fields.CustomField; import com.atlassian.jira.issue.Issue; Issue issue = CompornentAccesor.getIssueManeger().getIssueObject(<チケットのキー番号>); CustomFieldManager customFieldManager = CompornentAccesor.getCustomFieldManager(); CustomField customField = customFieldManager.getCustomFieldObject(<カスタムフィールドID>); String str = issue.getCustomFieldValue(customField); return str.toString();
- Shuzaburo Doba
うーん...
私はフィールド設定で表示になっていて
画面からフィールドをはずすだけでしたら
値は取得できているように感じるのですが...なにか違うのでしょうか...
import com.atlassian.jira.component.ComponentAccessor; import com.atlassian.jira.issue.IssueManager; import com.atlassian.jira.issue.CustomFieldManager; import com.atlassian.jira.issue.fields.CustomField; import com.atlassian.jira.issue.Issue; IssueManager issueManager = ComponentAccessor.getIssueManager(); CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager(); Issue issue = ComponentAccessor.getIssueManager().getIssueObject(<課題キー>); CustomField customField = customFieldManager.getCustomFieldObject(<フィールド ID>); String fieldValue = issue.getCustomFieldValue(customField); return fieldValue.toString();
- だい
JIRA と Script Runner のバージョンはそれぞれいくつでしょうか?
JIRAのバージョン:7.8.2
Script Runnerのバージョン:5.4.12
です。あと、画面から削除しても検索画面で「コラム」の追加をすれば、管理番号 は見れますか?
これってチケット編集画面で「フィールドの設定」ボタンで出てくる表示フィールド-カスタムで出てくるかってことですか?だとしたら出てきません。
フィールドヘルパーからは検索できます。
検索画面がどこにあるかも良くわかっていないのですが、
検索画面からコラムの追加手順がわからないのでご教示ください。 - だい
補足ですがJIRAはクラウド版です。
- 樋口晃
JIRA の画面のメニューバーから「課題」=>「課題の検索」を選ぶと下記の画面が表示されます。この画面で、画面右上の「コラム」というボタンを押すと、表示するフィールドを追加する事ができあます。こちらで見て頂ければ、画面から削除されても課題に値は保持されているという事を確認できると思います。
- 樋口晃
補足ですがJIRAはクラウド版です。
7.8.2 だと Server版だと思いますが、こちらのバージョン番号はどの様に確認されたのでしょうか?
- だい
ご教示ありがとうございます。
課題管理番号のコラム追加はできましたが、空欄表示で値は入ってなさそうです。
諸事情によりスクリーンショット添付できません、すみません。
ヘルプデスクでこの問い合わせを受け付けていただけるのであれば、添付貼れます。 - だい
7.8.2 だと Server版だと思いますが、こちらのバージョン番号はどの様に確認されたのでしょうか?
管理画面の[アプリケーション]→[バージョンとライセンス]に表示されているものです。
(JIRA Software 7.8.2)
さらに申しますと、[システム]-[システム情報]のJIRA情報でも同じもの(バージョン 7.8.2)が表示されていました。 - だい
すみません。クラウド版ではなくリッククラウドでサーバ版でした。
混乱させてしまい申し訳ございません。 - だい
親課題作成時にScript Listenerで課題管理番号に1をセットしています。
フィールドの既定値としては設定していません。 - だい
記憶が曖昧ですが、画面で非表示にすると初期値が入らないというバグだか、機能制限が有った様な気がしますので、確認をお願いします。
以下かと思いますが、
https://ja.confluence.atlassian.com/adminjiracloud/changing-a-field-configuration-844500798.htmlこれはフィールド設定の表示画面でのアクション(表示/非表示)のことと認識しました。
今回はアクションは「表示」でどの画面にも関連付けない状態なのでこれではないのでしょうね。 - 樋口晃
親課題作成時にScript Listenerで課題管理番号に1をセットしています。
ありがとうございました。整理すると、
- 課題タイプ = 親課題 の場合、Issue Create のイベント・リスナーで 課題管理番号に 1 をセットする処理をしている。
- IssueLinkCreateEnevtで子チケット作成時に親課題の課題管理番号を取得しようとしているが失敗している。原因は、スクリプト内で親課題の課題管理番号の取得ができないから。
- 調べて見たら、親課題の課題管理番号に値がセットされていなかった。
という事で、親課題の 「Issue Create 」イベントのリスナーでの番号設定ができていないという事ですね。
こちらは、イベント自体が動かないのか、イベントは動いているけど処理に失敗しているのかどちらでしょうか?
- だい
画面(作成、編集、表示)にフィールド表示有無の各パターンで検証した結果、
編集画面に課題管理番号フィールドがない場合はエラー(前述コメントのparseIntエラー)、
編集画面に関連付けられている場合(編集画面にフィールド表示有の場合)は
正常終了(子チケットで採番できた)でした。
イベント自体はどのパターンでも動いているようです。■パターン(親のフィールド表示有無ごとに子でIssueLinkCreateEnevtイベントのリスナー動かしてみる)
作成|編集|表示|結果
なし|なし|なし|イベント動作してエラー
あり|なし|なし|イベント動作してエラー
なし|あり|なし|イベント動作して正常終了
なし|なし|あり|イベント動作してエラー
親の編集画面にフィールド表示がないとダメってことですかね。 - 樋口晃
だい さん
ご教示ありがとうございます。
課題管理番号のコラム追加はできましたが、空欄表示で値は入ってなさそうです。という事で、
親課題作成時にScript Listenerで課題管理番号に1をセットしています。
だったので、課題作成時に Script Listener で設定している方が問題なかと思ったのですが、IssueLinkCreateEnevt の方を調査されているので、私が勘違していたという事でしょうか。
今回調査されたパターンで
- 作成:なし
- 編集:なし
- 表示:あり
で、イベント動作してエラーとなっています。こちらの場合は、親の画面には課題管理番号が表示されているのに、IssueLinkCreateEnevt のスクリプトでは値の取得に失敗しているという事でしょうか? - だい
話がごちゃごちゃになってしまったので一旦整理します。
①親チケットではIssueLinkCreateEnevt(チケット作成時)で課題管理番号1をセット、更新します。
②子チケットではIssueLinkCreateEnevtで親の課題管理番号を取ってきて、
自分の課題番号としてセット、更新します。
合わせて番号を取ってきた親の課題管理番号をインクリメントして親チケットも更新します。
今回パターンテストしたのは、親の課題管理番号を表示/非表示にした場合に子チケットのリスナーが正しく動作するか否かの確認です。
ご照会のあった親の画面には課題管理番号が表示されているのに、IssueLinkCreateEnevt のスクリプトでは値の取得に失敗しているという事でしょうか?
はその通りで、親画面に課題管理番号が表示されていますが、リスナー②がエラーになっています。
- Shuzaburo Doba
以下の内容を IssueLinkCreateEvent で設定するといかがでしょうか...?
一旦他の Listener はオフにして、下記一つでお試しいただいてもよろしいでしょうか。
import com.atlassian.jira.component.ComponentAccessor; import com.atlassian.jira.issue.IssueManager; import com.atlassian.jira.issue.CustomFieldManager; import com.atlassian.jira.issue.fields.CustomField; import com.atlassian.jira.issue.Issue; import com.atlassian.jira.issue.MutableIssue; import com.atlassian.jira.event.type.EventDispatchOption; import com.atlassian.jira.issue.link.IssueLink; if (event.getIssueLink().getIssueLinkType().getName() == "jira_subtask_link") { IssueManager issueManager = ComponentAccessor.getIssueManager(); CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager(); CustomField customField = customFieldManager.getCustomFieldObject(<フィールド ID>); Issue issue = event.getIssueLink().getSourceObject(); MutableIssue parentIssue = issueManager.getIssueObject(issue.getKey()); Issue issue2 = event.getIssueLink().getDestinationObject(); MutableIssue subTask = issueManager.getIssueObject(issue2.getKey()); //親課題の値を取得 String parentValue = parentIssue.getCustomFieldValue(customField).toString(); // 値がまだない場合は 1 を設定する if (parentValue == "null") { parentValue = "1"; } // サブタスクに値を設定 subTask.setCustomFieldValue(customField, parentValue); issueManager.updateIssue(issue.getCreator(), subTask, EventDispatchOption.DO_NOT_DISPATCH, false); // 親課題の値をインクリメントして更新 parentIssue.setCustomFieldValue(customField, Integer.toString(++Integer.parseInt(parentValue))); issueManager.updateIssue(parentIssue.getCreator(), parentIssue, EventDispatchOption.DO_NOT_DISPATCH, false); }
最初のサブタスク作成時だったら親課題に「1」を設定して
それ以降は増えていくようになっています。画面にフィールドが 有/無 に関わらずうまくいったように思えたのですが...
コメントを追加... - 10-1
だい さん
フィールドを追加したり、削除したりしてもイベントは発行されてリスナーは動作すると思います。管理画面のアドオン=>SCRIPT RUNNER=>Script Listeners の History に情報は増ませんか?
例えば、リスナーのスクリプトの先頭に下記の記載を入れても確認できませんか?
log.error("start script ----------");
コメントを追加...
親チケットのカスタムフィールドに「課題管理通番」を持たせ、その配下に子チケットを作成時に
親チケットで持っている番号を子チケットに付与する仕組みで、
Script ListenerのIssueLinkCreateEnevtで子チケット作成時に管理通番を取ってきて、
子チケットフィールドにセット・更新した後、親チケットの管理通番をインクリメント・更新するスクリプトを組んでいます。
親チケットの管理通番は見せなくてもよい項目なので非表示にしたいのですが、
非表示にするとリスナーが動いていないようです。
フィールド設定で画面に追加しないにしても項目非表示にしてもうまくいきません。
解決策をご教示ください。
ちなみにフィールドを表示している場合はちゃんと意図通りに動いてくれます。
一応過去質問で類似があり参考にさせていただきましたが、ダメでした。。。
フィールド設定の表示/非表示と画面へのフィールド追加/削除の違いは何ですか?