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

# Exemples de scripts

> Exemples JavaScript pour des scénarios courants d’activité personnalisée — OAuth, exports externes, modification de champs, manipulation de tables, génération de JSON et récupération des noms de fichiers source.

Les exemples JavaScript suivants illustrent des cas courants pour les scripts d’activité personnalisée — autorisation OAuth, envoi d’exports vers des services externes, modification des champs extraits, manipulation de tables, génération de JSON personnalisé et récupération des noms de fichiers source. Copiez-les et adaptez-les à vos propres noms de champs et points de terminaison.

<div id="authorize-via-oauth-and-send-export-data-to-an-external-service">
  ## S’authentifier via OAuth et envoyer les données d’export à un service externe
</div>

Le script suivant effectue l’authentification à l’aide d’un jeton obtenu via le flux Resource Owner Password, puis envoie les données d’export à un service externe :

```javascript theme={null}
// Cet exemple de script d'exportation personnalisé montre comment envoyer une requête d'autorisation pour OAuth 2.0 Resource Owner Password Flow, recevoir le jeton,
// et ensuite envoyer les résultats d'exportation au système externe au format JSON

// Préparer le corps clé-valeur pour la requête d'autorisation (les paramètres et leurs valeurs peuvent être différents). La variable d'environnement correspondante doit être créée au préalable.
var authDataContent = {};
authDataContent.grant_type = Context.GetSecret("password_secretName");
authDataContent.scope = "openid permissions";

// Transmettre les données sensibles en utilisant des variables d'environnement. Les variables correspondantes doivent être créées au préalable.
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");

// créer la requête et envoyer les données
var request = Context.CreateHttpRequest();
request.Url = "https://my_auth_service.com/auth2/connect/token"
request.Method = "POST";

// créer les données de contenu pour la requête d'autorisation
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// obtenir toutes les exportations du document
var exports = Context.Transaction.Documents[0].Exports;

// sélectionner le résultat d'exportation JSON
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Créer les données de contenu pour la requête
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";

// ajouter les données extraites au résultat d'exportation
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// ajouter le PDF exporté
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// envoyer une requête au service
multiPartRequest.Send();

// Obtenir un résultat de réponse désérialisé
var responseObject = JSON.parse(multiPartRequest.ResponseText);
```

<div id="send-export-data-to-an-external-service">
  ## Envoyer des données d’export vers un service externe
</div>

Le script suivant attribue au fichier exporté un nom basé sur le numéro de facture, puis envoie les données d’export vers un service externe (Dropbox, dans ce cas) :

```javascript theme={null}
// Cet exemple de script d'export personnalisé montre comment envoyer un fichier vers Dropbox
// et définir le nom du fichier à partir de la valeur d'un champ de données extrait.

// Récupérer le résultat d'export du document
var exports = Context.Transaction.Documents[0].Exports;
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Récupérer le jeton d'accès à l'API DropBox (https://developers.dropbox.com/en-us/oauth-guide). La variable d'environnement correspondante doit être créée au préalable.
var token = Context.GetSecret("access_token_secretName");

// Récupérer le « Numéro de facture » depuis les données extraites
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// Créer le nom du fichier de résultat
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// Envoyer le fichier JSON contenant les données extraites vers 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">
  ## Modifier les données extraites
</div>

Le script suivant modifie la valeur d’un champ existant et ajoute de nouvelles valeurs à un champ répétable à l’aide d’informations contenues dans une réponse d’un service externe :

```javascript theme={null}
// Cet exemple de script d'activité personnalisée montre comment modifier un champ existant
// et créer une nouvelle valeur de champ à partir des résultats d'un appel externe.

// Récupérer tous les exports du document
var exports = Context.Transaction.Documents[0].Exports;

// Récupérer le résultat d'export JSON parmi les exports
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Récupérer le résultat d'export PDF parmi les exports
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Créer une requête HTTP et spécifier les propriétés requises
var multipartFormDataRequest = Context.CreateMultipartFormDataRequest();
multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"
multipartFormDataRequest.Method = "POST";

// Ajouter les données extraites du résultat d'export JSON à la requête
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// Ajouter le PDF des résultats d'export à la requête
multipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");

// Définir le délai d'expiration de la requête HTTP (en minutes).
// Par défaut, le délai d'expiration est fixé à 1 minute.
multipartFormDataRequest.Timeout = 1;

// Envoyer une requête au service
multipartFormDataRequest.Send();

// Récupérer le résultat de la réponse
var newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);

// En supposant que le JSON suivant a été obtenu dans le résultat de la réponse :
/* {
    "DocumentData": {
        "Fields": {
            "InvoiceNumber": "706-222-3151",
            "InvoiceDate": "15.05.2020",
            "PurchaseOrder": [
                {
                    "OrderNumber": "25646788",
                    "Total": "540.54"
                },
                {
                    "OrderNumber": "24516684",
                    "Total": "138.43"
                }
            ]
        }
    }
}*/

// Modifier la valeur d'un champ de document Vantage existant à partir des données reçues d'un appel externe
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;

// Ajouter de nouvelles valeurs de champ de document Vantage à partir des données reçues d'un appel externe
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">
  ## Récupérer des données depuis une colonne spécifique d’un tableau
</div>

Le script suivant consigne toutes les valeurs (lignes) de la colonne de tableau **Description** dans le journal des événements de la transaction :

```javascript theme={null}
// Récupérer le premier document dans une transaction
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// Récupérer l'objet tableau
var table = document.GetField("Line Items");

for (var i = 0; i < table.Instances.length; i++) {
  // Récupérer l'objet de la colonne 'Description' pour chaque ligne du tableau et écrire ses valeurs dans le journal des événements de la transaction
  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">
  ## Récupérer les données de toutes les colonnes du tableau
</div>

Le script suivant consigne dans le journal des événements de la transaction toutes les valeurs (lignes) de toutes les colonnes du tableau :

```javascript theme={null}
// Récupérer le premier document d'une transaction
var document = Context.Transaction.Documents[0];

// Récupérer l'objet tableau
var table = document.GetField("Line Items");

// Écrire toutes les données du tableau dans le journal d'événements de la transaction
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">
  ## Ajouter des lignes dans un tableau
</div>

Le script suivant ajoute de nouvelles lignes dans le tableau et définit les valeurs des colonnes **Description** et **Quantité** :

```javascript theme={null}
// Récupérer le premier document dans une transaction
var document = Context.Transaction.Documents[0];

// Récupérer l'objet tableau
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;

// Créer une fonction pour ajouter une ligne au tableau et définir les valeurs des colonnes Description et 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;
}

// Ajouter trois lignes et définir les valeurs
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">
  ## Supprimer les lignes d'un tableau
</div>

Le script suivant supprime toutes les lignes d'un tableau :

```javascript theme={null}
// Obtenir le premier document dans une transaction
var document = Context.Transaction.Documents[0];

// Obtenir l'objet tableau
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// Supprimer toutes les lignes par leurs indices
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// Ou supprimer l'intégralité du tableau
table.Remove();
```

<div id="delete-a-specific-instance-of-a-repeating-field">
  ## Supprimer une occurrence précise d’un champ répétable
</div>

Le script suivant supprime la dernière occurrence d’un champ répétable :

```javascript theme={null}
// Récupérer le premier document d'une transaction
var document = Context.Transaction.Documents[0];

// Récupérer l'objet champ répétable
var rField = document.GetField("First Name");

// Vérifier si ce champ est répétable
if (rField.IsRepeatable) {
    // Supprimer la dernière instance de ce champ
    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">
  ## Générer un fichier JSON et l’envoyer à un système tiers
</div>

Le script suivant génère un fichier JSON dans un format personnalisé et l’envoie à un système tiers :

```javascript theme={null}
// Cet exemple de script d'exportation personnalisé montre comment créer une chaîne JSON
// en utilisant les valeurs des champs extraits de facture US et l'envoyer à un point de terminaison externe.
// Récupérer le premier document de la transaction.
var document = Context.Transaction.Documents[0];

// Créer un objet JSON et définir ses paires clé/valeur.
var extractedValues = {};
extractedValues.Total = document.GetField("Total").Value;
extractedValues.Currency = document.GetField("Currency").Value;
extractedValues.Date = document.GetField("Invoice Date").Value;

// Récupérer les valeurs des champs répétitifs et les définir comme valeurs de tableau 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);
}

// Le fichier JSON reçu est au format suivant :
/* {
   "Total": 1819.14,
   "Currency": "USD",
   "Date": "2019-05-23T00:00:00.000Z",
   "PurchaseOrderNumber": [
      "012345678",
      "4500123466"
   ]
}*/

// Envoyer une requête multipart/form-data avec le JSON créé précédemment comme contenu de chaîne de cette requête.
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">
  ## Récupérer les noms des fichiers d’origine
</div>

Le script suivant insère le nom d’origine d’un fichier dans le champ **MyField** :

```javascript theme={null}
// Récupérer le nom du fichier source et le définir comme valeur du champ spécifié ("MyField")
Context.Transaction.Documents.forEach( doc => {
    // Pour Scanning Station, le nom du fichier source est stocké dans un paramètre d'enregistrement
    var param = doc.RegistrationParameters["SourceFileName"]; 
    doc.GetField("MyField").Value = param != null ?
        param.Value : doc.SourceFiles[0].FileName;
});
```

<div id="related-topics">
  ## Rubriques connexes
</div>

* [activité personnalisée](/fr/vantage/documentation/skill-designer/process/custom-activity/custom-activity)
* [modèle objet](/fr/vantage/documentation/skill-designer/process/custom-activity/object-model)
* [Context](/fr/vantage/documentation/skill-designer/process/custom-activity/context)
* [HttpRequest](/fr/vantage/documentation/skill-designer/process/custom-activity/http-request)
* [MultipartFormDataRequest](/fr/vantage/documentation/skill-designer/process/custom-activity/multi-part-form-data-request)
* [ExportFormat](/fr/vantage/documentation/skill-designer/process/custom-activity/export-format)
