メインコンテンツへスキップ

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 の生成、ソースファイル名の取得です。コピーして、ご自身の field 名やエンドポイントに合わせて調整してください。

OAuth で認可し、エクスポート データを外部サービスに送信する

次のスクリプトは、Resource Owner Password フローで取得したトークンを用いて認証を行い、その後、エクスポート データを外部サービスに送信します。
// このサンプルカスタムエクスポートスクリプトは、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);

エクスポートデータを外部サービスに送信する

次のスクリプトでは、請求書番号を使ってエクスポートファイルに名前を付け、その後エクスポートデータを外部サービス (この場合は Dropbox) に送信します。
// このサンプルのカスタムエクスポートスクリプトは、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();

抽出データを変更する

次のスクリプトでは、外部サービスからのレスポンスに含まれる情報を使用して、既存のfieldの値を変更し、繰り返しfieldに新しい値を追加します。
// このサンプルのカスタムアクティビティスクリプトは、既存の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;
});

特定のテーブル列からデータを取得する

次のスクリプトは、Description テーブル列のすべての値 (各行の値) をトランザクションのイベントログに書き込みます。
// トランザクション内の最初のドキュメントを取得する
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);
}

すべてのテーブル列のデータを取得する

次のスクリプトは、すべてのテーブル列の値 (各行) をトランザクションイベントログに書き込みます。
// トランザクション内の最初のドキュメントを取得する
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);
    }
}

テーブルに行を追加する

次のスクリプトでは、テーブルに新しい行を追加し、Description 列と Quantity 列に値を設定します。
// トランザクション内の最初のドキュメントを取得する
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++);

テーブルから行を削除する

次のスクリプトは、テーブル内のすべての行を削除します。
// トランザクション内の最初の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();

繰り返し field の特定のインスタンスを削除する

次のスクリプトは、繰り返し field の最後のインスタンスを削除します。
// トランザクション内の最初のドキュメントを取得する
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.");
}

JSON ファイルを生成してサードパーティのシステムに送信する

次のスクリプトは、カスタム形式の JSON ファイルを生成し、サードパーティのシステムに送信します。
// このサンプルカスタムエクスポートスクリプトは、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();

元のファイル名を取得する

次のスクリプトは、ファイルの元の名前を MyField field に格納します。
// ソースファイルの名前を取得し、指定した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;
});

カスタム アクティビティ

スクリプト化されたロジックやサードパーティとの統合により Skill を拡張します。

オブジェクト モデル

カスタム アクティビティ スクリプト向けの完全な JavaScript オブジェクト リファレンス。

Context

トランザクション データ、HTTP リクエスト、シークレットにアクセスするためのグローバル オブジェクト。

HttpRequest

スクリプトから URL エンコード形式、テキスト、JSON、またはバイナリの HTTP リクエストを送信します。

MultipartFormDataRequest

カスタム アクティビティ スクリプトから multipart/form-data の HTTP リクエストを送信します。

ExportFormat

Custom または Output アクティビティからエクスポートするファイルで使用できる形式。