Ejemplos de JavaScript para escenarios habituales de la actividad personalizada: OAuth, exportaciones externas, modificación de campos, manipulación de tablas y generación de JSON.
Use this file to discover all available pages before exploring further.
Los siguientes ejemplos de JavaScript ilustran patrones habituales para scripts de la actividad personalizada: autorización OAuth, envío de exportaciones a servicios externos, modificación de campos extraídos, manipulación de tablas, generación de JSON personalizado y obtención de nombres de archivos de origen. Cópielos y adáptelos a sus propios nombres de campo y endpoints.
Autorizar mediante OAuth y enviar datos de exportación a un servicio externo
El siguiente script realiza la autenticación con un token obtenido mediante el flujo Resource Owner Password y luego envía los datos de exportación a un servicio externo:
// Este script de exportación personalizada de ejemplo muestra cómo enviar una solicitud de autorización para OAuth 2.0 Resource Owner Password Flow, recibir el token,// y luego enviar los resultados de exportación al sistema externo en formato JSON// Preparar el cuerpo clave-valor para la solicitud de autorización (los parámetros y sus valores pueden ser diferentes). La variable de entorno correspondiente debe crearse previamente.var authDataContent = {};authDataContent.grant_type = Context.GetSecret("password_secretName");authDataContent.scope = "openid permissions";// Pasar datos sensibles usando variables de entorno. Las variables correspondientes deben crearse previamente.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");// crear la solicitud y enviar los datosvar request = Context.CreateHttpRequest();request.Url = "https://my_auth_service.com/auth2/connect/token"request.Method = "POST";// crear datos de contenido para la solicitud de autorizaciónrequest.SetUrlFormEncodedContent(authDataContent);request.Send();var authResponseObject = JSON.parse(request.ResponseText);// obtener todas las exportaciones del documentovar exports = Context.Transaction.Documents[0].Exports;// seleccionar el resultado de exportación JSONvar extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);// Crear datos de contenido para la solicitudvar 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";// agregar datos extraídos al resultado de exportaciónmultiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");// agregar el PDF exportadomultiPartRequest.AppendFileContent(pdfExportResult, "binaryData");// enviar una solicitud al serviciomultiPartRequest.Send();// Obtener un resultado de respuesta deserializadovar responseObject = JSON.parse(multiPartRequest.ResponseText);
El siguiente script asigna al archivo exportado un nombre basado en el número de factura y, a continuación, envía los datos de exportación a un servicio externo (Dropbox, en este caso):
// Este script de exportación personalizado muestra cómo enviar un archivo a Dropbox// y establecer el nombre del archivo usando el valor de un campo de datos extraídos.// Obtener el resultado de exportación del documentovar exports = Context.Transaction.Documents[0].Exports;var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);// Obtener el token de acceso a la API de DropBox (https://developers.dropbox.com/en-us/oauth-guide). La variable de entorno correspondiente debe crearse de antemano.var token = Context.GetSecret("access_token_secretName");// Obtener el "Número de factura" de los datos extraídosvar invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");var invoiceNumber = invoiceNumberField.Value;// Crear el nombre del archivo resultantevar jsonFileName = `ExtractedData_${invoiceNumber}.json`;// Enviar el archivo JSON con los datos extraídos a DropBoxvar 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();
El siguiente script modifica el valor de un campo existente y añade nuevos valores a un campo repetible usando la información contenida en la respuesta de un servicio externo:
// Este script de actividad personalizada de ejemplo muestra cómo modificar un campo existente // y crear un nuevo valor de campo a partir de los resultados de una llamada externa.// Obtener todas las exportaciones del documentovar exports = Context.Transaction.Documents[0].Exports;// Obtener el resultado de exportación JSON de las exportacionesvar extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);// Obtener el resultado de exportación PDF de las exportacionesvar pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);// Crear una solicitud HTTP y especificar las propiedades necesarias de la solicitudvar multipartFormDataRequest = Context.CreateMultipartFormDataRequest();multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"multipartFormDataRequest.Method = "POST";// Agregar los datos extraídos del resultado de exportación JSON a la solicitudmultipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");// Agregar el PDF de los resultados de exportación a la solicitudmultipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");// Establecer el tiempo de espera para completar la solicitud HTTP (en minutos).// De forma predeterminada, el tiempo de espera está configurado en 1 minuto.multipartFormDataRequest.Timeout = 1;// Enviar una solicitud al serviciomultipartFormDataRequest.Send();// Obtener el resultado de la respuestavar newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);// Suponiendo que se obtuvo el siguiente JSON en el resultado de la respuesta:/* { "DocumentData": { "Fields": { "InvoiceNumber": "706-222-3151", "InvoiceDate": "15.05.2020", "PurchaseOrder": [ { "OrderNumber": "25646788", "Total": "540.54" }, { "OrderNumber": "24516684", "Total": "138.43" } ] } }}*/// Cambiar el valor de un campo de documento de Vantage existente a partir de los datos recibidos de una llamada externavar 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;// Agregar nuevos valores de campo de documento de Vantage a partir de los datos recibidos de una llamada externavar 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;});
Obtener datos de una columna específica de la tabla
El siguiente script escribe en el registro de eventos de la transacción todos los valores (filas) de la columna Description de la tabla:
// Obtener el primer documento de una transacciónvar document = Context.Transaction.Documents[0];var descriptionFieldId = document.GetField("Line Items/Description").Id;// Obtener el objeto de tablavar table = document.GetField("Line Items");for (var i = 0; i < table.Instances.length; i++) { // Obtener el objeto de columna 'Description' para cada fila de la tabla y escribir sus valores en el registro de eventos de la transacción var columnDescription = table.Instances[i].Children.find(x => x.Id === descriptionFieldId); Context.LogMessage("Description. Row " + i + ": " + columnDescription.Value);}
El siguiente script escribe todos los valores (filas) de todas las columnas de la tabla en el registro de eventos de la transacción:
// Obtener el primer documento de una transacciónvar document = Context.Transaction.Documents[0];// Obtener el objeto de tablavar table = document.GetField("Line Items");// Escribir todos los datos de la tabla en el registro de eventos de la transacciónfor (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); }}
El siguiente script añade nuevas filas a la tabla y establece valores en las columnas Descripción y Cantidad:
// Obtener el primer documento en una transacciónvar document = Context.Transaction.Documents[0];// Obtener el objeto de tablavar 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;// Crear función para agregar una fila a la tabla y establecer valores para las columnas Description y Quantityfunction 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;}// Agregar tres filas y establecer valoresaddRow("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++);
El siguiente script elimina todas las filas de una tabla:
// Obtener el primer documento en una transacciónvar document = Context.Transaction.Documents[0];// Obtener el objeto de tablavar table = document.GetField("Line Items");var indexCount = table.Instances.length - 1;// Eliminar todas las filas por sus índicesfor (var i = indexCount; i >= 0 ; i--) { table.Instances[i].Remove();}// O puede eliminar la tabla completatable.Remove();
Eliminar una instancia concreta de un campo repetible
El siguiente script elimina la última instancia de un campo repetible:
// Obtener el primer documento de una transacciónvar document = Context.Transaction.Documents[0];// Obtener el objeto de campo repetiblevar rField = document.GetField("First Name");// Comprobar si este campo es repetibleif (rField.IsRepeatable) { // Eliminar la última instancia de este campo if (rField.Instances.length >= 1) { rField.Instances[rField.Instances.length-1].Remove(); } }else { Context.LogMessage(rField.Name + " is not repeating.");}
Generar un archivo JSON y enviarlo a un sistema de terceros
El siguiente script genera un archivo JSON con un formato personalizado y lo envía a un sistema de terceros:
// Este script de exportación personalizada de ejemplo muestra cómo crear una cadena JSON// usando valores de campos extraídos de Invoice US y enviarla a un endpoint externo.// Obtener el primer documento en la transacción.var document = Context.Transaction.Documents[0];// Crear un objeto JSON y establecer sus pares clave/valor.var extractedValues = {};extractedValues.Total = document.GetField("Total").Value;extractedValues.Currency = document.GetField("Currency").Value;extractedValues.Date = document.GetField("Invoice Date").Value;// Obtener valores de campos repetidos y establecerlos como valores de array 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);}// El archivo JSON recibido tiene el siguiente formato:/* { "Total": 1819.14, "Currency": "USD", "Date": "2019-05-23T00:00:00.000Z", "PurchaseOrderNumber": [ "012345678", "4500123466" ]}*/// Enviar una solicitud multipart/form-data con el JSON creado previamente como el contenido de cadena de esa solicitud.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();
El siguiente script coloca el nombre original de un archivo en el campo MyField:
// Obtener el nombre del archivo de origen y establecerlo como el valor del campo especificado ("MyField")Context.Transaction.Documents.forEach( doc => { // Para Scanning Station, el nombre del archivo de origen se almacena en un parámetro de registro var param = doc.RegistrationParameters["SourceFileName"]; doc.GetField("MyField").Value = param != null ? param.Value : doc.SourceFiles[0].FileName;});