跳轉到主要內容

透過 OAuth 授權並將匯出資料傳送至外部服務

以下指令碼使用透過 Resource Owner Password Flow 取得的權杖進行驗證,然後將匯出資料傳送至外部服務:
// 此自訂匯出指令碼範例展示如何傳送 OAuth 2.0 Resource Owner Password Flow 的授權請求、接收權杖,
// 然後將匯出結果以 JSON 格式傳送至外部系統

// Prepare the key-value body for the authorization request (parameters and their values may be different). The corresponding environment variable should be created beforehand.
var authDataContent = {};
authDataContent.grant_type = Context.GetSecret("password_secretName");
authDataContent.scope = "openid permissions";

// Pass sensitive data using environment variables. The corresponding variables should be created beforehand.
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");

// create the request and send the data
var request = Context.CreateHttpRequest();
request.Url = "https://my_auth_service.com/auth2/connect/token"
request.Method = "POST";

// create content data for the authorization request
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// get all exports from the document
var exports = Context.Transaction.Documents[0].Exports;

// select the JSON export result
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Create content data for the request
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";

// add extracted data to the export result
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// add the exported PDF
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// send a request to the service
multiPartRequest.Send();

// Get a deserialised response result
var responseObject = JSON.parse(multiPartRequest.ResponseText);

將匯出資料傳送到外部服務

下列指令碼會使用發票號碼作為匯出檔案的檔名,然後將匯出資料傳送到外部服務(此處以 Dropbox 為例):
// This sample Custom export script shows how to send a file to Dropbox
// and set the file name using value of extracted data field.

// Get the document export result
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");

// Get "Invoice Number" from the extracted data
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// Create the result file name
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// Send the JSON file with the extracted data to 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();

修改擷取的資料

下列指令碼會修改既有欄位的值,並利用外部服務回應中的資訊,為重複欄位新增值:
// 此範例自訂活動腳本展示如何根據外部呼叫的結果修改現有欄位
// 並建立新的欄位值。

// Get all exports from the document
var exports = Context.Transaction.Documents[0].Exports;

// Get the JSON export result from the exports
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Get the PDF export result from the exports
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Create an HTTP request and specify required request properties
var multipartFormDataRequest = Context.CreateMultipartFormDataRequest();
multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"
multipartFormDataRequest.Method = "POST";

// Add extracted data from the JSON export result to the request
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// Add the PDF from the export results to the request
multipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");

// Set the timeout for the HTTP request to be completed (in minutes).
// By default, the timeout is set to 1 minute.
multipartFormDataRequest.Timeout = 1;

// Send a request to the service
multipartFormDataRequest.Send();

// Get a response result
var newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);

// Assuming such a JSON was obtained in the response result:
/* {
    "DocumentData": {
        "Fields": {
            "InvoiceNumber": "706-222-3151",
            "InvoiceDate": "15.05.2020",
            "PurchaseOrder": [
                {
                    "OrderNumber": "25646788",
                    "Total": "540.54"
                },
                {
                    "OrderNumber": "24516684",
                    "Total": "138.43"
                }
            ]
        }
    }
}*/

// Change the value of an existing Vantage document field based on data received from an external call
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;

// Add new Vantage document field values based on data received from an external call
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 表格欄位的所有值(各資料列)寫入處理作業事件記錄:
// Get the first document in a transaction
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// Get the table object
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);
}

從所有表格欄位擷取資料

下列指令碼會將所有表格欄位中所有列的值寫入處理作業事件日誌:
// Get the first document in a transaction
var document = Context.Transaction.Documents[0];

// Get the table object
var table = document.GetField("Line Items");

// Write all table data to the transaction event log
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);
    }
}

向表格新增列

以下指令碼會新增表格列,並為 DescriptionQuantity 欄位設定值:
// Get the first document in a transaction
var document = Context.Transaction.Documents[0];

// Get the table object
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;

// 建立函式以新增一個表格列,並設定 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;
}

// Add three rows and set values
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++);

從表格中刪除資料列

以下指令碼會刪除該表格中的所有資料列:
// 取得交易中的第一個文件
var document = Context.Transaction.Documents[0];

// Get the table object
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// Delete all rows by their indexes
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// Or you can delete the entire table
table.Remove();

刪除重複欄位的特定實例

以下指令碼會刪除重複欄位中最後一個實例:
// 取得處理作業中的第一個文件
var document = Context.Transaction.Documents[0];

// Get the repeating field object
var rField = document.GetField("First Name");

// Check if this field is repeating
if (rField.IsRepeatable) {
    // Delete the last instance of this field
    if (rField.Instances.length >= 1) {
        rField.Instances[rField.Instances.length-1].Remove();
    }  
}
else {
    Context.LogMessage(rField.Name + " is not repeating.");
}

產生 JSON 檔並傳送至第三方系統

以下指令碼將以自訂格式產生 JSON 檔,並將其傳送至第三方系統:
// 此範例自訂匯出指令碼示範如何建立 JSON 字串
// 使用擷取的美國發票欄位值並將其傳送至外部端點。
// 取得處理作業中的第一個文件。
var document = Context.Transaction.Documents[0];

// 建立 JSON 物件並設定其鍵/值組。
var extractedValues = {};
extractedValues.Total = document.GetField("Total").Value;
extractedValues.Currency = document.GetField("Currency").Value;
extractedValues.Date = document.GetField("Invoice Date").Value;

// 取得重複欄位值並將其設定為陣列 JSON 值。
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);
}

// 接收的 JSON 檔案格式如下:
/* {
   "Total": 1819.14,
   "Currency": "USD",
   "Date": "2019-05-23T00:00:00.000Z",
   "PurchaseOrderNumber": [
      "012345678",
      "4500123466"
   ]
}*/

// 傳送 multipart/form-data 請求,並將先前建立的 JSON 作為該請求的字串內容。
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 欄位:
// 取得來源檔案名稱並將其設為指定欄位 ("MyField") 的值
Context.Transaction.Documents.forEach( doc => {
    // 對於 Scanning Station,來源檔案名稱會放入註冊 Parameter 中
    var param = doc.RegistrationParameters["SourceFileName"]; 
    doc.GetField("MyField").Value = param != null ?
        param.Value : doc.SourceFiles[0].FileName;
});