スクリプトタスク

機能概要

プロセスにおいて、システムが処理する自動工程を表します。
ECMAスクリプトを使用して、業務データ(各プロセスデータ項目に保持されている値)を編集します。

現在、beta機能として提供しています。
プロセスモデル編集権限を持つユーザが対象です。
ECMAスクリプトおよびJavaの使用経験者を対象としています。

機能一覧

プロセス図 プロセス図の作成を行います。
スイムレーンや各アイテムを配置し、フローを作成して、作業の順序を定義します。
ヒューマンタスク プロセスにおいて、処理担当者が作業する手動工程を表します。
プロセス実行時に、データを入力するフォーム(タスク処理画面)が表示されます。
サービスタスク
(データ設定)
プロセスにおいて、システムが処理する自動工程を表します。
数値型、日付型/日時型、文字型、選択型プロセスデータ項目に、動的な値や演算結果を代入します。
サービスタスク
(PDF生成)
プロセスにおいて、システムが処理する自動工程を表します。
業務データ(各プロセスデータ項目に保持されている値)を埋め込んだPDF帳票を生成します。
サービスタスク
(選択肢マスタ更新)
プロセスにおいて、システムが処理する自動工程を表します。
指定の選択型プロセスデータ項目の内容を、共有プロセスモデルファイルの[選択型プロセスデータで使用する選択肢マスタ]として更新します。
スクリプトタスク プロセスにおいて、システムが処理する自動工程を表します。
ECMAスクリプトを使用して、業務データ(各プロセスデータ項目に保持されている値)を編集します。
タイマー開始イベント プロセスにおいて、システムが処理する自動工程を表します。
設定した日時にプロセスを自動的に開始します。
タイマー中間イベント プロセスにおいて、システムが処理する自動工程を表します。
指定した日時まで待機し、指定日時を経過するとトークンが進みます。
メッセージ開始・
受信中間イベント(HTTP)
プロセスにおいて、システムが処理する自動工程を表します。
メッセージ開始イベント(HTTP): 外部システムまたはDataSpider BPMの他のプロセスから受け取ったメッセージをもとにプロセスを開始します。
メッセージ受信中間イベント(HTTP): プロセスの実行途中で、外部システムまたはDataSpider BPMの他のプロセスから受け取ったメッセージをもとにプロセスデータを入力できます。
メッセージ開始イベント
(フォーム)
プロセスにおいて、システムが処理する自動工程を表します。
Webページの入力フォームから受け取ったメッセージをもとにプロセスを開始します。
入力フォームは、プロセスデータ項目のレイアウトをWebページに埋め込んで使用します。
メッセージ送信中間イベント
(HTTP)
プロセスにおいて、システムが処理する自動工程を表します。
指定したURLに、HTTPリクエストを送信します。
外部システムまたはDataSpider BPMの他のプロセスへのデータ送信が可能となります。
メッセージ送信中間イベント
(メール)
プロセスにおいて、システムが処理する自動工程を表します。
設定した内容でメールを送信します。
送信先は任意に設定できます。
メール本文に、プロセスデータの入力内容を埋め込むことができます。
メッセージ送信中間イベント
(DataSpider Servista)
プロセスにおいて、システムが処理する自動工程を表します。
指定したDataSpider Servistaのスクリプトを実行することができます。
イベントの実行時には、DataSpider BPM側のプロセスデータ項目の値を、DataSpider Servista側で定義されている入力変数へ渡すことができます。
スクリプト終了時には、DataSpider Servista側で定義されている出力変数の値を、DataSpider BPM側のプロセスデータ項目の値として受け取ることができます。
スクリプトの実行結果(結果の戻り値:ExitStatusおよびエラー内容)を受け取り、その後のタスクや条件分岐処理等で使用することができます。
分岐 プロセス図に分岐がある場合、分岐・遷移先の設定を行います。

項目説明

スクリプトタスクのプロパティダイアログ表示例


項目名 必須 説明
基本 名称 任意 タスクの名称を入力します。
メモ 任意 タスクの注意点や目的などに関するメモを入力します。
スクリプト 必須データ項目の
値をクリアすることを
許可する
任意 チェックを入れた場合、[必須]として設定したプロセスデータ項目に保持されている値を空(未入力)の状態にすることができます。
スクリプト
入力フィールド
必須 スクリプトを記述する入力フィールドです。

操作メニュー説明

表示 操作メニュー 説明
基本 [閉じる]ボタン タスクのプロパティダイアログを閉じます。
スクリプト [マニュアル表示]ボタン このマニュアルページを表示します。

仕様制限

基本仕様

前提条件

記述したスクリプトは、「ECMAエンジン」によって処理されます。
DataSpider BPMに搭載されているECMAエンジン(Rhino)は、一般的な以下のJavaScriptクラスと一部のJavaクラスを使用することができます。

使用可能なJavaScriptクラス

ECMAスクリプト(ECMA-262)に関する詳細は、「Standard ECMA-262 ECMAScript(R) Language Specification」
      (http://www.ecma-international.org/publications/standards/Ecma-262.htm)を参照してください。
browserオブジェクトは使用することができません。

使用可能なJavaクラス

以下に記載されているJavaクラス以外は使用することができません。
クラス メソッド メソッド説明
com.questetra.bpms.core.select.Item
(選択型プロセスデータで使用)
String getValue() 選択肢IDを取得します。
String getDisplay() 表示ラベルを取得します。
com.questetra.bpms.util.AddableDate
(日付型プロセスデータで使用)
AddableDate addDays(int days) 指定した日数を加えたDateを返します。
AddableDate addMonths(int months) 指定した月数を加えたDateを返します。
AddableDate getFirstDateInMonth() その月の最初の日を返します。
1日
AddableDate getFirstTimeInMonth() 非推奨
AddableDate getLastDateInMonth() その月の最後の日を返します。
翌月1日の1日前
AddableDate getLastTimeInMonth() 非推奨
com.questetra.bpms.util.AddableTimestamp
(日時型プロセスデータで使用)
AddableTimestamp addHours(int hours) 指定した時間を加えたTimestampを返します。
AddableTimestamp addDays(int days) 指定した日数を加えたTimestampを返します。
AddableTimestamp addMonths(int months) 指定した月数を加えたTimestampを返します。
AddableTimestamp getFirstTimeInDate() その日の最初の時刻を返します。
AddableTimestamp getFirstTimeInMonth() その月の最初の時刻を返します。
1日の0時0分0秒0ミリ秒
AddableTimestamp getLastTimeInMonth() その月の最後の時刻を返します。
翌月1日の1ミリ秒前
String toString() 「yyyy-MM-dd HH:mm」形式の文字を返します。
com.questetra.bpms.core.event.scripttask.ProcessInstanceView
(プロセス属性)
Long getProcessModelInfoId() プロセスモデル番号を取得します。
String getProcessModelInfoName() プロセスモデルの名称を取得します。
String getProcessModelInfoCategory() プロセスモデルのカテゴリを取得します。
Long getProcessModelVersion() プロセスが開始されたときのプロセスモデルのバージョンを取得します。
Long getProcessInstanceId() プロセスIDを取得します。
String getProcessInstanceTitle() プロセスの件名を取得します。
Long getProcessInstanceInitQuserId() プロセス開始ユーザのIDを取得します。
String getProcessInstanceInitQuserName() プロセス開始ユーザの名称を取得します。
Long getProcessInstanceInitQgroupId() プロセス開始組織のIDを取得します。
String getProcessInstanceInitQgroupName() プロセス開始組織の名称を取得します。
AddableTimestamp getProcessInstanceStartDatetime() プロセス開始日時を取得します。
Long getProcessInstanceSequenceNumber() プロセス連番を取得します。
void setProcessInstanceTitle(String title) プロセスの件名を設定します。
com.questetra.bpms.core.event.scripttask.QuserView
(ユーザ型プロセスデータで使用)
Long getId() ユーザIDを取得します。
String getName() ユーザ名を取得します。
String getEmail() ユーザのメールアドレスを取得します。
com.questetra.bpms.core.event.scripttask.QgroupView
(組織型プロセスデータで使用)
Long getId() 組織IDを取得します。
String getName() 組織名を取得します。
String getEmail() 組織のメールアドレスを取得します。
com.questetra.bpms.core.event.scripttask.QroleView
(ロール情報)
Long getId() ロールIDを取得します。
String getName() ロール名を取得します。
com.questetra.bpms.core.event.scripttask.QuserDaoWrapper
(ユーザ情報)
QuserView findByEmail(String email) メールアドレスでユーザを検索します。
QuserView findById(Long id) ユーザIDでユーザを検索します。
List<QuserView> findByQgroup(QgroupView qgroup) 指定した組織に所属しているユーザ一覧を検索します。
List<QuserView> findByQgroupAndPosition(QgoupView qgroup, boolean isLeader) 指定した組織にリーダまたはスタッフとして所属しているユーザ一覧を検索します。
List<QuserView> findByQrole(QroleView qrole) 指定したロールに所属しているユーザ一覧を検索します。
com.questetra.bpms.core.event.scripttask.QgroupDaoWrapper
(組織情報)
QgroupView findById(Long id) IDで組織を検索します。
QgroupView findByName(String name) 名称で組織を検索します。
QgroupView findParentQgroup(QgroupView qgroup) 指定した組織の親組織を検索します。
List<QgroupView> findByQuser(QuserView quser) 指定したユーザが所属している組織一覧を検索します。
List<QgroupView> findByQuserAndPosition(QuserView quser, boolean isLeader) 指定したユーザがリーダまたはスタッフとして所属している組織一覧を検索します。
com.questetra.bpms.core.event.scripttask.QroleDaoWrapper
(ロール情報)
QroleView findById(Long id) ロールIDでロールを検索します。
QroleView findByName(String name) ロール名でロールを検索します。
List<QroleView> findByQuser(QuserView quser) ユーザが所属しているロール一覧を検索します。
com.questetra.bpms.core.model.formdata.ListArray
(テーブル型プロセスデータで使用)
String get(int row_index, int col_index) セルデータを取得する
- row_index : 行番号 0始まり
- col_index : 列番号 0始まり
ListArray.ListRow getRow(int row_index) 指定行を取得します。
List<ListArray.ListRow> getRows() 全行を取得します。
int size() 行数を取得します。
void setRows(List<ListArray.ListRow> rows) 全行を設定します。
void addRow( ListArray.ListRow row ) 行を追加します。
ListArray.ListRow removeRow(int row_index) 行を削除します。
ListArray.ListRow getSummary() サマリ行を取得します。
void setSummary(ListArray.ListRow summary) サマリ行に値を設定します。
void clearSummary(int col_index) サマリ行の内容を指定列数の空の内容で初期化します。
com.questetra.bpms.core.model.formdata.ListArray.ListRow
(テーブル型プロセスデータで使用: 行単位)
List<String> getCols() 全列を取得します。
String getCol(int col_index) 指定列を取得します。
int size() 列数を取得します。
void setCols(List<String> cell_strings) 全列を上書きします。
void addCol(String cell_string) 列を追加します。
void setCol(int col_index, String cell_string) 指定列を上書きします。
com.questetra.bpms.core.event.scripttask.ItemView
(選択肢マスタ情報)
String getValue() 選択肢IDを取得します。
String getDisplay() 表示ラベルを取得します。
com.questetra.bpms.core.event.scripttask.ItemDaoWrapper
(選択肢マスタ情報)
List<ItemView> findAll(String fileName, boolean isSharedFile) 指定した選択肢マスタの全選択肢を検索します。
ItemView findByValue(String fileName, boolean isSharedFile, String value) 指定した選択肢マスタから特定の値(選択肢ID)を持つ選択肢を検索します。
java.lang.String - - -
java.lang.Long - - -
java.lang.Math - - -
java.util.ArrayList - - -
java.util.HashMap - - -
java.util.Locale - - -
java.util.regex.Pattern - - -
java.util.regex.Matcher - - -
java.math.BigDecimal - - -
java.text.SimpleDateFormat - - -
java.text.DecimalFormat - - -
java.sql.Date - - -
java.sql.Timestamp - - -

プロセスデータ項目の参照方法

各プロセスデータ項目の値の取得および設定は以下の構文となります。

サンプル

文字型 文字型プロセスデータ項目に対する値の取得と設定
数値型 数値型プロセスデータ項目に対する値の取得と設定
選択型 選択型プロセスデータ項目に対する値の取得と設定
日付型 日付型プロセスデータ項目に対する値の取得と設定
日時型 日時型プロセスデータ項目に対する値の取得と設定
ユーザ型 ユーザ型プロセスデータ項目に対する値の取得と設定
組織型 組織型プロセスデータ項目に対する値の取得と設定
テーブル型 テーブル型プロセスデータ項目に対する値の取得と設定
[その他] プロセス属性 全プロセス共通のプロセス属性に対する値の取得と設定
[その他] 部門検索 「本部-部-課」という構造をもった組織における、所属する本部の取得と設定
[その他] JSON解析 文字型(複数行)に保持されているJSON形式の文字列を解析

文字型: 文字型プロセスデータ項目に対する値の取得と設定

シナリオ

  1. 文字型(単一行)プロセスデータ項目に固定値を設定します。
  2. 文字型(複数行)プロセスデータ項目に固定値を設定します。

実装


 retVal.put("0", "HelloWorld!!");
 retVal.put("1", "Hello\nWorld!!");

シナリオ

  1. 新しいアジェンダの内容を保持した文字型(単一行)プロセスデータ項目から値を取得します。
  2. アジェンダのリストを保持した文字型(複数行)プロセスデータの最後に、改行コードおよび新しいアジェンダの内容を連結します。
  3. アジェンダのリストを保持した文字型(複数行)プロセスデータ項目に新しい内容を含めたすべての値を設定します。

実装


 var newAgenda = data.get("0");
 var agendaList = data.get("1");

 agendaList += '\n';
 agendaList += newAgenda;

 retVal.put("1", agendaList);

数値型: 数値型プロセスデータ項目に対する値の取得と設定

シナリオ

  1. 数値型プロセスデータ項目に固定値を設定します。
  2. 数値型プロセスデータ項目にランダム値を設定します。

実装


 retVal.put("2", new java.math.BigDecimal(123));
 retVal.put("3", new java.math.BigDecimal(Math.random()));

シナリオ

  1. 数量を保持した数値型プロセスデータ項目から値を取得します。
  2. 単価を保持した数値型プロセスデータ項目から値を取得します。
  3. 数量×単価の値を計算し金額を求めます。
  4. 文字型プロセスデータ項目に、金額の値をフォーマット変換して設定します。

実装


 var quantity = data.get("4");
 var unitPrice = data.get("5");

 var price = quantity * unitPrice;

 retVal.put("6", new java.text.DecimalFormat('#,##0円').format(price));

選択型: 選択型プロセスデータ項目に対する値の取得と設定

選択肢リストすべてではなく、選択された値のみが取得できます。
選択肢を1つしか選べないデータサブタイプ(ラジオボタン、セレクトボックス、検索セレクトボックス)にて、2つ以上の選択肢を設定した場合は、スクリプト実行時にエラーとなります。
選択肢リストにない選択肢IDを設定した場合は、エラーとならずに設定した値は無視されます。

シナリオ

  1. 選択したい値のリスト(「JP」および「US」)を設定します。
  2. 選択型プロセスデータ項目(チェックボックス)にて、複数の値を設定します(チェックを入れます)。

実装


 var selects = new java.util.ArrayList();

 selects.add("JP");
 selects.add("US");

 retVal.put("7", selects);

シナリオ

  1. 選択型プロセスデータ項目(チェックボックス)で現在選択されている複数の値を取得します。
  2. 選択されている値の選択肢IDおよび表示ラベルを取得し、改行コードとともに文字列連結します。
  3. 連結した値を文字型(複数行)プロセスデータ項目に設定します。

実装


 var text = "";
 var selects = data.get("7");

 for (var i=0; i < selects.size(); i++){
     var select = selects.get(i);
     text += select.getValue() + ":" + select.getDisplay();
     text += '\n';
 }

 retVal.put("8", text);

日付型: 日付型プロセスデータ項目に対する値の取得と設定

シナリオ

  1. 日付型プロセスデータ項目に固定値を設定します。

実装


 retVal.put("9", java.sql.Date.valueOf("2015-03-15"));

シナリオ

  1. 日付型プロセスデータ項目の値を取得します。
  2. 取得した値を年月日のフォーマット変換(年号YYYY年MM月DD日)を行います。
  3. フォーマット変換した値を文字型プロセスデータ項目に設定します。

実装


 var text = "";
 var requestDate = data.get("9");

 var dateFormatter = new java.text.SimpleDateFormat("GGGGyyyy年MM月dd日", new java.util.Locale("ja", "JP", "JP"));

 text += dateFormatter.format(requestDate);

 retVal.put("10", text);

日時型: 日時型プロセスデータ項目に対する値の取得と設定

シナリオ

  1. 日時型プロセスデータ項目に固定値を設定します。

実装


 retVal.put("11", java.sql.Timestamp.valueOf("2015-03-15 12:34:56"));

シナリオ

  1. 製造日時を保持した日時型プロセスデータ項目の値を取得します。
  2. 取得した値から2か月後の日時を、消費日時を保持する日時型プロセスデータ項目に設定します。

実装


 var manufactureDate = data.get("11");

 retVal.put("12", manufactureDate.addMonths(2));

ユーザ型: ユーザ型プロセスデータ項目に対する値の取得と設定

シナリオ

  1. DataSpider BPMに登録されているユーザ情報から、指定のメールアドレスを持つユーザを取得します。
  2. 取得した値を、担当者を保持するユーザ型プロセスデータ項目に設定します。

実装


 var repUser = quserDao.findByEmail("Ito@localhost.localdomain");

 retVal.put("13", repUser);

シナリオ

  1. 担当者を保持するユーザ型プロセスデータ項目から値を取得します。
  2. 承認者を保持するユーザ型プロセスデータ項目から値を取得します。
  3. 取得した値を改行を含んだ「担当者: <担当者名>[<メールアドレス>]」および「承認者: <承認者名>[<メールアドレス>]」に変換します。
  4. 変換した値を関係者情報を保持する文字型(複数行)プロセスデータ項目に設定します。

実装


 var text = "";
 var repUser = data.get("13");
 var appUser = data.get("14");

 text  = '担当者: ' + repUser.getName() + '[' + repUser.getEmail() + ']\n';
 text += '承認者: ' + appUser.getName() + '[' + appUser.getEmail() + ']';

 retVal.put("15", text);

組織型: 組織型プロセスデータ項目に対する値の取得と設定

シナリオ

  1. 担当部署を保持した組織型プロセスデータ項目から値を取得します。
  2. DataSpider BPMに登録されている組織情報から、担当部署の親組織を取得します。
  3. 取得した値を、承認部署を保持する組織型プロセスデータ項目に設定します。

実装


 var repGroup = data.get("16");
 var appGroup = qgroupDao.findParentQgroup(repGroup);

 retVal.put("17", appGroup);

テーブル型: テーブル型プロセスデータ項目に対する値の取得と設定

シナリオ

  1. 購入商品リストを保持したテーブル型プロセスデータ項目から値を取得します。
  2. 取得した値に1行もデータがなければ、空のテーブル型プロセスデータを生成します。
  3. 空のデータ行を生成し、初期値として以下の商品リストを1行生成します。
    • 商品名:「PRODUCT-01」
    • 数量:「10」
    • 単価:「1200」
    • 金額:「12000」
  4. 生成した行データを、テーブル型プロセスデータに追加します。
  5. テーブル型プロセスデータ項目に値を設定します。

実装


 var productList = data.get("18");

 if (productList == null) {
     productList = new com.questetra.bpms.core.model.formdata.ListArray();

     var row = new com.questetra.bpms.core.model.formdata.ListArray.ListRow();

     row.addCol("PRODUCT-01");
     row.addCol("10");
     row.addCol("1200");
     row.addCol("12000");

     productList.addRow(row);

     retVal.put("18", productList);
 }

[その他] プロセス属性: 全プロセス共通のプロセス属性に対する値の取得と設定

シナリオ

  1. プロセス属性から、プロセス連番の値を取得します。
  2. 取得した値を使用し、以下の値を件名に設定します。
    • 第<プロセス連番> 回 定例ミーティング開催

実装


 var seqNum = processInstance.getProcessInstanceSequenceNumber();

 processInstance.setProcessInstanceTitle("第" + seqNum + "回 定例ミーティング開催");

[その他] 部門検索: 「本部-部-課」という構造をもった組織における、所属する本部の取得と設定

シナリオ

  1. プロセス属性から、プロセス開始組織の値を取得します。
    ここでは、課が取得されているものとします。
  2. 取得したプロセス開始組織から、本部組織を検索します。
    • 組織名の最後に「本部」と名のつく親組織を、組織階層を遡りながら検索します。
  3. 検索した本部組織を担当本部を保持する組織型プロセスデータ項目に設定します。

実装


 var qGroup = qgroupDao.findById(processInstance.getProcessInstanceInitQgroupId());

 var division = findDivision(qGroup);

 retVal.put("19", division);


 function findDivision(aGroup){
     while (aGroup != null && aGroup.getName().endsWith('本部') == false) {
        aGroup = qgroupDao.findParentQgroup(aGroup);
     }
     return aGroup;
 }

[その他] JSON解析: 文字型(複数行)に保持されているJSON形式の文字列を解析

シナリオ

  1. APIのレスポンスデータ(JSON)が保持されている文字型(複数行)プロセスデータ項目から値を取得します。
    上記のデータは、マイタスクの一覧を取得するAPIのレスポンスデータ(JSON)とします。
    マイタスクの一覧を取得するAPIに関する詳細は、
    「ワークフローAPI: マイタスクの一覧を取得する」を参照してください。
  2. 取得した値をJSON形式にパースします。
  3. 保持されている複数のマイタスク情報から、以下の値を取得します。
  4. 変換した値を作業リストを保持する文字型(複数行)プロセスデータ項目に設定します。

実装


 var jsonText = data.get("20");
 var myTasks = JSON.parse(jsonText);

 var taskList = "";

 for (var i in myTasks.workitems){
     taskList += '[プロセス]: ' + myTasks.workitems[i].processModelInfoName + ' [タスク]: ' + myTasks.workitems[i].nodeName;
     taskList += '\n';
 }

 retVal.put("21", taskList);