Questetra BPMS #タスク処理: レポートIDでデータ抽出

Questetra BPMS #タスク処理: レポートIDでデータ抽出

translate Questetra BPMS #Tasks: Extract by Report ID

タスクデータ(ワークアイテム)をAPI経由でTSV抽出します。Web UI で絞り込み設定されたリストの ReportID を使用して抽出し、TSV 形式で格納します。データ列の並びはデータ項目IDのCSVで設定します。

Auto Step icon
Configs for this Auto Step
AuthzConfU
U: HTTP認証設定を選択してください *
StrConfA1
A1: データを抽出する先のWF基盤URLをセットしてください (例 “${var[applicationRoot]}” ) *#{EL}
StrConfA2
A2: ReportID をセットしてください (例 “1234” ) *#{EL}
StrConfA3
A3: 抽出レコード数の最大値をセットしてください (例 “100” )#{EL}
StrConfB0
B0: 抽出TSV列の並び順をデータ項目IDでセットしてください (例 “0,1,3,0” ) *#{EL}
SelectConfB1
B1: 抽出TSVを格納する文字列型データを選択してください (更新) *
SelectConfB2
B2: 抽出されたデータ数を格納する数値型データを選択してください (更新)
SelectConfB3
B3: 元リストの総レコード数を格納する数値型データを選択してください (更新)
Script (click to open)
// Script for 'engine type: 3' ("GraalJS standard mode")

//////// START "main()" /////////////////////////////////////////////////////////////////

main();
function main(){ 

//// == Config Retrieving / 工程コンフィグの参照 ==
const objAuthzSetting     = configs.getObject( "AuthzConfU" );   /// REQUIRED ///////////
  engine.log( " AutomatedTask Config: Authz Setting: " + objAuthzSetting.getName() );
const strTargetUrl        = configs.get      ( "StrConfA1" );    /// REQUIRED ///////////
  if( strTargetUrl      === "" ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config {A1: TargetPlatformURL} is empty \n" );
  }
  if( ! strTargetUrl.endsWith( "/" ) ){
    strTargetUrl += "/";
  }
const strReportId         = configs.get      ( "StrConfA2" );    /// REQUIRED ///////////
  if( strReportId       === "" ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config {A2: ReportID} is empty \n" );
  }
let   strLimit            = configs.get      ( "StrConfA3" );    // NotRequired /////////
  if( strLimit          === "" ){
      strLimit = "1000";
  }else if( isNaN( parseInt(strLimit, 10) ) || parseInt(strLimit, 10) < 0 ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config {A3: Max Num of Extraction} must be a positive integer \n" );
  }else if( parseInt(strLimit, 10) > 1000 ){
    engine.log( " AutomatedTask ConfigWarning: " +
                " {A3: Max Num of Extraction} is limited to 1000" );
    strLimit = "1000";
  }
const strColIds           = configs.get      ( "StrConfB0" );    /// REQUIRED ///////////
const strPocketTsv        = configs.getObject( "SelectConfB1" ); /// REQUIRED ///////////
const numPocketExtracted  = configs.getObject( "SelectConfB2" ); // NotRequired /////////
const numPocketFiltered   = configs.getObject( "SelectConfB3" ); // NotRequired /////////

//// == Calculating / 演算 ==
/// Get Workitems
// request1, prepare
let request1Uri = strTargetUrl + "API/OR/Workitem/list";
let request1    = httpClient.begin(); // HttpRequestWrapper
    request1    = request1.authSetting( objAuthzSetting ); // with "Authorization: Bearer XX"
    request1    = request1.queryParam( "reportId", strReportId );
    request1    = request1.queryParam( "limit", strLimit );

// request1, try
const response1     = request1.get( request1Uri ); // HttpResponseWrapper
engine.log( " AutomatedTask ApiRequest1 Start: " + request1Uri );
const response1Code = response1.getStatusCode() + "";
const response1Body = response1.getResponseAsString() + "";
engine.log( " AutomatedTask ApiResponse Status: " + response1Code );
if( response1Code !== "200"){
  throw new Error( "\n AutomatedTask UnexpectedResponseError: " +
                    response1Code + "\n" + response1Body + "\n" );
}

// response1, parse
const response1Obj = JSON.parse( response1Body );
const arrWorkitems = response1Obj.workitems || [];

engine.log( " AutomatedTask Parsed: Number of Received Workitems: " + arrWorkitems.length );
engine.log( " AutomatedTask Parsed: Number of Total Workitems: "    + response1Obj.count );

const arrColIds = parseColumnIds( strColIds );
const strTsv    = buildTsv( arrWorkitems, arrColIds );


//// == Data Updating / ワークフローデータへの代入 ==
engine.setData(   strPocketTsv,       strTsv );
if(               numPocketExtracted  !== null ){
  engine.setData( numPocketExtracted,  new java.math.BigDecimal( arrWorkitems.length ) );
}
if(               numPocketFiltered   !== null ){
  engine.setData( numPocketFiltered,   new java.math.BigDecimal( response1Obj.count ) );
}

} //////// END "main()" /////////////////////////////////////////////////////////////////


//// == Sample Response / レスポンスサンプル ================================================
/* 
{
  "count": 55,
  "workitems": [
    {
      "allocateDatetime": "2026-05-29T10:00:17+0900",
      "allocatedQgroupId": 3,
      "allocatedQgroupName": "Sales",
      "allocatedQuserId": 473,
      "allocatedQuserName": "田中 花子",
      "data": {
        "26": {
          "dataType": "DATETIME",
          "id": 143855494,
          "processDataDefinitionNumber": 26,
          "subType": null,
          "value": "2026-05-29 11:00",
          "viewOrder": 28
        },
        "30": {
          "dataType": "STRING",
          "formType": "TEXTFIELD",
          "id": 143855497,
          "processDataDefinitionNumber": 30,
          "subType": null,
          "value": "samplechem202605",
          "viewOrder": 22
        },
        "31": {
          "dataType": "QUSER",
          "formType": "SELECT",
          "id": 143855498,
          "processDataDefinitionNumber": 31,
          "subType": null,
          "value": "田中 花子 \u003Ctanaka.hanako@example.com\u003E",
          "viewOrder": 33
        }
      },
      "directAllocated": true,
      "endDatetime": null,
      "failType": null,
      "id": 144978825,
      "nodeName": "3.実施報告  (見込案件登録)",
      "nodeNumber": 7,
      "offerDatetime": "2026-05-29T10:00:17+0900",
      "parentProcessInstanceId": 2965305,
      "processInstanceDebug": false,
      "processInstanceEndDatetime": null,
      "processInstanceId": 2965365,
      "processInstanceIdForView": "p2965365",
      "processInstanceInitQgroupId": null,
      "processInstanceInitQgroupName": null,
      "processInstanceInitQuserId": null,
      "processInstanceInitQuserName": null,
      "processInstanceSequenceNumber": 1023,
      "processInstanceStartDatetime": "2026-05-21T16:26:51+0900",
      "processInstanceState": "STARTED",
      "processInstanceTitle": "DEMO サンプル化学株式会社 2026-05-29 11:00",
      "processModelId": 143449093,
      "processModelInfoCategory": "5-営業部",
      "processModelInfoId": 3713,
      "processModelInfoName": "552-NEW-Lead-Followup&Demo-fur",
      "processModelVersion": 104,
      "read": false,
      "starred": false,
      "startDatetime": null,
      "state": "ALLOCATED",
      "swimlaneType": "NORMAL",
      "timeLimitDatetime": null
    },
    {
      "allocateDatetime": "2026-05-29T10:00:16+0900",
      "allocatedQgroupId": null,
      "allocatedQgroupName": null,
      "allocatedQuserId": 16,
      "allocatedQuserName": "佐藤 太郎",
      "data": {
        "26": {
          "dataType": "DATETIME",
          "id": 143855494,
          "processDataDefinitionNumber": 26,
          "subType": null,
          "value": "2026-05-29 11:00",
          "viewOrder": 28
        },
        "30": {
          "dataType": "STRING",
          "formType": "TEXTFIELD",
          "id": 143855497,
          "processDataDefinitionNumber": 30,
          "subType": null,
          "value": "samplechem202605",
          "viewOrder": 22
        },
        "31": {
          "dataType": "QUSER",
          "formType": "SELECT",
          "id": 143855498,
          "processDataDefinitionNumber": 31,
          "subType": null,
          "value": "田中 花子 \u003Ctanaka.hanako@example.com\u003E",
          "viewOrder": 33
        }
      },
      "directAllocated": true,
      "endDatetime": null,
      "failType": null,
      "id": 144978807,
      "nodeName": "3b.同席フィードバック",
      "nodeNumber": 37,
      "offerDatetime": "2026-05-29T10:00:16+0900",
      "parentProcessInstanceId": 2965305,
      "processInstanceDebug": false,
      "processInstanceEndDatetime": null,
      "processInstanceId": 2965365,
      "processInstanceIdForView": "p2965365",
      "processInstanceInitQgroupId": null,
      "processInstanceInitQgroupName": null,
      "processInstanceInitQuserId": null,
      "processInstanceInitQuserName": null,
      "processInstanceSequenceNumber": 1023,
      "processInstanceStartDatetime": "2026-05-21T16:26:51+0900",
      "processInstanceState": "STARTED",
      "processInstanceTitle": "DEMO サンプル化学株式会社 2026-05-29 11:00",
      "processModelId": 143449093,
      "processModelInfoCategory": "5-営業部",
      "processModelInfoId": 3713,
      "processModelInfoName": "552-NEW-Lead-Followup&Demo-fur",
      "processModelVersion": 104,
      "read": false,
      "starred": false,
      "startDatetime": null,
      "state": "ALLOCATED",
      "swimlaneType": "NORMAL",
      "timeLimitDatetime": "2026-06-01T11:00:00+0900"
    },
    {
      "allocateDatetime": "2026-05-29T07:56:27+0900",
      "allocatedQgroupId": 3,
      "allocatedQgroupName": "Sales",
      "allocatedQuserId": 16,
      "allocatedQuserName": "佐藤 太郎",
      "data": {
        "26": {
          "dataType": "DATETIME",
          "id": 144974395,
          "processDataDefinitionNumber": 26,
          "subType": null,
          "value": null,
          "viewOrder": 28
        },
        "30": {
          "dataType": "STRING",
          "formType": "TEXTFIELD",
          "id": 144974398,
          "processDataDefinitionNumber": 30,
          "subType": null,
          "value": "sample-lead-001",
          "viewOrder": 22
        },
        "31": {
          "dataType": "QUSER",
          "formType": "SELECT",
          "id": 144974399,
          "processDataDefinitionNumber": 31,
          "subType": null,
          "value": null,
          "viewOrder": 33
        }
      },
      "directAllocated": true,
      "endDatetime": null,
      "failType": null,
      "id": 144974447,
      "nodeName": "0. FollowUp (FirstTouch)",
      "nodeNumber": 63,
      "offerDatetime": "2026-05-29T07:56:27+0900",
      "parentProcessInstanceId": 2976616,
      "processInstanceDebug": false,
      "processInstanceEndDatetime": null,
      "processInstanceId": 2976911,
      "processInstanceIdForView": "p2976911",
      "processInstanceInitQgroupId": null,
      "processInstanceInitQgroupName": null,
      "processInstanceInitQuserId": null,
      "processInstanceInitQuserName": null,
      "processInstanceSequenceNumber": 1047,
      "processInstanceStartDatetime": "2026-05-29T07:56:25+0900",
      "processInstanceState": "STARTED",
      "processInstanceTitle": "LEAD 山田 一郎 2026-05-29 sample-lead-001",
      "processModelId": 144422810,
      "processModelInfoCategory": "5-営業部",
      "processModelInfoId": 3713,
      "processModelInfoName": "552-NEW-Lead-Followup&Demo-fur",
      "processModelVersion": 106,
      "read": false,
      "starred": false,
      "startDatetime": "2026-05-29T08:12:37+0900",
      "state": "STARTED",
      "swimlaneType": "NORMAL",
      "timeLimitDatetime": null
    }
  ]
}
*/



//// == Function Definitions / 関数定義 ================================================

function parseColumnIds( strColIds ){
  if( strColIds === "" ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config {B0: TSV Column Order} is empty \n" );
  }

  const arrColIds = strColIds.split( "," ).map(function( strColId ){
    return strColId.trim();
  });

  for( let i = 0; i < arrColIds.length; i++ ){
    if( arrColIds[i] === "" ){
      throw new Error( "\n AutomatedTask ConfigError:" +
                       " Config {B0: TSV Column Order} contains an empty column ID \n" );
    }
  }
  return arrColIds;
}

function buildTsv( arrWorkitems, arrColIds ){
  const arrLines = [];
  for( let i = 0; i < arrWorkitems.length; i++ ){
    const objWorkitem = arrWorkitems[i];
    const arrCells    = [];
    for( let j = 0; j < arrColIds.length; j++ ){
      arrCells.push( stringifyColumn( objWorkitem, arrColIds[j] ) );
    }
    arrLines.push( arrCells.join( "\t" ) );
  }
  return arrLines.join( "\n" );
}

function stringifyColumn( objWorkitem, strColId ){
  if( isWorkitemPropertyName( strColId ) ){
    return sanitizeTsvCell( objWorkitem[strColId] );
  }

  const objDataItems = objWorkitem.data || {};
  if( objDataItems[strColId] === undefined ){
    return "";
  }
  return stringifyDataItem( objDataItems[strColId] );
}

function stringifyDataItem( objDataItem ){
  if( objDataItem === null || objDataItem === undefined ){
    return "";
  }
  if( objDataItem.value === null || objDataItem.value === undefined ){
    return "";
  }

  const strDataType = objDataItem.dataType + "";
  const value       = objDataItem.value;

  if( strDataType === "SELECT" ){
    return sanitizeTsvCell( joinValuesByProperty( value, "display" ) );
  }
  if( strDataType === "FILE" || strDataType === "FILE2" ){
    return sanitizeTsvCell( joinValuesByProperty( value, "name" ) );
  }
  if( strDataType === "QUSER" || strDataType === "QGROUP" ){
    return sanitizeTsvCell( stringifyQuserOrQgroupValue( value ) );
  }
  if( strDataType === "STRING" ||
      strDataType === "DECIMAL" ||
      strDataType === "DATE" ||
      strDataType === "DATETIME" ||
      strDataType === "DISCUSSION" ){
    return sanitizeTsvCell( value );
  }

  return "N/A";
}

function joinValuesByProperty( value, strPropertyName ){
  if( ! Array.isArray( value ) ){
    if( typeof value === "object" && value !== null ){
      return value[strPropertyName] || "";
    }
    return value;
  }

  const arrValues = [];
  for( let i = 0; i < value.length; i++ ){
    if( value[i] !== null && value[i] !== undefined ){
      if( typeof value[i] === "object" ){
        arrValues.push( value[i][strPropertyName] || "" );
      }else{
        arrValues.push( value[i] );
      }
    }
  }
  return arrValues.join( " " );
}

function stringifyQuserOrQgroupValue( value ){
  if( Array.isArray( value ) ){
    const arrValues = [];
    for( let i = 0; i < value.length; i++ ){
      arrValues.push( stringifyQuserOrQgroupValue( value[i] ) );
    }
    return arrValues.join( " " );
  }
  if( typeof value !== "object" || value === null ){
    return value;
  }

  if( value.name    !== undefined && value.name    !== null ){ return value.name;    }
  if( value.display !== undefined && value.display !== null ){ return value.display; }
  if( value.qname   !== undefined && value.qname   !== null ){ return value.qname;   }
  if( value.email   !== undefined && value.email   !== null ){ return value.email;   }

  return JSON.stringify( value );
}

function sanitizeTsvCell( value ){
  if( value === null || value === undefined ){
    return "";
  }
  return ( value + "" ).replace( /\r?\n/g, " " ).replace( /\t/g, " " );
}

function isWorkitemPropertyName( strColId ){
  const objProperties = {
    "allocateDatetime": true,
    "allocatedQgroupId": true,
    "allocatedQgroupName": true,
    "allocatedQuserId": true,
    "allocatedQuserName": true,
    "directAllocated": true,
    "endDatetime": true,
    "failType": true,
    "id": true,
    "nodeName": true,
    "nodeNumber": true,
    "offerDatetime": true,
    "read": true,
    "startDatetime": true,
    "state": true,
    "swimlaneType": true,
    "timeLimitDatetime": true,
    "parentProcessInstanceId": true,
    "processInstanceDebug": true,
    "processInstanceEndDatetime": true,
    "processInstanceId": true,
    "processInstanceIdForView": true,
    "processInstanceInitQgroupId": true,
    "processInstanceInitQgroupName": true,
    "processInstanceInitQuserId": true,
    "processInstanceInitQuserName": true,
    "processInstanceSequenceNumber": true,
    "processInstanceStartDatetime": true,
    "processInstanceState": true,
    "processInstanceTitle": true,
    "processModelId": true,
    "processModelInfoCategory": true,
    "processModelInfoId": true,
    "processModelInfoName": true,
    "processModelVersion": true,
    "starred": true
  };
  return objProperties[strColId] === true;
}

/*
### Notes-en:
- When a Workitem arrives at this Automated Step, an extraction request is sent.
- Target URL requires a trailing `/`.
- The extracted TSV is saved as the "simplest tab-separated string".
- Only the data displayed in the list specified by the `ReportID` will be stored.
- Configure the TSV column order in B0 using Data Item IDs (CSV).
    - Example: `0,47,2,8`
- To store property data of the Task (Workitem) or Case (Process Instance) in a TSV column, set the following variable names instead of the Data Item ID. (Example: `id,state,processInstanceId,0,47`)
    - Workitem ID: `id` (eg: "144978825")
    - Workitem Node/Step Name: `nodeName` (eg: "3.実施報告")
    - Workitem Node/Step Number: `nodeNumber` (eg: "7")
    - Workitem State: `state` (eg: "ALLOCATED")
    - Workitem Allocated User ID: `allocatedQuserId`
    - Workitem Allocated User Name: `allocatedQuserName`
    - Issue ID: `processInstanceId` (eg: "2965365")
    - Title: `processInstanceTitle` (eg: "DEMO サンプル化学株式会社...")
    - ...and other Process Instance properties.

#### Task (Workitem) Properties
- `allocateDatetime`: Task allocation datetime (eg: "2026-05-29T10:00:17+0900")
- `allocatedQgroupId`: Allocated Qgroup ID (eg: "3")
- `allocatedQgroupName`: Allocated Qgroup Name (eg: "Sales")
- `allocatedQuserId`: Allocated Quser ID (eg: "473")
- `allocatedQuserName`: Allocated Quser Name (eg: "SUZUKI, Ichiro")
- `directAllocated`: Direct allocation flag ("true" or "false")
- `endDatetime`: Task end datetime (Processing completed time)
- `failType`: Failure type (null if success)
- `id`: Workitem (Task) ID (eg: "144978825")
- `nodeName`: Step / Node Name (eg: "3.実施報告")
- `nodeNumber`: Step / Node Number (eg: "7")
- `offerDatetime`: Task offered datetime (eg: "2026-05-29T10:00:17+0900")
- `read`: Read flag ("true" or "false")
- `startDatetime`: Task start datetime (Processing started time)
- `state`: Task State (eg: "OFFERED", "ALLOCATED", "STARTED", "ENDED")
- `swimlaneType`: Swimlane Type (eg: "NORMAL")
- `timeLimitDatetime`: Task time limit datetime

#### Case (Process Instance) Properties
- `parentProcessInstanceId`: Parent App Process Instance ID
- `processInstanceDebug`: Debug Mode ("false" or "true")
- `processInstanceEndDatetime`: Case End Datetime
- `processInstanceId`: Case ID (eg: "2965365")
- `processInstanceIdForView`: Case ID with 'p' (eg: "p2965365")
- `processInstanceInitQgroupId`: Starting User's Organization ID
- `processInstanceInitQgroupName`: Starting User's Organization Name
- `processInstanceInitQuserId`: Starting User's User ID
- `processInstanceInitQuserName`: Starting User's User Name
- `processInstanceSequenceNumber`: Sequence Number managed at App level (eg: "1023")
- `processInstanceStartDatetime`: Case Start Datetime (eg: "2026-05-21T16:26:51+0900")
- `processInstanceState`: Case State (eg: "STARTED")
- `processInstanceTitle`: Case Title (eg: "DEMO Sample Chemical...")
- `processModelId`: App ID / Process Model ID
- `processModelInfoCategory`: App Category Name (eg: "5-営業部")
- `processModelInfoId`: App Category ID (eg: "3713")
- `processModelInfoName`: App Name / Process Model Name
- `processModelVersion`: App Version (eg: "104")
- `starred`: App Starred ("false" or "true")

### Notes-ja:
- このアドオン自動工程にタスク(ワークアイテム)が到達した際、抽出リクエストが投げられます。
    - ターゲットとなるワークフロー基盤は URL で設定します。(REST API 接続先)
        - `https://karasuma-oike-000.questetra.net/`
        - 末尾の `/` が必要である点に注意
    - ターゲットとなるワークフロー基盤が同一基盤の場合、[システム変数]による設定で代用可能利です。
        - `${var[applicationRoot]}`
- 抽出TSVは「もっともシンプルなタブ区切り文字列」として格納されます。
    - 各データ内のTABコードや改行コードは " " (半角スペース)に変換されます。
    - ダブルクオート文字も、エスケープされていない状態で保持されます。
- ReportID は、タスクリスト表示時のURI末尾を参照します。
    - `https://example.questetra.net/OR/Workitem/listView?reportId=123456789`
- ReportID で指定したリストに表示されているデータだけが格納されます。(ただし列順不同)
    - TSV列順はデータ項目IDを用いたCSVで設定します。(例: `0,47,2,8`)
    - TSV列にタスク処理のプロパティデータを格納させたい場合、データ項目IDの代わりに次の変数名を設定します。 (例: `id,state,processInstanceId,0,47`)
        - タスクID: `id` (eg: "144978825")
        - 工程名: `nodeName` (eg: "3.実施報告")
        - 工程ナンバー: `nodeNumber` (eg: "7")
        - タスク状態: `state` (eg: "ALLOCATED" または "OFFERED" など)
        - 割当ユーザーID: `allocatedQuserId`
        - 割当ユーザー名: `allocatedQuserName`
        - ケースID: `processInstanceId` (eg:"2965365")
        - 件名: `processInstanceTitle` (eg:"DEMO サンプル化学株式会社...")
        - ...その他プロセスインスタンスプロパティも利用可能です。

#### タスク処理(ワークアイテム)プロパティ】
- タスク割当日時: `allocateDatetime` (例: "2026-05-29T10:00:17+0900")
- 割当組織ID: `allocatedQgroupId` (例: "3")
- 割当組織名: `allocatedQgroupName` (例: "Sales")
- 割当ユーザID: `allocatedQuserId` (例: "473")
- 割当ユーザ名: `allocatedQuserName` (例: "鈴木 イチロー")
- 直接割当フラグ: `directAllocated` ("true" または "false")
- タスク終了日時(処理日時): `endDatetime`
- 失敗タイプ: `failType`
- タスクID: `id` (例: "144978825")
- 工程名: `nodeName` (例: "3.実施報告")
- 工程ナンバー: `nodeNumber` (例: "7")
- 受付開始日時(オファー日時): `offerDatetime` (例: "2026-05-29T10:00:17+0900")
- 既読フラグ: `read` ("true" または "false")
- タスク処理開始日時: `startDatetime`
- タスク状態: `state` (例: "OFFERED", "ALLOCATED", "STARTED", "ENDED", "FAILED")
- スイムレーンタイプ: `swimlaneType` (例: "NORMAL")
- タスク処理期限日時: `timeLimitDatetime`

#### ケース(案件・プロセスインスタンス)プロパティ
- 親アプリのケースID: `parentProcessInstanceId`
- デバッグモード: `processInstanceDebug` ("false" または "true")
- ケース終了時刻: `processInstanceEndDatetime`
- ケースID: `processInstanceId` (例: "2965365")
- ケースID(p付): `processInstanceIdForView` (例: "p2965365")
- 開始ユーザの所属組織ID: `processInstanceInitQgroupId`
- 開始ユーザの所属組織名: `processInstanceInitQgroupName`
- 開始ユーザのユーザID: `processInstanceInitQuserId`
- 開始ユーザのユーザ名: `processInstanceInitQuserName`
- ケース連番(アプリレベルで管理される変数): `processInstanceSequenceNumber` (例: "1023")
- ケース開始日時: `processInstanceStartDatetime` (例: "2026-05-21T16:26:51+0900")
- 状態: `processInstanceState` (例: "STARTED", "ENDED", "FAILED" )
- 件名: `processInstanceTitle` (例: "DEMO サンプル化学株式会社...")
- アプリID: `processModelId` (例: "143449093")
- アプリのカテゴリ名: `processModelInfoCategory` (例: "5-営業部")
- アプリのカテゴリID: `processModelInfoId` (例: "3713")
- アプリ名: `processModelInfoName` (例: "552-NEW-Lead-Followup...")
- アプリバージョン: `processModelVersion` (例: "104")
- アプリの★有無: `starred` ("false" または "true")


### APPENDIX-en
- If the number of tasks of the filter extraction result is 1000 or more, the data after 1001 will not be stored.
    - Even if 1000 or less, there is a possibility of timeout when there are many data items.
    - To control the number of extraction results
        - Extract only the processes whose status status is `Running`
        - Extract only the date data of the previous month
            - After: `#today.addMonths(-1).getFirstTimeInMonth()`
            - Before: `#today.addMonths(-1).getLastTimeInMonth()`
- "HTTP Authorization Setting" is required for automatic communication (OAuth2 API connection).
    - Register [API Client] (OAuth2) in advance as the connection destination. (Requires System Admin privileges)
        - Scope
            - Read-only API Access
        - Redirect URL
            - `https://s.questetra.net/oauth2callback`
        - Make a __note__ of your registration details.
            - Client ID
            - Client Secret (Consumer Secret)
            - Authorization Endpoint URL
            - Token Endpoint URL
    - Set "HTTP Authorization Setting" in the App as client. (Select this setting name in Addon config)
        - Authorization Endpoint URL:
            - _(See your note above)_
            - Example: `https://example.questetra.net/oauth2/authorize`
        - Token Endpoint URL:
            - _(See your note above)_
            - Example: `https://example.questetra.net/oauth2/token`
        - Scope:
            - `read`
        - Client ID
            - _(See your note above)_
        - Client Secret:
            - _(See your note above)_
- Table type data is not supported for extraction.
    - If an unsupported type, "`N/A`" is output.
    - The file names are extracted for the File type. (Multiple: Space-separated)
    - The display strings of the selected options are extracted for the Select type. (Multiple: Space-separated)


### APPENDIX-ja:
- フィルタ抽出結果のタスク処理数(ワークアイテム数)が1000件以上ある場合、1001件以降のデータは格納されません。
    - 抽出結果が1000件以下となる場合でも、データ項目の数が多い場合など、タイムアウトする可能性があります。
    - 抽出結果の数をコントロールする工夫
        - 状態ステータスが `未終了` の案件(プロセス)に絞って抽出する
        - 案件内の日付データが前月のものに絞って抽出する
            - 以降/After: `#today.addMonths(-1).getFirstTimeInMonth()`
            - 以前/Before: `#today.addMonths(-1).getLastTimeInMonth()`
- 自動通信(OAuth2 API接続)のために "HTTP認証設定" が必要です。
    - あらかじめ接続先に、[APIクライアント](OAuth2)を登録します。(システム管理者権限が必要です)
        - スコープ(Scope)
            - データを取得する API へのアクセス / Read-only API Access
        - リダイレクトURL(Redirect URL)
            - `https://s.questetra.net/oauth2callback`
        - 登録内容を __メモ__ します。
            - クライアントID(Client ID)
            - クライアントシークレット(Consumer Secret)
            - 認可エンドポイントURL(Authorization Endpoint URL)
            - トークンエンドポイントURL(Token Endpoint URL)
    - 通信元であるワークフローアプリにて[HTTP認証設定]を設定します。(この設定名をAddonコンフィグで選択)
        - 認可エンドポイント URL:
            - (メモを参照)
            - 例: `https://example.questetra.net/oauth2/authorize`
        - トークンエンドポイント URL:
            - (メモを参照)
            - 例: `https://example.questetra.net/oauth2/token`
        - スコープ:
            - `read`
        - クライアントID
            - (メモを参照)
        - クライアントシークレット:
            - (メモを参照)
- テーブル型データ項目内のデータは抽出サポート外です。
    - サポート外のデータ型は "`N/A`" が出力されます
    - ファイル型を指定した場合、ファイル名が抽出されます(複数:スペース区切り)
    - 選択型を指定した場合、表示テキストが抽出されます(複数:スペース区切り)


*/

Download

warning 自由改変可能な JavaScript (ECMAScript) コードです。いかなる保証もありません。
(アドオン自動工程のインストールは Professional editionでのみ可能です)

Notes

  • このアドオン自動工程にタスク(ワークアイテム)が到達した際、抽出リクエストが投げられます。
    • ターゲットとなるワークフロー基盤は URL で設定します。(REST API 接続先)
      • https://karasuma-oike-000.questetra.net/
      • 末尾の / が必要である点に注意
    • ターゲットとなるワークフロー基盤が同一基盤の場合、[システム変数]による設定で代用可能利です。
      • ${var[applicationRoot]}
  • 抽出TSVは「もっともシンプルなタブ区切り文字列」として格納されます。
    • 各データ内のTABコードや改行コードは ” ” (半角スペース)に変換されます。
    • ダブルクオート文字も、エスケープされていない状態で保持されます。
  • ReportID は、タスクリスト表示時のURI末尾を参照します。
    • https://example.questetra.net/OR/Workitem/listView?reportId=123456789
  • ReportID で指定したリストに表示されているデータだけが格納されます。(ただし列順不同)
    • TSV列順はデータ項目IDを用いたCSVで設定します。(例: 0,47,2,8
    • TSV列にタスク処理のプロパティデータを格納させたい場合、データ項目IDの代わりに次の変数名を設定します。 (例: id,state,processInstanceId,0,47
      • タスクID: id (eg: “144978825”)
      • 工程名: nodeName (eg: “3.実施報告”)
      • 工程ナンバー: nodeNumber (eg: “7”)
      • タスク状態: state (eg: “ALLOCATED” または “OFFERED” など)
      • 割当ユーザーID: allocatedQuserId
      • 割当ユーザー名: allocatedQuserName
      • ケースID: processInstanceId (eg:”2965365″)
      • 件名: processInstanceTitle (eg:”DEMO サンプル化学株式会社…”)
      • …その他プロセスインスタンスプロパティも利用可能です。

タスク処理(ワークアイテム)プロパティ】

  • タスク割当日時: allocateDatetime (例: “2026-05-29T10:00:17+0900”)
  • 割当組織ID: allocatedQgroupId (例: “3”)
  • 割当組織名: allocatedQgroupName (例: “Sales”)
  • 割当ユーザID: allocatedQuserId (例: “473”)
  • 割当ユーザ名: allocatedQuserName (例: “鈴木 イチロー”)
  • 直接割当フラグ: directAllocated (“true” または “false”)
  • タスク終了日時(処理日時): endDatetime
  • 失敗タイプ: failType
  • タスクID: id (例: “144978825”)
  • 工程名: nodeName (例: “3.実施報告”)
  • 工程ナンバー: nodeNumber (例: “7”)
  • 受付開始日時(オファー日時): offerDatetime (例: “2026-05-29T10:00:17+0900”)
  • 既読フラグ: read (“true” または “false”)
  • タスク処理開始日時: startDatetime
  • タスク状態: state (例: “OFFERED”, “ALLOCATED”, “STARTED”, “ENDED”, “FAILED”)
  • スイムレーンタイプ: swimlaneType (例: “NORMAL”)
  • タスク処理期限日時: timeLimitDatetime

ケース(案件・プロセスインスタンス)プロパティ

  • 親アプリのケースID: parentProcessInstanceId
  • デバッグモード: processInstanceDebug (“false” または “true”)
  • ケース終了時刻: processInstanceEndDatetime
  • ケースID: processInstanceId (例: “2965365”)
  • ケースID(p付): processInstanceIdForView (例: “p2965365”)
  • 開始ユーザの所属組織ID: processInstanceInitQgroupId
  • 開始ユーザの所属組織名: processInstanceInitQgroupName
  • 開始ユーザのユーザID: processInstanceInitQuserId
  • 開始ユーザのユーザ名: processInstanceInitQuserName
  • ケース連番(アプリレベルで管理される変数): processInstanceSequenceNumber (例: “1023”)
  • ケース開始日時: processInstanceStartDatetime (例: “2026-05-21T16:26:51+0900”)
  • 状態: processInstanceState (例: “STARTED”, “ENDED”, “FAILED” )
  • 件名: processInstanceTitle (例: “DEMO サンプル化学株式会社…”)
  • アプリID: processModelId (例: “143449093”)
  • アプリのカテゴリ名: processModelInfoCategory (例: “5-営業部”)
  • アプリのカテゴリID: processModelInfoId (例: “3713”)
  • アプリ名: processModelInfoName (例: “552-NEW-Lead-Followup…”)
  • アプリバージョン: processModelVersion (例: “104”)
  • アプリの★有無: starred (“false” または “true”)

Capture

Appendix

  • フィルタ抽出結果のタスク処理数(ワークアイテム数)が1000件以上ある場合、1001件以降のデータは格納されません。
    • 抽出結果が1000件以下となる場合でも、データ項目の数が多い場合など、タイムアウトする可能性があります。
    • 抽出結果の数をコントロールする工夫
      • 状態ステータスが 未終了 の案件(プロセス)に絞って抽出する
      • 案件内の日付データが前月のものに絞って抽出する
        • 以降/After: #today.addMonths(-1).getFirstTimeInMonth()
        • 以前/Before: #today.addMonths(-1).getLastTimeInMonth()
  • 自動通信(OAuth2 API接続)のために “HTTP認証設定” が必要です。
    • あらかじめ接続先に、[APIクライアント](OAuth2)を登録します。(システム管理者権限が必要です)
      • スコープ(Scope)
        • データを取得する API へのアクセス / Read-only API Access
      • リダイレクトURL(Redirect URL)
        • https://s.questetra.net/oauth2callback
      • 登録内容を メモ します。
        • クライアントID(Client ID)
        • クライアントシークレット(Consumer Secret)
        • 認可エンドポイントURL(Authorization Endpoint URL)
        • トークンエンドポイントURL(Token Endpoint URL)
    • 通信元であるワークフローアプリにて[HTTP認証設定]を設定します。(この設定名をAddonコンフィグで選択)
      • 認可エンドポイント URL:
        • (メモを参照)
        • 例: https://example.questetra.net/oauth2/authorize
      • トークンエンドポイント URL:
        • (メモを参照)
        • 例: https://example.questetra.net/oauth2/token
      • スコープ:
        • read
      • クライアントID
        • (メモを参照)
      • クライアントシークレット:
        • (メモを参照)
  • テーブル型データ項目内のデータは抽出サポート外です。
    • サポート外のデータ型は “N/A” が出力されます
    • ファイル型を指定した場合、ファイル名が抽出されます(複数:スペース区切り)
    • 選択型を指定した場合、表示テキストが抽出されます(複数:スペース区切り)

See Also

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む