2
1
0

毎週、毎月実施するようなRecurringタスクがかなりあり、The scheduler Pluginで自動作成しています。

このRecurringタスクのものが、ガントチャートで美しくない状態になっていて、自動課題作成時にベースライン開始終了日として、週初めと終わりを設定したく以下コードをScriptrunnerでテストしてみたのですが、エラーになってしまいます。

 

import java.util.List;
import java.time.LocalDate;
import java.util.Date;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.ModifiedValue;
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder;
import com.atlassian.jira.issue.util.IssueChangeHolder;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.CustomFieldManager;
import org.apache.commons.lang.time.DateUtils;

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.Issue issueObject = issueManager.getIssueObject("SNDBX-140");

//Calendar c = Calendar.getInstance();
//DateTime dt = new DateTime(new Date());
Date now = new Date(); // 2015-10-30 18:30:33
Date noTimeDay = DateUtils.truncate(now, Calendar.DAY_OF_MONTH); // 2015-10-30 00:00:00

def tergetField = customFieldManager.getCustomFieldObjects(issueObject).find {it.name == "ベースライン開始日(WBSGantt)"}
IssueChangeHolder changeHolder = new DefaultIssueChangeHolder();
tergetField.updateValue(null, issueObject, new ModifiedValue(issueObject.getCustomFieldValue(tergetField), noTimeDay),changeHolder);
エラー:org.ofbiz.core.entity.GenericEntityException: while inserting: [GenericEntity:CustomFieldValue][parentkey,null][customfield,10002][issue,13700][datevalue,Fri Oct 30 00:00:00 JST 2015][id,22508] (Java type java.util.Date not currently supported. Sorry.)

 

String等他のものにすると「java.lang.String cannot be cast to java.util.Date」と言われ、どうすれば設定できるでしょうか。

AtlassianAnswerで同事象を見つけたのですが、分からず…

 

また、今はテストなので直接issueObjectをキーで指定していますが、トランジション: Create Issue の post-functionで自動設定させたい時はissueObjectをどのように解釈させるのでしょうか。

com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject("SNDBX-140");
    Commentコメントを追加...

    3 回答

    1.  
      2
      1
      0
      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型ですね。

       

      1. Kengo Ohsaki

        見つけられない... https://scriptrunner.adaptavist.com/latest/jira/recipes/workflow/conditions/all-subtasks-resolved.html post-functionの場合は transientVars と issue オブジェクトが変数として引き渡されます。

      2. RYOITO

        ありがとうございます。 できました。

      3. 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掲示のコード)コード設定

      4. 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()

        を使えと注意が出ていますが…元気に動いています。

      5. Kengo Ohsaki

        RYOITO-san,

        HINSA-san,

        1点お伝えするの忘れていましたが・・・・

        ご質問の内容のまま 「customField.updateValue」 関数でカスタムフィールドの値を更新していますが

        この場合、履歴タブに更新が残らないのと、メール通知がされません。(確かされないはずです…)

        履歴タブに残したい場合・メール通知が必要な場合、以下サンプルのようにIssueServiceをご利用ください。

        https://answers.atlassian.com/questions/292198/script-to-clearreset-a-custom-field-date-time-properly

        もしくは、issueManager。

        ScriptRunner for JIRAで課題の説明を操作するサンプルはありませんか?

      6. RYOITO

        Kengo Ohsakiさん

        ありがとうございます。

        私の方の要件では、Createトランジション時の処理なので、余計な更新、通知が無い方が都合がよかったです。(作成しました&更新されましたのペアはイヤ)

        今確認しましたが、作成された課題の更新の履歴はありませんね。

        メール通知もきていないようです。

      7. Kengo Ohsaki

        RYOITO-san,

        想定通りの動作でよかったです。メソッドによって使い分けていただければ幸いです。

        JIRAのAPIは課題更新でも同じようなメソッドがあり、

        Javadocのコメントや実装などを確認ししている次第です…

      8. HINSA

        ありがとうございます。示唆に富んだInstruction、勉強になります。

        ご指摘の課題キーは、customfield_11045.xls こちらでよろしいでしょうか?

      9. HINSA

        私の設定要件は、ScriptRunner を利用して、計算(CurrentDayTime - AcceptedDateTime)結果の値をタブ内にいずれかに表示させることを前提に設定を試みていました。

        https://answers.atlassian.com/questions/34996740/add-post-function-to-transition-applicable-that-we-can-report-for-the-number-of-days-between-the-creation-date-and-the-closed-date.

        本件とは似て異なる設定の気もしてきました。

      10. RYOITO

        HINSAさん

        >ご指摘の課題キーは、customfield_11045.xls こちらでよろしいでしょうか?

        申し訳ないです。ファイルのダウンロード&閲覧は私の環境ではセキュリティポリシー上できない為確認できなく…

         

        本トピック成果物でやっていることは、計算した結果を元に「フィールドの値を更新させる処理」です。

        HINSAさんのやりたいことは、おそらく計算した結果を「フィールドの値として表示させる処理」ですかね?

        それであれば確かに異なりますね。

        ただ、HINSAさんのやりたい事は以下で出来るはずです。私もScript Fields使ってますし。

        JIRA Administration > Add-On > Script Fields > 該当のカスタムフィールド > Edit > Inline script に作成したコード入力

        ※ 計算(CurrentDayTime - AcceptedDateTime)結果の値を return させれば随時計算された値が表示されます

        例としては期限が変更された課題を検索したいのようなものです。

        個別のエラー等、不明箇所であれば新たに質問してもいいかもしれませんね。

      Commentコメントを追加...
    2.  
      2
      1
      0

      ちなみにScriptRunnerではBehavioursという機能もあるので、作成・編集画面に自動で計算した値を設定することもできます

      https://scriptrunner.adaptavist.com/latest/jira/behaviours-overview.html

      またScriptRunnerにはListenersとして特定のイベントを受け取って処理させることもできるので、これでも実現できます。

      https://scriptrunner.adaptavist.com/latest/jira/listeners.html

      ScriptRunnerはアドオン開発するのと変わらないですね。幅広すぎ…

        Commentコメントを追加...
      1.  
        1
        0
        -1

        RYOITO さん、早々にありがとうございました。

        トピックの取り違え、失礼いたしました。

        個々にエラー等も出ましたので、別途トピックを上げさせて頂きます。

        ありがとうございました。

         

          Commentコメントを追加...