跳转到主要内容

通过 OAuth 授权并将导出数据发送到外部服务

以下脚本使用通过资源所有者密码模式获取的令牌进行身份验证,然后将导出数据发送到外部服务:
// 此示例自定义导出脚本展示了如何为 OAuth 2.0 资源所有者密码流发送授权请求、接收令牌,
// 然后以 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
// 并使用提取的数据字段值设置文件名。

// 获取文档导出结果
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添加新值:
// 此示例自定义活动脚本展示了如何修改现有字段 
// 并基于外部调用的结果创建新的字段值。

// 从文档中获取所有导出结果
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文档字段的值
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文档字段值
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);
}

从所有表列中检索数据

以下脚本会将所有表列的所有值(各行)写入处理事务事件日志:
// 获取事务(Transaction)中的第一个Document
var document = Context.Transaction.Documents[0];

// 获取表格对象
var table = document.GetField("Line Items");

// 将所有表格数据写入事务(Transaction)事件日志
for (var i = 0; i < table.Instances.length; i++) {
    for (var j = 0; j < table.Instances[i].Children.length; j++) {
        Context.LogMessage("表格行 "+i+"。列 "+table.Instances[i].Children[j].Name+": "+table.Instances[i].Children[j].Value);
    }
}

向表格添加行

以下脚本会添加新的表格行,并为 DescriptionQuantity 列设置值:
// 获取事务中的第一个文档
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;

// 创建函数以添加一个表格行并为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;
}

// 添加三行并设置值
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];

// 获取表格对象
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];

// 获取重复字段对象
var rField = document.GetField("First Name");

// 检查此字段是否为重复字段
if (rField.IsRepeatable) {
    // 删除此字段的最后一个实例
    if (rField.Instances.length >= 1) {
        rField.Instances[rField.Instances.length-1].Remove();
    }  
}
else {
    Context.LogMessage(rField.Name + " 不是重复字段。");
}

生成 JSON 文件并发送到第三方系统

以下脚本以自定义格式生成 JSON 文件,并将其发送到第三方系统:
// 此示例自定义导出脚本展示如何创建 JSON 字符串
// 使用提取的 Invoice US 字段值并将其发送到外部端点。
// 获取事务中的第一个文档。
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 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;
});