> ## 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.

# サンプルスクリプト

> 一般的な カスタム アクティビティ シナリオ向けの JavaScript サンプル — OAuth、外部サービスへのエクスポート、field の変更、テーブル操作、JSON 生成。

以下の JavaScript サンプルでは、カスタム アクティビティ スクリプトでよく使われるパターンを紹介します。内容は、OAuth 認可、外部サービスへのエクスポートの送信、抽出された field の変更、テーブル操作、カスタム JSON の生成、ソースファイル名の取得です。コピーして、ご自身の field 名やエンドポイントに合わせて調整してください。

<div id="authorize-via-oauth-and-send-export-data-to-an-external-service">
  ## OAuth で認可し、エクスポート データを外部サービスに送信する
</div>

次のスクリプトは、Resource Owner Password フローで取得したトークンを用いて認証を行い、その後、エクスポート データを外部サービスに送信します。

```javascript theme={null}
// このサンプルカスタムエクスポートスクリプトは、OAuth 2.0 Resource Owner Password Flowの認証リクエストを送信し、トークンを受信して、
// エクスポート結果をJSON形式で外部システムに送信する方法を示しています

// 認証リクエストのキー値ボディを準備します（パラメータとその値は異なる場合があります）。対応する環境変数を事前に作成する必要があります。
var authDataContent = {};
authDataContent.grant_type = Context.GetSecret("password_secretName");
authDataContent.scope = "openid permissions";

// 環境変数を使用して機密データを渡します。対応する変数を事前に作成する必要があります。
authDataContent.client_id = Context.GetSecret("client_id_secretName");
authDataContent.client_secret = Context.GetSecret("client_secret_secretName");
authDataContent.password = Context.GetSecret("password_secretName");
authDataContent.username = Context.GetSecret("username_secretName");

// リクエストを作成してデータを送信
var request = Context.CreateHttpRequest();
request.Url = "https://my_auth_service.com/auth2/connect/token"
request.Method = "POST";

// 認証リクエストのコンテンツデータを作成
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// ドキュメントからすべてのエクスポートを取得
var exports = Context.Transaction.Documents[0].Exports;

// JSONエクスポート結果を選択
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// リクエストのコンテンツデータを作成
var multiPartRequest = Context.CreateMultipartFormDataRequest();
multiPartRequest.Url = "https://my_service.com/api/v1.0/process_method"
multiPartRequest.Method = "POST";
multiPartRequest.AuthToken = authResponseObject.access_token;
multiPartRequest.AuthScheme = "Bearer";

// エクスポート結果に抽出されたデータを追加
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// エクスポートされたPDFを追加
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// サービスにリクエストを送信
multiPartRequest.Send();

// デシリアライズされたレスポンス結果を取得
var responseObject = JSON.parse(multiPartRequest.ResponseText);
```

<div id="send-export-data-to-an-external-service">
  ## エクスポートデータを外部サービスに送信する
</div>

次のスクリプトでは、請求書番号を使ってエクスポートファイルに名前を付け、その後エクスポートデータを外部サービス (この場合は Dropbox) に送信します。

```javascript theme={null}
// このサンプルのカスタムエクスポートスクリプトは、Dropboxにファイルを送信し、
// 抽出されたデータfieldの値を使用してファイル名を設定する方法を示しています。

// ドキュメントのエクスポート結果を取得する
var exports = Context.Transaction.Documents[0].Exports;
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// DropBox APIのアクセストークンを取得する (https://developers.dropbox.com/en-us/oauth-guide)。対応する環境変数を事前に作成しておく必要があります。
var token = Context.GetSecret("access_token_secretName");

// 抽出されたデータから「請求書番号」を取得する
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// 結果ファイル名を作成する
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// 抽出されたデータを含むJSONファイルをDropBoxに送信する
var httpRequest = Context.CreateHttpRequest();
httpRequest.Url = "https://content.dropboxapi.com/2/files/upload"
httpRequest.Method = "POST";
httpRequest.AuthScheme = "Bearer";
httpRequest.AuthToken = token;
httpRequest.SetHeader("Dropbox-API-Arg", `{"path": "/Files/${jsonFileName}", "mode": "add", "autorename": true, "mute": false, "strict_conflict": false}`);
httpRequest.SetFileContent(extractedDataExportResult, "application/octet-stream");
httpRequest.Send();
```

<div id="modify-extracted-data">
  ## 抽出データを変更する
</div>

次のスクリプトでは、外部サービスからのレスポンスに含まれる情報を使用して、既存のfieldの値を変更し、繰り返しfieldに新しい値を追加します。

```javascript theme={null}
// このサンプルのカスタムアクティビティスクリプトは、既存のfieldを変更し、
// 外部呼び出しの結果に基づいて新しいfield値を作成する方法を示しています。

// ドキュメントからすべてのエクスポートを取得する
var exports = Context.Transaction.Documents[0].Exports;

// エクスポートからJSONエクスポート結果を取得する
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// エクスポートからPDFエクスポート結果を取得する
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// HTTPリクエストを作成し、必要なリクエストプロパティを指定する
var multipartFormDataRequest = Context.CreateMultipartFormDataRequest();
multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"
multipartFormDataRequest.Method = "POST";

// JSONエクスポート結果から抽出したデータをリクエストに追加する
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// エクスポート結果のPDFをリクエストに追加する
multipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");

// HTTPリクエストの完了タイムアウトを設定する（分単位）。
// デフォルトのタイムアウトは1分です。
multipartFormDataRequest.Timeout = 1;

// サービスにリクエストを送信する
multipartFormDataRequest.Send();

// レスポンス結果を取得する
var newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);

// レスポンス結果として以下のようなJSONが返された場合を想定する:
/* {
    "DocumentData": {
        "Fields": {
            "InvoiceNumber": "706-222-3151",
            "InvoiceDate": "15.05.2020",
            "PurchaseOrder": [
                {
                    "OrderNumber": "25646788",
                    "Total": "540.54"
                },
                {
                    "OrderNumber": "24516684",
                    "Total": "138.43"
                }
            ]
        }
    }
}*/

// 外部呼び出しから受信したデータに基づいて、既存のVantageドキュメントfieldの値を変更する
var document = Context.Transaction.Documents[0];
var invoiceNumber = document.GetField("Invoice Number");
if (invoiceNumber.InstanceId === undefined || invoiceNumber.InstanceId === null)
    invoiceNumber.AddInstance();
invoiceNumber.Value = newJsonDataObject.DocumentData.Fields.InvoiceNumber;

// 外部呼び出しから受信したデータに基づいて、新しいVantageドキュメントfield値を追加する
var poOrder = Context.Transaction.Documents[0].GetField("Purchase Order");
let orderNumberFieldId = document.GetField("Purchase Order/Order Number").Id;
let totalFieldId = document.GetField("Purchase Order/Total").Id;
newJsonDataObject.DocumentData.Fields.PurchaseOrder.forEach(function (elem) {
    var newOrder = poOrder.AddInstance();
    var orderNumber = newOrder.Children.find(x => x.Id === orderNumberFieldId);
    orderNumber.Value = elem.OrderNumber;
    var total = newOrder.Children.find(x => x.Id === totalFieldId);
    total.Value = elem.Total;
});
```

<div id="retrieve-data-from-a-specific-table-column">
  ## 特定のテーブル列からデータを取得する
</div>

次のスクリプトは、**Description** テーブル列のすべての値 (各行の値) をトランザクションのイベントログに書き込みます。

```javascript theme={null}
// トランザクション内の最初のドキュメントを取得する
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// テーブルオブジェクトを取得する
var table = document.GetField("Line Items");

for (var i = 0; i < table.Instances.length; i++) {
  // 各テーブル行の 'Description' 列オブジェクトを取得し、その値をトランザクションイベントログに書き込む
  var columnDescription = table.Instances[i].Children.find(x => x.Id === descriptionFieldId);
  Context.LogMessage("Description. Row " + i + ": " + columnDescription.Value);
}
```

<div id="retrieve-data-from-all-table-columns">
  ## すべてのテーブル列のデータを取得する
</div>

次のスクリプトは、すべてのテーブル列の値 (各行) をトランザクションイベントログに書き込みます。

```javascript theme={null}
// トランザクション内の最初のドキュメントを取得する
var document = Context.Transaction.Documents[0];

// テーブルオブジェクトを取得する
var table = document.GetField("Line Items");

// すべてのテーブルデータをトランザクションイベントログに書き込む
for (var i = 0; i < table.Instances.length; i++) {
    for (var j = 0; j < table.Instances[i].Children.length; j++) {
        Context.LogMessage("Table row "+i+". Column "+table.Instances[i].Children[j].Name+": "+table.Instances[i].Children[j].Value);
    }
}
```

<div id="add-rows-to-a-table">
  ## テーブルに行を追加する
</div>

次のスクリプトでは、テーブルに新しい行を追加し、**Description** 列と **Quantity** 列に値を設定します。

```javascript theme={null}
// トランザクション内の最初のドキュメントを取得する
var document = Context.Transaction.Documents[0];

// テーブルオブジェクトを取得する
var table = document.GetField("Line Items");
var descriptionFieldId = document.GetField("Line Items/Description").Id;
var quantityFieldId = document.GetField("Line Items/Quantity").Id;
var tableRowCount = table.Instances.length;

// テーブルに1行追加し、DescriptionおよびQuantity列の値を設定する関数を作成する
function addRow(valueDescription, valueQuantity, index) {
    table.AddInstance();
    var columnDescription = table.Instances[index].Children.find(x => x.Id === descriptionFieldId);
    columnDescription.Value = valueDescription;
    var columnQuantity = table.Instances[index].Children.find(x => x.Id === quantityFieldId);
    columnQuantity.Value = valueQuantity;
}

// 3行追加して値を設定する
addRow("49910 - Gloves or mittens, NOI, in boxes", 4, tableRowCount++);
addRow("15560 - Bulk, NOI, inflated", 42, tableRowCount++);
addRow("15520 - Athletic or Sporting Goods, NOI", 24, tableRowCount++);
```

<div id="delete-rows-from-a-table">
  ## テーブルから行を削除する
</div>

次のスクリプトは、テーブル内のすべての行を削除します。

```javascript theme={null}
// トランザクション内の最初のdocumentを取得する
var document = Context.Transaction.Documents[0];

// テーブルオブジェクトを取得する
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// インデックスを使用してすべての行を削除する
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// またはテーブル全体を削除する
table.Remove();
```

<div id="delete-a-specific-instance-of-a-repeating-field">
  ## 繰り返し field の特定のインスタンスを削除する
</div>

次のスクリプトは、繰り返し field の最後のインスタンスを削除します。

```javascript theme={null}
// トランザクション内の最初のドキュメントを取得する
var document = Context.Transaction.Documents[0];

// 繰り返しfieldオブジェクトを取得する
var rField = document.GetField("First Name");

// このfieldが繰り返しかどうかを確認する
if (rField.IsRepeatable) {
    // このfieldの最後のインスタンスを削除する
    if (rField.Instances.length >= 1) {
        rField.Instances[rField.Instances.length-1].Remove();
    }  
}
else {
    Context.LogMessage(rField.Name + " is not repeating.");
}
```

<div id="generate-a-json-file-and-send-it-to-a-third-party-system">
  ## JSON ファイルを生成してサードパーティのシステムに送信する
</div>

次のスクリプトは、カスタム形式の JSON ファイルを生成し、サードパーティのシステムに送信します。

```javascript theme={null}
// このサンプルカスタムエクスポートスクリプトは、JSON文字列を作成する方法を示しています
// 抽出されたInvoice USのfield値を使用して外部エンドポイントに送信します。
// トランザクション内の最初のDocumentを取得します。
var document = Context.Transaction.Documents[0];

// Create a JSON object and set its key/value pairs.
var extractedValues = {};
extractedValues.Total = document.GetField("Total").Value;
extractedValues.Currency = document.GetField("Currency").Value;
extractedValues.Date = document.GetField("Invoice Date").Value;

// Get repeating field values and set them as array JSON values.
extractedValues.PurchaseOrderNumber = [];
var poGroup = document.GetField("Purchase Order");
var orderNumberFieldId = document.GetField("Purchase Order/Order Number").Id;
for (var i = 0; i < poGroup.Instances.length; i++) {
  var poNumber = poGroup.Instances[i].Children.find(x => x.Id === orderNumberFieldId);
  extractedValues.PurchaseOrderNumber.push(poNumber.Value);
}

// The received JSON file is of the following format:
/* {
   "Total": 1819.14,
   "Currency": "USD",
   "Date": "2019-05-23T00:00:00.000Z",
   "PurchaseOrderNumber": [
      "012345678",
      "4500123466"
   ]
}*/

// Send a multipart/form-data request with the JSON created previously as the string content of that request.
var httpRequest = Context.CreateMultipartFormDataRequest();
httpRequest.Method = "POST";
httpRequest.Url = "https://external-endpoint.com/api/v1.0/tasks/1495c913-17bb-48d4-8041-a240e05ca9a4/process";
httpRequest.AppendStringContent(JSON.stringify(extractedValues), "jsonData");
httpRequest.Send();
```

<div id="retrieve-original-file-names">
  ## 元のファイル名を取得する
</div>

次のスクリプトは、ファイルの元の名前を **MyField** field に格納します。

```javascript theme={null}
// ソースファイルの名前を取得し、指定したfield（"MyField"）の値として設定する
Context.Transaction.Documents.forEach( doc => {
    // Scanning Stationの場合、ソースファイル名は登録パラメーターに格納される
    var param = doc.RegistrationParameters["SourceFileName"]; 
    doc.GetField("MyField").Value = param != null ?
        param.Value : doc.SourceFiles[0].FileName;
});
```

<div id="related-topics">
  ## 関連トピック
</div>

* [カスタム アクティビティ](/ja/vantage/documentation/skill-designer/process/custom-activity/custom-activity)
* [オブジェクト モデル](/ja/vantage/documentation/skill-designer/process/custom-activity/object-model)
* [Context](/ja/vantage/documentation/skill-designer/process/custom-activity/context)
* [HttpRequest](/ja/vantage/documentation/skill-designer/process/custom-activity/http-request)
* [MultipartFormDataRequest](/ja/vantage/documentation/skill-designer/process/custom-activity/multi-part-form-data-request)
* [ExportFormat](/ja/vantage/documentation/skill-designer/process/custom-activity/export-format)
