Zum Hauptinhalt springen

Über OAuth authentifizieren und Exportdaten an einen externen Dienst senden

Das folgende Skript authentifiziert sich mit einem Token, das über den Resource Owner Password Flow bezogen wurde, und sendet anschließend die Exportdaten an einen externen Dienst:
// Dieses Beispiel für ein benutzerdefiniertes Export-Skript zeigt, wie eine Autorisierungsanfrage für OAuth 2.0 Resource Owner Password Flow gesendet wird, das Token empfangen wird,
// und dann Exportergebnisse an das externe System im JSON-Format gesendet werden

// Bereiten Sie den Schlüssel-Wert-Body für die Autorisierungsanfrage vor (Parameter und ihre Werte können unterschiedlich sein). Die entsprechende Umgebungsvariable sollte vorher erstellt werden.
var authDataContent = {};
authDataContent.grant_type = Context.GetSecret("password_secretName");
authDataContent.scope = "openid permissions";

// Übertragen Sie sensible Daten über Umgebungsvariablen. Die entsprechenden Variablen sollten vorher erstellt werden.
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");

// Erstellen Sie die Anfrage und senden Sie die Daten
var request = Context.CreateHttpRequest();
request.Url = "https://my_auth_service.com/auth2/connect/token"
request.Method = "POST";

// Erstellen Sie Inhaltsdaten für die Autorisierungsanfrage
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// Alle Exporte aus dem Dokument abrufen
var exports = Context.Transaction.Documents[0].Exports;

// Das JSON-Exportergebnis auswählen
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Inhaltsdaten für die Anfrage erstellen
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";

// Extrahierte Daten zum Exportergebnis hinzufügen
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// Die exportierte PDF hinzufügen
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// Eine Anfrage an den Service senden
multiPartRequest.Send();

// Ein deserialisiertes Antwortergebnis abrufen
var responseObject = JSON.parse(multiPartRequest.ResponseText);

Exportdaten an einen externen Dienst senden

Das folgende Skript verwendet die Rechnungsnummer als Dateinamen und sendet anschließend die Exportdaten an einen externen Dienst (hier: Dropbox):
// Dieses Beispiel für ein benutzerdefiniertes Export-Skript zeigt, wie eine Datei an Dropbox gesendet
// und der Dateiname mit dem Wert eines extrahierten Datenfelds festgelegt wird.

// Das Dokumentexport-Ergebnis abrufen
var exports = Context.Transaction.Documents[0].Exports;
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Das Zugriffstoken für die DropBox API abrufen (https://developers.dropbox.com/en-us/oauth-guide). Die entsprechende Umgebungsvariable sollte vorher erstellt werden.
var token = Context.GetSecret("access_token_secretName");

// „Rechnungsnummer" aus den extrahierten Daten abrufen
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// Den resultierenden Dateinamen erstellen
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// Die JSON-Datei mit den extrahierten Daten an DropBox senden
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();

Extrahierte Daten ändern

Das folgende Skript ändert den Wert eines vorhandenen Felds und fügt für ein wiederholtes Feld neue Werte hinzu, basierend auf Informationen aus der Antwort eines externen Dienstes:
// Dieses Beispiel-Custom-Activity-Skript zeigt, wie ein vorhandenes Feld geändert 
// und ein neuer Feldwert basierend auf den Ergebnissen eines externen Aufrufs erstellt wird.

// Alle Exporte aus dem Document abrufen
var exports = Context.Transaction.Documents[0].Exports;

// Das JSON-Exportergebnis aus den Exporten abrufen
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Das PDF-Exportergebnis aus den Exporten abrufen
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Eine HTTP-Anfrage erstellen und erforderliche Anfrageeigenschaften angeben
var multipartFormDataRequest = Context.CreateMultipartFormDataRequest();
multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"
multipartFormDataRequest.Method = "POST";

// Extrahierte Daten aus dem JSON-Exportergebnis zur Anfrage hinzufügen
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// Das PDF aus den Exportergebnissen zur Anfrage hinzufügen
multipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");

// Das Timeout für die Vervollständigung der HTTP-Anfrage festlegen (in Minuten).
// Standardmäßig ist das Timeout auf 1 Minute eingestellt.
multipartFormDataRequest.Timeout = 1;

// Eine Anfrage an den Service senden
multipartFormDataRequest.Send();

// Ein Antwortergebnis abrufen
var newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);

// Angenommen, eine solche JSON wurde im Antwortergebnis erhalten:
/* {
    "DocumentData": {
        "Fields": {
            "InvoiceNumber": "706-222-3151",
            "InvoiceDate": "15.05.2020",
            "PurchaseOrder": [
                {
                    "OrderNumber": "25646788",
                    "Total": "540.54"
                },
                {
                    "OrderNumber": "24516684",
                    "Total": "138.43"
                }
            ]
        }
    }
}*/

// Den Wert eines vorhandenen Vantage-Dokumentfelds basierend auf Daten aus einem externen Aufruf ändern
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;

// Neue Vantage-Dokumentfeldwerte basierend auf Daten aus einem externen Aufruf hinzufügen
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;
});

Daten aus einer bestimmten Tabellenspalte abrufen

Das folgende Skript schreibt alle Werte (Zeilen) der Tabellenspalte Description in das Ereignisprotokoll des Vorgangs:
// Das erste Document in einer Transaction abrufen
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// Das Tabellenobjekt abrufen
var table = document.GetField("Line Items");

for (var i = 0; i < table.Instances.length; i++) {
  // Das 'Description'-Spaltenobjekt für jede Tabellenzeile abrufen und dessen Werte in das Vorgangs-Ereignisprotokoll schreiben
  var columnDescription = table.Instances[i].Children.find(x => x.Id === descriptionFieldId);
  Context.LogMessage("Description. Row " + i + ": " + columnDescription.Value);
}

Daten aus allen Tabellenspalten abrufen

Das folgende Skript schreibt alle Werte (Zeilen) aller Tabellenspalten in das Ereignisprotokoll des Vorgangs:
// Das erste Document in einer Transaction abrufen
var document = Context.Transaction.Documents[0];

// Das Tabellenobjekt abrufen
var table = document.GetField("Line Items");

// Alle Tabellendaten in das Vorgangs-Ereignisprotokoll schreiben
for (var i = 0; i < table.Instances.length; i++) {
    for (var j = 0; j < table.Instances[i].Children.length; j++) {
        Context.LogMessage("Tabellenzeile "+i+". Spalte "+table.Instances[i].Children[j].Name+": "+table.Instances[i].Children[j].Value);
    }
}

Zeilen zu einer Tabelle hinzufügen

Das folgende Skript fügt neue Tabellenzeilen hinzu und weist den Tabellenspalten Description und Quantity Werte zu:
// Das erste Document in einer Transaction abrufen
var document = Context.Transaction.Documents[0];

// Das Tabellenobjekt abrufen
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;

// Funktion erstellen, um eine Tabellenzeile hinzuzufügen und Werte für die Spalten Description und Quantity zu setzen
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;
}

// Drei Zeilen hinzufügen und Werte setzen
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++);

Zeilen aus einer Tabelle löschen

Das folgende Skript löscht alle Zeilen einer Tabelle:
// Das erste Document in einer Transaction abrufen
var document = Context.Transaction.Documents[0];

// Das Tabellenobjekt abrufen
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// Alle Zeilen über ihre Indizes löschen
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// Oder Sie können die gesamte Tabelle löschen
table.Remove();

Eine bestimmte Instanz eines wiederkehrenden Felds löschen

Das folgende Skript löscht die letzte Instanz eines wiederkehrenden Felds:
// Das erste Document in einer Transaction abrufen
var document = Context.Transaction.Documents[0];

// Das wiederholbare Feld-Objekt abrufen
var rField = document.GetField("First Name");

// Prüfen, ob dieses Feld wiederholbar ist
if (rField.IsRepeatable) {
    // Die letzte Instanz dieses Felds löschen
    if (rField.Instances.length >= 1) {
        rField.Instances[rField.Instances.length-1].Remove();
    }  
}
else {
    Context.LogMessage(rField.Name + " ist nicht wiederholbar.");
}

Eine JSON-Datei erzeugen und an ein System eines Drittanbieters senden

Das folgende Skript erzeugt eine JSON-Datei in einem benutzerdefinierten Format und sendet sie an ein System eines Drittanbieters:
// Dieses Beispiel für ein benutzerdefiniertes Export-Skript zeigt, wie eine JSON-Zeichenkette erstellt wird
// unter Verwendung extrahierter Invoice US-Feldwerte und diese an einen externen Endpunkt gesendet wird.
// Das erste Document im Vorgang abrufen.
var document = Context.Transaction.Documents[0];

// Ein JSON-Objekt erstellen und dessen Schlüssel/Wert-Paare setzen.
var extractedValues = {};
extractedValues.Total = document.GetField("Total").Value;
extractedValues.Currency = document.GetField("Currency").Value;
extractedValues.Date = document.GetField("Invoice Date").Value;

// Wiederholende Feldwerte abrufen und als Array-JSON-Werte setzen.
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);
}

// Die empfangene JSON-Datei hat das folgende Format:
/* {
   "Total": 1819.14,
   "Currency": "USD",
   "Date": "2019-05-23T00:00:00.000Z",
   "PurchaseOrderNumber": [
      "012345678",
      "4500123466"
   ]
}*/

// Eine multipart/form-data-Anfrage mit der zuvor erstellten JSON als Zeichenketteninhalt dieser Anfrage senden.
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();

Ursprüngliche Dateinamen abrufen

Das folgende Skript schreibt den ursprünglichen Namen einer Datei in das Feld MyField:
// Den Namen der Quelldatei abrufen und als Wert des angegebenen Felds („MyField") setzen
Context.Transaction.Documents.forEach( doc => {
    // Für Scanning Station wird der Name der Quelldatei in einen Registrierungsparameter eingefügt
    var param = doc.RegistrationParameters["SourceFileName"]; 
    doc.GetField("MyField").Value = param != null ?
        param.Value : doc.SourceFiles[0].FileName;
});