#複数ファイル: ファイル名フィルタ
ファイル型データに格納されているファイル群から条件にマッチするファイルだけを抽出します。マッチ条件には「と等しい」「を含む」「で始まる」「で終わる」のいずれかが指定できます。大文字小文字を区別しないフィルタも指定可能です。なお、残されたファイル(抽出されなかったファイル)を格納することも可能です。
Configs for this Auto Step
- SelectConfA1
- A1: オリジナルのファイル群が格納されているファイル型データ項目を選択してください *
- OptionConfB1
- B1: マッチ条件の演算子を選択してください *
- StrConfB2
- B2: マッチ条件の Keywords をセットしてください (複数行セットはOR検索) *#{EL}
- StrConfB3
- B3: 制限したい場合、最大抽出数をセットしてください (例: “1”)#{EL}
- SelectConfC1
- C1: 抽出ファイルを格納するファイル型データ項目を選択してください (更新)
- SelectConfC2
- C2: 抽出ファイルを格納するファイル型データ項目を選択してください (追加)
- SelectConfC3
- C3: 抽出されなかったファイル群を格納するファイル型データ項目を選択してください (更新)
Script (click to open)
/**
* Questetra Add-on: FILE名によるフィルタ
*
* ファイル型データに格納された複数のファイルから、
* 指定された文字列条件(equals / contains / startsWith / endsWith など)に基づいて
* マッチするファイルのみを抽出し、別のファイル型データに格納する。
*
* 対応演算子: 大文字小文字区別あり・なしを指定可能。
*
* @engine GraalJS standard mode (engine-type: 3)
* @license MIT License
* @lastModified 2025-06-10
*/
//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){
//// == Config Retrieving / 工程コンフィグの参照 ==
const filesPocketOriginal = configs.getObject( "SelectConfA1" ); /// REQUIRED ///////////////
let filesOriginal = engine.findData( filesPocketOriginal ); // java.util.ArrayList
// java.util.List of com.questetra.bpms.core.event.scripttask.QfileView
if( filesOriginal === null ) {
throw new Error( "\n AutomatedTask UnexpectedFileError:" +
" No File {A1} is attached \n" );
}else{
engine.log( " AutomatedTask FilesArray {A1}: " +
filesOriginal.size() + " files" );
}
const strOperator = configs.get ( "OptionConfB1" ); /// REQUIRED (SELECT_ITEM)
// "equals", "conains", "stratswith", "endswith",
// "equals2", "conains2", "startswith2", "endswith2" (2:ignore case)
const strKeywords = configs.get ( "StrConfB2" ); /// REQUIRED
if( strKeywords === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {B2: String} is empty \n" );
}
/** @type {number} 最大抽出数(指定なしの場合は無制限) */
const strMax = configs.get ( "StrConfB3" ); // not required
const numMax = isNaN ( parseInt(strMax,10) ) ?
Infinity : // defalut
parseInt(strMax,10);
engine.log( " #of Max: " + numMax );
/** @type {java.util.ArrayList} 抽出ファイル格納用 */
const filesPocketUpdate = configs.getObject( "SelectConfC1" ); // NotRequired /////////////
let filesUpdate = new java.util.ArrayList();
/** @type {java.util.ArrayList} 追加格納用(既存に追加) */
const filesPocketAppend = configs.getObject( "SelectConfC2" ); // NotRequired /////////////
let filesAppend = new java.util.ArrayList();
if ( filesPocketAppend !== null ) {
if ( engine.findData( filesPocketAppend ) !== null ) {
filesAppend = engine.findData( filesPocketAppend ); // java.util.ArrayList
engine.log( " AutomatedTask FilesArray {C2}: " +
filesAppend.size() + " files" );
}
}
/** @type {java.util.ArrayList} 抽出されなかったファイル格納用 */
const filesPocketLeft = configs.getObject( "SelectConfC3" ); // NotRequired /////////////
let filesLeft = new java.util.ArrayList();
//// == Data Retrieving / ワークフローデータの参照 ==
// (Nothing. Retrieved via Expression Language in Config Retrieving)
//// == Calculating / 演算 ==
const arrKeywords = strKeywords.split( '\n' ).filter(k => k !== "");
if ( strOperator === "equals" ) {
loopInput:
for ( let i = 0; i < filesOriginal.size(); i++ ) {
const fileTmp = new com.questetra.bpms.core.event.scripttask.NewQfile(
filesOriginal.get(i).getName(),
filesOriginal.get(i).getContentType(),
filesOriginal.get(i)
);
if ( filesUpdate.size() < numMax ){
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( filesOriginal.get(i).getName() == arrKeywords[j] ){
filesUpdate.add ( fileTmp );
filesAppend.add ( fileTmp );
continue loopInput;
}
}
}
filesLeft.add ( fileTmp );
}
} else if ( strOperator === "equals2" ) {
loopInput:
for ( let i = 0; i < filesOriginal.size(); i++ ) {
const fileTmp = new com.questetra.bpms.core.event.scripttask.NewQfile(
filesOriginal.get(i).getName(),
filesOriginal.get(i).getContentType(),
filesOriginal.get(i)
);
if ( filesUpdate.size() < numMax ){
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( filesOriginal.get(i).getName().toUpperCase() == arrKeywords[j].toUpperCase() ){
filesUpdate.add ( fileTmp );
filesAppend.add ( fileTmp );
continue loopInput;
}
}
}
filesLeft.add ( fileTmp );
}
} else if ( strOperator === "contains" ) {
loopInput:
for ( let i = 0; i < filesOriginal.size(); i++ ) {
const fileTmp = new com.questetra.bpms.core.event.scripttask.NewQfile(
filesOriginal.get(i).getName(),
filesOriginal.get(i).getContentType(),
filesOriginal.get(i)
);
if ( filesUpdate.size() < numMax ){
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( filesOriginal.get(i).getName().includes( arrKeywords[j] ) ){
filesUpdate.add ( fileTmp );
filesAppend.add ( fileTmp );
continue loopInput;
}
}
}
filesLeft.add ( fileTmp );
}
} else if ( strOperator === "contains2" ) {
loopInput:
for ( let i = 0; i < filesOriginal.size(); i++ ) {
const fileTmp = new com.questetra.bpms.core.event.scripttask.NewQfile(
filesOriginal.get(i).getName(),
filesOriginal.get(i).getContentType(),
filesOriginal.get(i)
);
if ( filesUpdate.size() < numMax ){
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( filesOriginal.get(i).getName().toUpperCase().includes( arrKeywords[j].toUpperCase() ) ){
filesUpdate.add ( fileTmp );
filesAppend.add ( fileTmp );
continue loopInput;
}
}
}
filesLeft.add ( fileTmp );
}
} else if ( strOperator === "startswith" ) {
loopInput:
for ( let i = 0; i < filesOriginal.size(); i++ ) {
const fileTmp = new com.questetra.bpms.core.event.scripttask.NewQfile(
filesOriginal.get(i).getName(),
filesOriginal.get(i).getContentType(),
filesOriginal.get(i)
);
if ( filesUpdate.size() < numMax ){
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( filesOriginal.get(i).getName().startsWith( arrKeywords[j] ) ){
filesUpdate.add ( fileTmp );
filesAppend.add ( fileTmp );
continue loopInput;
}
}
}
filesLeft.add ( fileTmp );
}
} else if ( strOperator === "startswith2" ) {
loopInput:
for ( let i = 0; i < filesOriginal.size(); i++ ) {
const fileTmp = new com.questetra.bpms.core.event.scripttask.NewQfile(
filesOriginal.get(i).getName(),
filesOriginal.get(i).getContentType(),
filesOriginal.get(i)
);
if ( filesUpdate.size() < numMax ){
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( filesOriginal.get(i).getName().toUpperCase().startsWith( arrKeywords[j].toUpperCase() ) ){
filesUpdate.add ( fileTmp );
filesAppend.add ( fileTmp );
continue loopInput;
}
}
}
filesLeft.add ( fileTmp );
}
} else if ( strOperator === "endswith" ) {
loopInput:
for ( let i = 0; i < filesOriginal.size(); i++ ) {
const fileTmp = new com.questetra.bpms.core.event.scripttask.NewQfile(
filesOriginal.get(i).getName(),
filesOriginal.get(i).getContentType(),
filesOriginal.get(i)
);
if ( filesUpdate.size() < numMax ){
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWarning: Empty in Keywords config" );
continue;
}
if ( filesOriginal.get(i).getName().endsWith( arrKeywords[j] ) ){
filesUpdate.add ( fileTmp );
filesAppend.add ( fileTmp );
continue loopInput;
}
}
}
filesLeft.add ( fileTmp );
}
} else if ( strOperator === "endswith2" ) {
loopInput:
for ( let i = 0; i < filesOriginal.size(); i++ ) {
const fileTmp = new com.questetra.bpms.core.event.scripttask.NewQfile(
filesOriginal.get(i).getName(),
filesOriginal.get(i).getContentType(),
filesOriginal.get(i)
);
if ( filesUpdate.size() < numMax ){
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWarning: Empty in Keywords config" );
continue;
}
if ( filesOriginal.get(i).getName().toUpperCase().endsWith( arrKeywords[j].toUpperCase() ) ){
filesUpdate.add ( fileTmp );
filesAppend.add ( fileTmp );
continue loopInput;
}
}
}
filesLeft.add ( fileTmp );
}
} else {
throw new Error( "\n AutomatedTask RuntimeError:" +
" Unexpected OPERATOR \n" );
}
//// == Data Updating / ワークフローデータへの代入 ==
if ( filesPocketUpdate !== null ) {
engine.setData( filesPocketUpdate, filesUpdate );
}
if ( filesPocketAppend !== null ) {
engine.setData( filesPocketAppend, filesAppend );
}
if ( filesPocketLeft !== null ) {
engine.setData( filesPocketLeft, filesLeft );
}
} //////// END "main()" /////////////////////////////////////////////////////////////////
/*
Notes:
- Use this when you want to extract a part of the files stored in the "File type data item".
- When a Process token reaches the automatde step, files that match the conditions will be automatically extracted.
- If to narrow down to image files only:
- File name "ends with" `.png` or `.jpg`
- If to pass "one PNG file" to the generation AI:
- File name "ends with" `.png`
- and Maximum number of extractions is `1`
- Also possible to store files that were not extracted.
Notes-ja:
- "ファイル型データ項目" に格納されているファイル群から、一部を抽出したい場合に利用します。
- 案件が自動工程に到達した際、条件にマッチするファイルが自動的に抽出されます。
- 画像ファイルだけに絞り込みたい場合の設定例:
- ファイル名が `.png` もしくは `.jpg` で "終わる"
- 生成AIに「1枚のPNGファイル」を渡したい場合の設定例:
- ファイル名が `.png` で "終わる"
- 最大抽出数は `1`
- 抽出されなかったファイル群を格納することも可能です。
*/
Download
- files-filter-by-filename-2025.xml
- 2025-06-10 (C) Questetra, Inc. (MIT License)
自由改変可能な JavaScript (ECMAScript) コードです。いかなる保証もありません。
(アドオン自動工程のインストールは Professional editionでのみ可能です)
(アドオン自動工程のインストールは Professional editionでのみ可能です)
Notes
- “ファイル型データ項目” に格納されているファイル群から、一部を抽出したい場合に利用します。
- 案件が自動工程に到達した際、条件にマッチするファイルが自動的に抽出されます。
- 画像ファイルだけに絞り込みたい場合の設定例:
- ファイル名が
.pngもしくは.jpgで “終わる”
- ファイル名が
- 生成AIに「1枚のPNGファイル」を渡したい場合の設定例:
- ファイル名が
.pngで “終わる” - 最大抽出数は
1
- ファイル名が
- 抽出されなかったファイル群を格納することも可能です。
Capture


Appendix
- B1: マッチ条件の演算子を選択してください
- 次と等しい
- 次と等しい(大文字小文字の区別なし)
- 次を含む
- 次を含む(大文字小文字の区別なし)
- 次で始まる
- 次で始まる(大文字小文字の区別なし)
- 次で終わる
- 次で終わる(大文字小文字の区別なし)
