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

field が存在することを確認する

例えば、MyField field が検出され、値が設定されていることを確認してみましょう。
var field = Context.GetField("MyField");

if (!field) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'MyField fieldが見つかりません';
} else if (!field.Value) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'MyField fieldが空です';
}

浮動小数点数を比較する

浮動小数点を含む数値を直接比較すると、予期しない結果になることがあります。数値、特に金額を正確に比較するには、組み込みのMathオブジェクトのメソッドを使用することをおすすめします。
// 2つの浮動小数点数を比較
var floatField1 = Context.GetField("Number Field 1");
var floatField2 = Context.GetField("Number Field 2");
var floatVal1 = floatField1.Value;
var floatVal2 = floatField2.Value;

if (Math.round(floatVal1) === Math.round(floatVal2)) {
    return;
} else {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = '値が異なります';
}

// 2つの金額値を比較
var moneyField1 = Context.GetField("Money Field 1");
var moneyField2 = Context.GetField("Money Field 2");
var value1 = moneyField1.Value.Amount;
var value2 = moneyField2.Value.Amount;

if (Math.abs(value1 - value2) <= 0.0001) {
    return;
} else {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = '値が異なります';
}

別のfieldに応じて、空でない値を必須にする

任意のfieldは、別のfieldの値によって必須になる場合があります。たとえば、婚姻状況が「既婚」の場合は配偶者の氏名を記入する必要があります。また、生年月日から算出した年齢が未成年である場合は、保護者の署名が必要です。 このスクリプトルールは、婚姻状況fieldが「Married」の値を持つdocumentsで、配偶者の名と姓が両方とも入力されていることを検証します:
function checkFieldValuePresence(field) {
    if (!field.Value) {
        Context.ErrorMessage = field.Name + ' fieldの値を入力してください';
        return false;
    }
    return true;
}

var conditionField = Context.GetField("MaritalStatus");

if (conditionField === null) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = 'MaritalStatus fieldが見つかりません';
} else if (checkFieldValuePresence(conditionField)) {
    var lastName = Context.GetField("SpouseLastName");
    var firstName = Context.GetField("SpouseFirstName");
    if (conditionField.Text === "Married") {
        if (lastName === null || firstName === null) {
            Context.CheckSucceeded = false;
            Context.ErrorMessage = '配偶者名fieldが見つかりません';
        } else if (!checkFieldValuePresence(lastName) || !checkFieldValuePresence(firstName)) {
            Context.CheckSucceeded = false;
        }
    }
} else { // 婚姻状況が入力されていない場合、チェック失敗
    Context.CheckSucceeded = false;
}

field がドキュメント上で特定されていることを確認する

ルールは、値が実際にドキュメントに印字されていない場合でも、field の値を補完するために使用できます。たとえば、複数の税が適用される場合、合計税額は自動的に計算できます。ただし、国によっては、合計税額をドキュメントに印字することが求められます。 このスクリプト ルールは、ドイツのレシートについて、合計税が単に計算されるだけでなく、画像上に実在することを確認します。他の国では、合計税の field に対して Required field フラグが有効になっているため、追加のチェックは不要です:
function checkFieldRegion(field) {
    if (!field || !field.HasRegion) {
        Context.ErrorMessage = '(' + field.Name + ') fieldが文書画像上に存在しません';
        return false;
    }
    return true;
}

var conditionField = Context.GetField("CountryOfOrigin");

if (!conditionField.Value) {
    Context.ErrorMessage = '原産国が不明のため、税金をチェックできません';
    Context.CheckSucceeded = false;
} else {
    var totalTaxField = Context.GetField("TotalTax");
    if (conditionField.Text === "DE" && !checkFieldRegion(totalTaxField)) {
        Context.CheckSucceeded = false;
    }
}

特定のケースでデータを検証する

合計税額がすべての税の合計に等しいことは、あらかじめ定義されたルール(Check Sum)で確認できます。ただし、国によっては一部の税が負の値を取り得るため、両方のケースを考慮できるのはスクリプトルールのみです。Document の原産国に応じて、すべての税を合算するか、または返還税の負値を差し引く処理を行います。 このサンプルスクリプトは、2つの税の合計が合計税額に等しいことを検証します。例外として、レシートがスペイン発行の場合は、2つの税の合計または差が合計税額に等しければ有効とみなします。
var conditionField = Context.GetField("CountryOfOrigin");
var totalTaxField = Context.GetField("TotalTax");
var tax1Field = Context.GetField("Tax1");
var tax2Field = Context.GetField("Tax2");

if (!conditionField.Value || !totalTaxField.Value || !tax1Field.Value || !tax2Field.Value) {
    Context.ErrorMessage = '税額を確認できません';
    Context.CheckSucceeded = false;
} else {
    if (conditionField.Text === "ES") {
        Context.CheckSucceeded = ((Math.round(tax1Field.Value - tax2Field.Value) === Math.round(totalTaxField.Value))
            || (Math.round(tax1Field.Value + tax2Field.Value) === Math.round(totalTaxField.Value)));
    } else {
        Context.CheckSucceeded = (Math.round(tax1Field.Value + tax2Field.Value) === Math.round(totalTaxField.Value));
    }
}

テーブル列の合計をテーブル外の値と比較する

スクリプトは、通常の field だけでなく、テーブル内の値も参照できます。ルールチェックを高速化するため、テーブルを変数に保存し、元のテーブルではなくその変数を参照することを推奨します。変数にテーブル全体が含まれている場合は、Instances プロパティでテーブルの行にアクセスし、Field GetChild メソッドで行内の特定のセルの値を取得できます。 以下のサンプルスクリプトでは、Total Price 列のすべての値を合計し、その結果を Total field の値と比較します。
var totalField = Context.GetField("Total");
var tableField = Context.GetField("MyTable");

if (!totalField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "合計金額fieldが見つかりません";
    return;
}

if (!tableField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "MyTable fieldが見つかりません";
    return;
}

var sum = 0;

for (var i = 0; i < tableField.Instances.length; i++) {
    var tableTotalField = tableField.Instances[i].GetChild("MyTable/Total Price");
    sum += tableTotalField.Value.Amount;
}

if (Math.abs(sum - totalField.Value.Amount) > 0.02) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "テーブル内の合計価格の合計が合計金額と一致しません";
}

テーブル外の値と列セル内の個別の値を比較し、エラーのある行番号を表示する

テーブル列の参照は、Field GetFields メソッドでも実行できます。このメソッドでテーブル内のすべてのセルのリストを取得でき、ループ処理の設定に役立ちます。 以下のサンプルスクリプトでは、各明細行の税率を全体の税率と比較します。値が一致しない場合でもスクリプトは中断されません。不一致が発生した行番号が専用の変数に渡され、ルールで列全体を検証できます。サンプルスクリプトのエラーメッセージには、エラーのあるすべての行番号が一覧表示されます。
var taxRateFields = Context.GetFields("MyTable/TaxRate");
var taxRateField = Context.GetField("TaxRate");

if (!taxRateFields || !taxRateField)
    return;

var taxRate = taxRateField.Value ? taxRateField.Value : 0;
var wrongLines = [];
for (var i = 0; i < taxRateFields.length; i++) {
    if (taxRateFields[i].Value != taxRate)
        wrongLines.push(i + 1);
}

if (wrongLines.length > 0) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "以下の行で税率が正しくありません: " + wrongLines.join(", ");
}

同じ行内の複数のfieldの積を、同じ行内の別のfieldの値と比較する

テーブルの異なる列に対して、ループを使わずに順次(行単位で)さまざまな処理を実行できます。これを行うには、Field GetField メソッドで各列を参照します。これは繰り返しルールとなり、テーブルの各行に対して自動的に適用されます。なお、この方法で参照する列はすべて同一テーブル内のものに限ります。 以下のサンプルスクリプトでは、各行で数量に単価を掛け、その結果を明細行の合計金額と比較します。
var quantityField = Context.GetField("MyTable/Quantity");
var unitPriceField = Context.GetField("MyTable/Unit Price");
var totalField = Context.GetField("MyTable/Total Price");

if (!quantityField || !unitPriceField || !totalField)
    return;

var quantity = quantityField.Value ? quantityField.Value : 0;
var unitPrice = unitPriceField.Value?.Amount ? unitPriceField.Value.Amount : 0;
var total = totalField.Value?.Amount ? totalField.Value.Amount : 0;

var result = quantity * unitPrice;

if (Math.abs(result - total) > 0.01) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "数量 × 単価が合計金額と等しくありません";
}