#複数ファイル: ファイル名フィルタ

#複数ファイル: ファイル名フィルタ

#複数ファイル: ファイル名フィルタ

translate #Files: Filter by FileName

ファイル型データに格納されているファイル群から条件にマッチするファイルだけを抽出します。マッチ条件には「と等しい」「を含む」「で始まる」「で終わる」のいずれかが指定できます。大文字小文字を区別しないフィルタも指定可能です。なお、残されたファイル(抽出されなかったファイル)を格納することも可能です。

Auto Step icon
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

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

Notes

  • “ファイル型データ項目” に格納されているファイル群から、一部を抽出したい場合に利用します。
    • 案件が自動工程に到達した際、条件にマッチするファイルが自動的に抽出されます。
    • 画像ファイルだけに絞り込みたい場合の設定例:
      • ファイル名が .png もしくは .jpg で “終わる”
    • 生成AIに「1枚のPNGファイル」を渡したい場合の設定例:
      • ファイル名が .png で “終わる”
      • 最大抽出数は 1
  • 抽出されなかったファイル群を格納することも可能です。

Capture

Appendix

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

See Also

上部へスクロール

Questetra Supportをもっと見る

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

続きを読む