> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Splitter Script アクティビティ

> Splitter Script アクティビティを使用すると、すべてのページに一度に対して実行されるカスタム JavaScript を使って、トランザクションのページを複数の出力文書に分割できます。

Document Splitter Skill を作成すると、文書処理フローは Splitter Script アクティビティで終了します。最終ステップでは、トランザクション内のページフローを複数の文書に分割します。

他のアクティビティと異なり、このアクティビティはトランザクション内のすべてのページを一度に処理します。

<div id="set-up-the-activity">
  ## アクティビティの設定
</div>

<Steps>
  <Step title="文書タイプの追加">
    **Splitter Script Properties** ペインでプラスの icon をクリックし、クラスを1つずつ作成して、想定されるドキュメントタイプを追加します。
  </Step>

  <Step title="スクリプト エディターを開く">
    **Splitter Script Properties** ペインで **スクリプト エディター** をクリックします。
  </Step>

  <Step title="スクリプトの設定">
    ページをどのようにドキュメントへまとめるかを決定するスクリプトを設定します。スクリプトはトランザクション内のすべてのページにアクセスできます。一般的には、ページを順に走査し、各ページが新しいドキュメントの開始かを判定します。開始でない場合は前のドキュメントに追加します。スクリプトで使用できるオブジェクトの詳細については、[Object model](/ja/vantage/documentation/advanced-designer/activities/splitter-script/object-model) を参照してください。
  </Step>

  <Step title="保存">
    **Save** をクリックします。
  </Step>
</Steps>

<div id="sample-scripts">
  ## サンプルスクリプト
</div>

このセクションでは、さまざまな Document Splitter Skill のユースケースに対応するサンプルスクリプトを紹介します。以下のスクリプト例では、すべてドキュメント定義内に「ResultClassId」という名前の field が存在することを前提としています。この field にはドキュメントクラスを格納する必要があります。

<div id="separate-documents-of-the-same-type">
  ### 同一タイプのDocumentを分割する
</div>

入力ファイルには、特定の期間における1社のベンダーの請求書が含まれています。各請求書の最初のページには請求書番号が記載されています。

Documentの最初のページには、たとえばタイトルや請求書番号などの特定のデータが含まれる場合があります。現在のページが新しいDocumentの最初のページかどうかを判定するには、該当するfieldがそのページで見つかったかを確認します。連続するページのfield値 (例：ページ番号や請求書番号) を分析することもできます。

次の例では、連続する2ページで見つかった請求書番号を比較し、現在のページで"FirstPageMarker" fieldが見つかったかを確認します。fieldが見つかった場合、または請求書番号が異なる場合、現在のページは新しいDocumentの最初のページと見なされます。

```javascript theme={null}
var documents = [];
var currentDocument = null;
var currentInvoiceNumber = "";

for (let i = 0; i < Context.Pages.length; i++)
{
    const page = Context.Pages[i];
    let invoiceNumberField = page.GetField("InvoiceNumber");
    let invoiceNumberNormalized = invoiceNumberField.Text.replace(/[. -]/g, '');
    let firstPageMarker = page.GetField("FirstPageMarker");
    var hasInvoiceNumber = invoiceNumberField !== null &&  invoiceNumberNormalized !== "";
    var hasNewInvoiceNumber = hasInvoiceNumber && invoiceNumberNormalized !== currentInvoiceNumber;
    var hasFirstPageMarker = firstPageMarker !== null && firstPageMarker.Text;

    if (!currentDocument || hasNewInvoiceNumber || (!hasInvoiceNumber && hasFirstPageMarker))
    { 
        currentDocument = new Document('invoice');
        documents.push(currentDocument);
    }

    if (hasInvoiceNumber)
    {
        currentInvoiceNumber =  invoiceNumberNormalized;
    }
 
    currentDocument.Pages.push(page);
}

return documents;
```

<div id="separate-documents-and-remove-annexes">
  ### Document の分割と別紙の削除
</div>

このドキュメントには付録や空白ページが含まれており、それらからはデータを抽出せずに保存する必要があります。

ドキュメントに付録や空白ページがあるかどうかを判断するには、有用なデータが見つからないページがあるかを確認します。例えば、任意の単語を検出する field を追加し、単語が見つからなかったページをすべて空白と見なします。

以下の例では、Field の Text に基づいて、空白ページと非空白ページを分離します。

```javascript theme={null}
var empty = new Document('empty'); 
var invoice = new Document('invoice'); 

for (let i = 0; i < Context.Pages.length; i++) { 
    const page = Context.Pages[i]; 

    // 現在のページの "Field" プロパティのテキスト値を取得 
    var currentResult = page.GetField("Field").Text; 

    // 現在の結果の長さが0より大きいかチェック 
    if (currentResult.length > 0) { 
        invoice.Pages.push(page); 
    } else { 
        empty.Pages.push(page); 
    } 
}

return [invoice, empty];
```

<div id="separate-documents-and-determine-their-type">
  ### ドキュメントを分離して、その型を判定する
</div>

<div id="case-1-each-document-type-is-represented-by-a-single-document">
  #### ケース 1. 各文書タイプは 1 つのドキュメントで表される
</div>

ローン申請には、異なる種類のドキュメントが含まれます。各種類は 1 つのドキュメントで表されます。すべてのドキュメントは 1 つのファイルで提供されます。

現在のページが新しいドキュメントの先頭ページかどうかを判定するには、そのクラスを前のページのクラスと比較するだけで構いません。

```javascript theme={null}
var documents = [];
var currentResultClassId = null;
var currentDocument = null;

for (let i = 0; i < Context.Pages.length; i++)
{
    const page = Context.Pages[i];
    const pageResultClassId = page.GetField('ResultClassId').Text;

    // 現在のページが前のページと同じクラスかどうかを確認します。異なる場合は、新しいドキュメントを開始します。
    if (pageResultClassId != currentResultClassId || !currentDocument)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;
```

<div id="case-2-each-document-type-is-represented-by-one-or-several-documents">
  #### ケース 2. 各文書タイプは 1 つまたは複数のドキュメントで表される
</div>

2 人の共同申請者によって提出されたローン申請には、さまざまなタイプの多数のドキュメントが含まれます。各タイプは、連続する複数のドキュメントで表される場合があります。たとえば、申請には両共同申請者の本人確認書類の画像や、複数の銀行取引明細などが含まれることがあります。

現在のページが新しいドキュメントの先頭ページかどうかを判定するには、上で説明した 2 つの戦略を組み合わせます。

次の例では、まず連続する 2 ページのクラスを比較します。クラスが変わっていれば、現在のページは新しいドキュメントの先頭ページと見なされます。ページが同じクラスに属している場合は、現在のページで「Title」Field が見つかったかを確認します。この Field が見つかったページを新しいドキュメントの先頭ページと見なします。

```javascript theme={null}
var documents = [];
var currentResultClassId = null;
var currentDocument = null;

for (let i = 0; i < Context.Pages.length; i++)
{
    const page = Context.Pages[i];
    const pageResultClassId = page.GetField('ResultClassId').Text;

    // 現在のページが前のページと同じクラスを持つかどうかを確認します。異なる場合は、新しいDocumentを開始します。
    if (pageResultClassId != currentResultClassId)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }
    // 現在のページで「Title」fieldが見つかった場合は、新しいDocumentを開始します。
    else if (page.GetField("Title").Text || !currentDocument)
    {
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;
```

<div id="reorder-pages-and-remove-empty-pages">
  ### ページの並べ替えと空白ページの削除
</div>

このドキュメントには、ページの順序が誤っているものがあります。各ページにはページ番号を示すfield (例: "Page 1 of 10") が含まれています。ページを正しく整理するには、ページ番号を抽出するfieldを作成する必要があります。

さらに、各ページにTextが存在するかどうかを判定して、そのページが空白かどうかを示すfieldを作成することもできます。これは、[ドキュメントの分離と別紙の削除](#separate-documents-and-remove-annexes) セクションで説明しているとおり、空白または不要なページ (例: 両面スキャン時に裏面が空白の折り目部分などで発生するページ) を破棄するのに使用できます。

次の例では、ページ番号に基づいてページを並べ替えます。

```javascript theme={null}
var documents = new Document('document'); 
var currentDocument = null; 
let arr = []; 

for (let i = 0; i < Context.Pages.length; i++) { 
    arr[i] = Context.Pages[i]; 
} 

// 各ページの特定のfieldの数値に基づいて「arr」配列をソートする 
arr.sort((page1, page2) => parseInt(page1.GetField("Field").Text) - parseInt(page2.GetField("Field").Text)); 

// ソート済みの「arr」配列を反復処理し、各「page」オブジェクトを「documents」Documentの「Pages」プロパティに追加する 
for (let i = 0; i < arr.length; i++) { 
    const page = arr[i]; 
    documents.Pages.push(page); 
} 

return [documents];
```
