跳轉到主要內容

檢查欄位是否存在

例如,讓我們檢查是否已找到並填入 MyField 欄位:
var field = Context.GetField("MyField");

if (!field) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = '找不到 MyField 欄位';
} else if (!field.Value) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'MyField 欄位為空';
}

比較浮點數

直接比較浮點數可能會導致非預期的結果。我們建議使用內建的 Math 物件所提供的方法來正確比較數值,尤其是金額。
// 比較兩個浮點數
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 = '值不相同';
}

// 比較兩個金額值
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 = '值不相同';
}

根據另一個欄位要求非空值

一個選填欄位可能會在另一個欄位的值需要時變成必填。例如,如果婚姻狀況為「已婚」,則必須填寫配偶姓名。或者,如果依出生日期計算的年齡顯示此人未成年,則需要監護人的簽名。 此 Script 規則會驗證:在婚姻狀況欄位值為「Married」的文件中,是否同時填寫了配偶的名字與姓氏:
function checkFieldValuePresence(field) {
    if (!field.Value) {
        Context.ErrorMessage = 'Value of ' + field.Name + ' 欄位不得為空';
        return false;
    }
    return true;
}

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

if (conditionField === null) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = '找不到 MaritalStatus 欄位';
} 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 = '找不到配偶姓名欄位';
        } else if (!checkFieldValuePresence(lastName) || !checkFieldValuePresence(firstName)) {
            Context.CheckSucceeded = false;
        }
    }
} else { // 婚姻狀況未填寫,檢查失敗
    Context.CheckSucceeded = false;
}

檢查欄位是否已在文件上找到

規則可用來填入欄位值,即使該值實際上並未印在文件上。例如,如果適用多種稅種,可以自動計算總稅額。然而,一些國家要求在文件上列印稅額總計。 此指令碼規則會檢查:對於來自德國的收據,總稅額不僅要經計算得出,還必須實際出現在影像中。對於其他國家,則不需額外檢查,因為總稅額欄位已啟用 必要欄位 標記:
function checkFieldRegion(field) {
    if (!field || !field.HasRegion) {
        Context.ErrorMessage = '(' + field.Name + ') 欄位不存在於文件影像中';
        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)來完成。但如果在某些國家,其中一項稅額可能為負值,就只能透過指令碼規則同時處理這兩種情況。根據文件的來源國家/地區,系統可能會將所有稅額相加,或是將退稅額視為負值後一併加總。 以下範例指令碼會檢查兩項稅額的總和是否等於稅額總計;若收據來自西班牙,則會檢查這兩項稅額的總和或差額是否等於稅額總計:
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));
    }
}

將表格欄的總和與表格外的值進行比較

指令碼不只能處理一般欄位,也可以引用位於表格內的值。為了加快規則檢查,建議先將表格儲存為變數,之後改為引用這些變數,而不是直接使用原始表格。如果變數包含整個表格,您可以使用 Instances 屬性來存取表格的列,然後使用 Field GetChild 方法取得該列中特定儲存格的值。 以下範例指令碼會將「Total Price」欄中的所有值加總,並將結果與「Total」欄位的值進行比較:
var totalField = Context.GetField("Total");
var tableField = Context.GetField("MyTable");

if (!totalField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "找不到 Total 欄位";
    return;
}

if (!tableField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "找不到 MyTable 欄位";
    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 = "表格中 Total Price 的總和與 Total 不符";
}

將欄中儲存格的個別值與表格外的值進行比較,並顯示包含錯誤的列號

也可以使用 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 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 = "數量 * 單價不等於總價";
}