3 回答
- 210
com.atlassian.jira.issue.CustomFieldManager customFieldManager = com.atlassian.jira.component.ComponentAccessor.getCustomFieldManager(); com.atlassian.jira.issue.IssueManager issueManager = com.atlassian.jira.component.ComponentAccessor.getIssueManager(); com.atlassian.jira.issue.fields.layout.field.FieldLayoutManager fieldLayoutManager = com.atlassian.jira.component.ComponentAccessor.getFieldLayoutManager(); //com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject("<課題キー>"); // post-functionの場合は issue オブジェクトが操作された課題オブジェクトで渡される com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject(issue.getId()); com.atlassian.jira.issue.fields.CustomField customField = customFieldManager.getCustomFieldObjectByName('ベースライン開始日(WBSGantt)'); java.util.Date nowTimeDay = org.apache.commons.lang.time.DateUtils.truncate(new java.util.Date(), Calendar.DAY_OF_MONTH); // 2015-10-30 00:00:00 customField.updateValue(fieldLayoutManager.getFieldLayout(issueObject).getFieldLayoutItem(customField), issueObject, new com.atlassian.jira.issue.ModifiedValue(issueObject.getCustomFieldValue(customField), new java.sql.Timestamp(nowTimeDay.getTime())), new com.atlassian.jira.issue.util.DefaultIssueChangeHolder());
ですかね。
post-functionの場合は issue オブジェクトが操作された課題オブジェクトで渡されます。
マニュアルのどこかにも書いてあったのですが・・・・すぐに見つけられないので
あと、日付フィールドは Timestamp型ですね。
- Kengo Ohsaki
見つけられない... https://scriptrunner.adaptavist.com/latest/jira/recipes/workflow/conditions/all-subtasks-resolved.html post-functionの場合は transientVars と issue オブジェクトが変数として引き渡されます。
- RYOITO
ありがとうございます。 できました。
- HINSA
突然に申し訳ございません。
掲示の内容と似たScriptrunnerを使った要件があり、 以下の通り、post-function設定を行ったのですが、UIとして何らObjectが確認できません。最終的にうまくできたとのことですが、どのようなUIが生成されて、どのような動作が確認できたのかにつきまして、差支えなければご教示頂けないでしょうか?Issus > Custom Fields > Add Custom Field > Select a Field Type "Scripted Field"
Issus > Custom Fields > Scripted Field > Configurations > Edit Configuration > Discription > (2015/10/30掲示のコード)コード設定
- RYOITO
HINSAさん
customField1.updateValueでの日付をTimestampで取り扱っていなかったのでエラーになっていました。
Kengo Ohsakiさんからの回答が答えなので…ほぼコピペして作成しました。
- UIはありません。※課題がトランジションされる時に裏で動いてくれるものなので。
- 最後の処理が値をGETするものではなく、カスタムフィールドをUpdateする処理なので、提示されている『Scripted Field』ではおそらく確認も無理かと思います。
確認するのであれば、場所は下の場所ですね。
JIRA Administration > Add-On > Script Console> Ohsakiさんのコード
※テスト時には
//com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject("<課題キー>"); // post-functionの場合は issue オブジェクトが操作された課題オブジェクトで渡される com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject(issue.getId());
を
com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject("<課題キー>"); // post-functionの場合は issue オブジェクトが操作された課題オブジェクトで渡される //com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject(issue.getId());
に変えて、getIssueObject("<課題キー>")の部分を実際に存在する課題IDにする。
例: getIssueObject("ISSUE-140")
【結果】エラーがなく、 null が返ってきます。
ちなみに最終的に出来たものはこんなものです。
com.atlassian.jira.issue.CustomFieldManager customFieldManager = com.atlassian.jira.component.ComponentAccessor.getCustomFieldManager(); com.atlassian.jira.issue.IssueManager issueManager = com.atlassian.jira.component.ComponentAccessor.getIssueManager(); com.atlassian.jira.issue.fields.layout.field.FieldLayoutManager fieldLayoutManager = com.atlassian.jira.component.ComponentAccessor.getFieldLayoutManager(); // 課題指定する場合はこれ使う // com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject("ISSUE-140"); // post-functionの場合は issue オブジェクトが操作された課題オブジェクトで渡されるんだって com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject(issue.getId()); if ("コンポーネント1" in issueObject.componentObjects*.name){ com.atlassian.jira.issue.fields.CustomField customField1 = customFieldManager.getCustomFieldObjectByName('ベースライン開始日(WBSGantt)'); com.atlassian.jira.issue.fields.CustomField customField2 = customFieldManager.getCustomFieldObjectByName('ベースライン終了日(WBSGantt)'); //コンポーネント1は標準で5日間 // e.g.2015-11-02 00:00:00 java.util.Date today = org.apache.commons.lang.time.DateUtils.truncate(new java.util.Date(), Calendar.DAY_OF_MONTH); // e.g.2015-11-06 00:00:00 java.util.Date endDay = org.apache.commons.lang.time.DateUtils.truncate(new java.util.Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 4), Calendar.DAY_OF_MONTH); customField1.updateValue(fieldLayoutManager.getFieldLayout(issueObject).getFieldLayoutItem(customField1), issueObject, new com.atlassian.jira.issue.ModifiedValue(issueObject.getCustomFieldValue(customField1), new java.sql.Timestamp(today.getTime())), new com.atlassian.jira.issue.util.DefaultIssueChangeHolder()); customField2.updateValue(fieldLayoutManager.getFieldLayout(issueObject).getFieldLayoutItem(customField2), issueObject, new com.atlassian.jira.issue.ModifiedValue(issueObject.getCustomFieldValue(customField2), new java.sql.Timestamp(endDay.getTime())), new com.atlassian.jira.issue.util.DefaultIssueChangeHolder()); }else if ("コンポーネント2" in issueObject.componentObjects*.name) { com.atlassian.jira.issue.fields.CustomField customField1 = customFieldManager.getCustomFieldObjectByName('ベースライン開始日(WBSGantt)'); com.atlassian.jira.issue.fields.CustomField customField2 = customFieldManager.getCustomFieldObjectByName('ベースライン終了日(WBSGantt)'); //コンポーネント2は標準で翌月初から月末 // e.g.2015-12-01 00:00:00 java.util.Date today = org.apache.commons.lang.time.DateUtils.truncate(new java.util.Date(), Calendar.DAY_OF_MONTH); Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(today.getTime()); cal.add(Calendar.MONTH, 1); cal.set(Calendar.DAY_OF_MONTH, 1); today = cal.getTime(); // e.g.2015-12-31 00:00:00 cal.add(Calendar.MONTH, 1); cal.add(Calendar.DATE, -1); java.util.Date endDay = cal.getTime(); customField1.updateValue(fieldLayoutManager.getFieldLayout(issueObject).getFieldLayoutItem(customField1), issueObject, new com.atlassian.jira.issue.ModifiedValue(issueObject.getCustomFieldValue(customField1), new java.sql.Timestamp(today.getTime())), new com.atlassian.jira.issue.util.DefaultIssueChangeHolder()); System.out.println(cal.getTime().toString()); customField2.updateValue(fieldLayoutManager.getFieldLayout(issueObject).getFieldLayoutItem(customField2), issueObject, new com.atlassian.jira.issue.ModifiedValue(issueObject.getCustomFieldValue(customField2), new java.sql.Timestamp(endDay.getTime())), new com.atlassian.jira.issue.util.DefaultIssueChangeHolder()); }
補足
さっき気付いたんですが、JIRA7以降からは
issueObject.componentObjects*.name()
ではなく
issue.getComponents()
を使えと注意が出ていますが…元気に動いています。
- Kengo Ohsaki
- RYOITO
ありがとうございます。
私の方の要件では、Createトランジション時の処理なので、余計な更新、通知が無い方が都合がよかったです。(作成しました&更新されましたのペアはイヤ)
今確認しましたが、作成された課題の更新の履歴はありませんね。
メール通知もきていないようです。
- Kengo Ohsaki
RYOITO-san,
想定通りの動作でよかったです。メソッドによって使い分けていただければ幸いです。
JIRAのAPIは課題更新でも同じようなメソッドがあり、
Javadocのコメントや実装などを確認ししている次第です…
- HINSA
ありがとうございます。示唆に富んだInstruction、勉強になります。
ご指摘の課題キーは、customfield_11045.xls こちらでよろしいでしょうか?
- HINSA
私の設定要件は、ScriptRunner を利用して、計算(CurrentDayTime - AcceptedDateTime)結果の値をタブ内にいずれかに表示させることを前提に設定を試みていました。
本件とは似て異なる設定の気もしてきました。
- RYOITO
HINSAさん
>ご指摘の課題キーは、customfield_11045.xls こちらでよろしいでしょうか?
申し訳ないです。ファイルのダウンロード&閲覧は私の環境ではセキュリティポリシー上できない為確認できなく…
本トピック成果物でやっていることは、計算した結果を元に「フィールドの値を更新させる処理」です。
HINSAさんのやりたいことは、おそらく計算した結果を「フィールドの値として表示させる処理」ですかね?
それであれば確かに異なりますね。
ただ、HINSAさんのやりたい事は以下で出来るはずです。私もScript Fields使ってますし。
JIRA Administration > Add-On > Script Fields > 該当のカスタムフィールド > Edit > Inline script に作成したコード入力
※ 計算(CurrentDayTime - AcceptedDateTime)結果の値を return させれば随時計算された値が表示されます
例としては期限が変更された課題を検索したいのようなものです。
個別のエラー等、不明箇所であれば新たに質問してもいいかもしれませんね。
コメントを追加... - 210
ちなみにScriptRunnerではBehavioursという機能もあるので、作成・編集画面に自動で計算した値を設定することもできます
https://scriptrunner.adaptavist.com/latest/jira/behaviours-overview.html
またScriptRunnerにはListenersとして特定のイベントを受け取って処理させることもできるので、これでも実現できます。
https://scriptrunner.adaptavist.com/latest/jira/listeners.html
ScriptRunnerはアドオン開発するのと変わらないですね。幅広すぎ…
コメントを追加... - 10-1コメントを追加...
毎週、毎月実施するようなRecurringタスクがかなりあり、The scheduler Pluginで自動作成しています。
このRecurringタスクのものが、ガントチャートで美しくない状態になっていて、自動課題作成時にベースライン開始終了日として、週初めと終わりを設定したく以下コードをScriptrunnerでテストしてみたのですが、エラーになってしまいます。
String等他のものにすると「java.lang.String cannot be cast to java.util.Date」と言われ、どうすれば設定できるでしょうか。
AtlassianAnswerで同事象を見つけたのですが、分からず…
また、今はテストなので直接issueObjectをキーで指定していますが、トランジション: Create Issue の post-functionで自動設定させたい時はissueObjectをどのように解釈させるのでしょうか。