> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Scripts de ejemplo

> 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.

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.

<div id="authorize-via-oauth-and-send-export-data-to-an-external-service">
  ## Autorizar mediante OAuth y enviar datos de exportación a un servicio externo
</div>

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:

```javascript theme={null}
// 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 datos
var 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ón
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// obtener todas las exportaciones del documento
var exports = Context.Transaction.Documents[0].Exports;

// seleccionar el resultado de exportación JSON
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Crear datos de contenido para la solicitud
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";

// agregar datos extraídos al resultado de exportación
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// agregar el PDF exportado
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// enviar una solicitud al servicio
multiPartRequest.Send();

// Obtener un resultado de respuesta deserializado
var responseObject = JSON.parse(multiPartRequest.ResponseText);
```

<div id="send-export-data-to-an-external-service">
  ## Enviar datos de exportación a un servicio externo
</div>

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):

```javascript theme={null}
// 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 documento
var 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ídos
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// Crear el nombre del archivo resultante
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// Enviar el archivo JSON con los datos extraídos a 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();
```

<div id="modify-extracted-data">
  ## Modificar datos extraídos
</div>

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:

```javascript theme={null}
// 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 documento
var exports = Context.Transaction.Documents[0].Exports;

// Obtener el resultado de exportación JSON de las exportaciones
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Obtener el resultado de exportación PDF de las exportaciones
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Crear una solicitud HTTP y especificar las propiedades necesarias de la solicitud
var 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 solicitud
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// Agregar el PDF de los resultados de exportación a la solicitud
multipartFormDataRequest.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 servicio
multipartFormDataRequest.Send();

// Obtener el resultado de la respuesta
var 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 externa
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;

// Agregar nuevos valores de campo de documento de Vantage a partir de los datos recibidos de una llamada externa
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;
});
```

<div id="retrieve-data-from-a-specific-table-column">
  ## Obtener datos de una columna específica de la tabla
</div>

El siguiente script escribe en el registro de eventos de la transacción todos los valores (filas) de la columna **Description** de la tabla:

```javascript theme={null}
// Obtener el primer documento de una transacción
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// Obtener el objeto de tabla
var 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);
}
```

<div id="retrieve-data-from-all-table-columns">
  ## Obtener datos de todas las columnas de la tabla
</div>

El siguiente script escribe todos los valores (filas) de todas las columnas de la tabla en el registro de eventos de la transacción:

```javascript theme={null}
// Obtener el primer documento de una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de tabla
var table = document.GetField("Line Items");

// Escribir todos los datos de la tabla en el registro de eventos de la transacción
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);
    }
}
```

<div id="add-rows-to-a-table">
  ## Añadir filas a una tabla
</div>

El siguiente script añade nuevas filas a la tabla y establece valores en las columnas **Descripción** y **Cantidad**:

```javascript theme={null}
// Obtener el primer documento en una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de tabla
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;

// Crear función para agregar una fila a la tabla y establecer valores para las columnas Description y 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;
}

// Agregar tres filas y establecer valores
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++);
```

<div id="delete-rows-from-a-table">
  ## Eliminar filas de una tabla
</div>

El siguiente script elimina todas las filas de una tabla:

```javascript theme={null}
// Obtener el primer documento en una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de tabla
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// Eliminar todas las filas por sus índices
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// O puede eliminar la tabla completa
table.Remove();
```

<div id="delete-a-specific-instance-of-a-repeating-field">
  ## Eliminar una instancia concreta de un campo repetible
</div>

El siguiente script elimina la última instancia de un campo repetible:

```javascript theme={null}
// Obtener el primer documento de una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de campo repetible
var rField = document.GetField("First Name");

// Comprobar si este campo es repetible
if (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.");
}
```

<div id="generate-a-json-file-and-send-it-to-a-third-party-system">
  ## Generar un archivo JSON y enviarlo a un sistema de terceros
</div>

El siguiente script genera un archivo JSON con un formato personalizado y lo envía a un sistema de terceros:

```javascript theme={null}
// 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();
```

<div id="retrieve-original-file-names">
  ## Recuperar los nombres originales de los archivos
</div>

El siguiente script coloca el nombre original de un archivo en el campo **MyField**:

```javascript theme={null}
// 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;
});
```

<div id="related-topics">
  ## Temas relacionados
</div>

* [Actividad personalizada](/es/vantage/documentation/skill-designer/process/custom-activity/custom-activity)
* [Modelo de objetos](/es/vantage/documentation/skill-designer/process/custom-activity/object-model)
* [Context](/es/vantage/documentation/skill-designer/process/custom-activity/context)
* [HttpRequest](/es/vantage/documentation/skill-designer/process/custom-activity/http-request)
* [MultipartFormDataRequest](/es/vantage/documentation/skill-designer/process/custom-activity/multi-part-form-data-request)
* [ExportFormat](/es/vantage/documentation/skill-designer/process/custom-activity/export-format)
