Ga naar hoofdinhoud

Scripting Referentie

Dit document biedt een uitgebreide referentie voor het schrijven van scripts in workflowregels. Scripts stellen u in staat geavanceerde automatiseringslogica te implementeren met behulp van JavaScript.


Overzicht​

De actie Run Script in workflowregels voert JavaScript-code uit om complexe ticketafhandelingsscenario's te automatiseren. Scripts draaien in een sandboxomgeving met toegang tot ticketgegevens, berichtcontext en hulpfuncties.

Belangrijkste kenmerken:

  • Ticketeigenschappen lezen en wijzigen
  • Toegang tot klant- en eigenarinformatie
  • Werken met aangepaste velden
  • Voorwaardelijke logica en loops gebruiken
  • 10 seconden uitvoeringstimeout voor veiligheid

Ticket Object​

Het ticket object is de primaire context voor uw scripts. Het biedt zowel lees- als schrijftoegang tot ticketgegevens.

Alleen-lezen eigenschappen​

// Basis ticketinformatie
ticket.id // UUID string
ticket.subject // Ticketonderwerpregel

// Huidige status (object)
ticket.status.id // Status UUID
ticket.status.code // Statuscode (bijv. "open", "closed")
ticket.status.name // Status weergavenaam

// Huidige prioriteit (object)
ticket.priority.id // Prioriteit UUID
ticket.priority.name // Prioriteit weergavenaam

// Huidige afdeling (object)
ticket.department.id // Afdeling UUID
ticket.department.name // Afdeling weergavenaam

// Toegewezen eigenaar (object, kan undefined zijn)
ticket.owner.id // Gebruiker UUID
ticket.owner.email // Gebruiker e-mail
ticket.owner.firstname // Gebruiker voornaam
ticket.owner.lastname // Gebruiker achternaam

// Klantinformatie (object)
ticket.customer.id // Klant UUID
ticket.customer.email // Klant e-mail
ticket.customer.firstname // Klant voornaam
ticket.customer.lastname // Klant achternaam
ticket.customer.name // Klant volledige naam

// Map en tags
ticket.folder // Huidige map: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE"
ticket.tags // Array van tag strings

Schrijfbare eigenschappen​

U kunt deze eigenschappen wijzigen door directe toewijzing:

// Status instellen op code of ID
ticket.status = "closed";
ticket.status = "550e8400-e29b-41d4-a716-446655440000";

// Prioriteit instellen op naam of ID
ticket.priority = "High";
ticket.priority = "550e8400-e29b-41d4-a716-446655440001";

// Afdeling instellen op naam of ID
ticket.department = "Sales";
ticket.department = "550e8400-e29b-41d4-a716-446655440002";

// Eigenaar instellen op e-mail of ID
ticket.owner = "[email protected]";
ticket.owner = "550e8400-e29b-41d4-a716-446655440003";

// Map instellen
ticket.folder = "ASSIGNED";
ticket.folder = "SPAM";
ticket.folder = "ARCHIVE";
ticket.folder = "INBOX";

// Tags instellen (vervangt alle bestaande tags)
ticket.tags = ["urgent", "vip"];

Aangepaste velden​

Aangepaste velden kunnen worden gelezen en geschreven met behulp van hun code (niet de weergavenaam).

Aangepaste velden lezen​

// Toegang tot aangepaste veldwaarde direct
var orderId = ticket.order_id; // Tekstveld
var amount = ticket.order_amount; // Nummerveld
var isVip = ticket.is_vip; // Boolean veld
var region = ticket.region; // Selectieveld

Aangepaste velden schrijven​

// Tekstueel aangepast veld instellen
ticket.order_id = "ORD-12345";

// Numeriek aangepast veld instellen
ticket.order_amount = 199.99;

// Boolean aangepast veld instellen
ticket.is_vip = true;

// Selectie aangepast veld instellen
ticket.category = "billing";

// Datum aangepast veld instellen (ISO 8601 formaat)
ticket.due_date = "2024-12-31T23:59:59Z";
ticket.due_date = "2024-12-31";

Message Object​

Het message object is beschikbaar wanneer de regel wordt geactiveerd door een berichtgebeurtenis (New Customer Reply, New Staff Reply, etc.).

if (message) {
message.id // Bericht UUID
message.body_text // Berichtinhoud (platte tekst)
message.body_html // Berichtinhoud (HTML)
message.createdAt // ISO 8601 timestamp
}

Voorbeeld:

if (message && message.body_text) {
var bodyLower = message.body_text.toLowerCase();

if (bodyLower.includes("cancel subscription")) {
ticket.department = "Retention";
ticket.priority = "High";
}
}

Hulpfuncties​

getStatuses()​

Retourneert een array van alle beschikbare statussen.

var statuses = getStatuses();
// Retourneert: [{ id: "...", code: "open", name: "Open" }, ...]

// Vind een specifieke status
for (var i = 0; i < statuses.length; i++) {
if (statuses[i].code === "pending") {
ticket.status = statuses[i].id;
break;
}
}

getPriorities()​

Retourneert een array van alle beschikbare prioriteiten.

var priorities = getPriorities();
// Retourneert: [{ id: "...", name: "Low" }, { id: "...", name: "High" }, ...]

getDepartments()​

Retourneert een array van alle beschikbare afdelingen.

var departments = getDepartments();
// Retourneert: [{ id: "...", name: "Support" }, { id: "...", name: "Sales" }, ...]

getUsers()​

Retourneert een array van alle beschikbare gebruikers (medewerkers).

var users = getUsers();
// Retourneert: [{ id: "...", email: "[email protected]", firstname: "John", lastname: "Doe" }, ...]

fetch()​

Voert HTTP-verzoeken uit naar externe API's. Synchroon - retourneert resultaat direct.

var response = fetch(url, options);
// response: { ok, status, statusText, text, json }

Opties: method (GET/POST/PUT/DELETE), headers (object), body (string of object)

Voorbeeld: Ophalen van CRM en aangepaste velden bijwerken

var response = fetch("https://api.example.com/customers/" + ticket.customer.email, {
headers: { "Authorization": "Bearer YOUR_API_KEY" }
});

if (response.ok && response.json) {
ticket.customer_tier = response.json.tier;
ticket.lifetime_value = response.json.lifetime_value;

if (response.json.tier === "enterprise") {
ticket.priority = "High";
}
}

Voorbeeld: POST naar webhook

var response = fetch("https://hooks.example.com/helpdesk", {
method: "POST",
body: { ticket_id: ticket.id, customer_email: ticket.customer.email }
});

Opmerkingen: Alleen HTTPS, 5s timeout, 1MB responslimiet, interne netwerken geblokkeerd.


Veelvoorkomende patronen​

Voorwaardelijke toewijzing​

// Prioriteit instellen op basis van onderwerp
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
} else if (ticket.subject.toLowerCase().includes("question")) {
ticket.priority = "Low";
}

Afdelingsrouting​

var subject = ticket.subject.toLowerCase();

if (subject.includes("billing") || subject.includes("payment") || subject.includes("invoice")) {
ticket.department = "Billing";
} else if (subject.includes("technical") || subject.includes("bug") || subject.includes("error")) {
ticket.department = "Technical Support";
} else if (subject.includes("sales") || subject.includes("pricing") || subject.includes("quote")) {
ticket.department = "Sales";
}

Klantdomein-gebaseerde logica​

if (ticket.customer && ticket.customer.email) {
var email = ticket.customer.email;
var domain = email.split("@")[1];

// Enterprise klantafhandeling
if (domain === "bigcorp.com" || domain === "enterprise.org") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.is_enterprise = true;
}

// Onderwijsinstelling
if (domain.endsWith(".edu")) {
ticket.segment = "education";
}
}

Tagbeheer​

// Tags toevoegen zonder bestaande te verliezen
var existingTags = ticket.tags || [];
existingTags.push("processed");
existingTags.push("automated");
ticket.tags = existingTags;

Werken met berichten​

if (message && message.body_text) {
var body = message.body_text.toLowerCase();

// Frustratie trefwoorden detecteren
var frustrationKeywords = ["frustrated", "angry", "terrible", "worst", "unacceptable"];
for (var i = 0; i < frustrationKeywords.length; i++) {
if (body.includes(frustrationKeywords[i])) {
ticket.priority = "High";
ticket.needs_attention = true;
break;
}
}
}

Round-Robin toewijzing​

var users = getUsers();
if (users.length > 0) {
// Eenvoudige round-robin op basis van ticket ID hash
var ticketHash = 0;
for (var i = 0; i < ticket.id.length; i++) {
ticketHash += ticket.id.charCodeAt(i);
}
var assigneeIndex = ticketHash % users.length;
ticket.owner = users[assigneeIndex].email;
}

Foutafhandeling​

Scripts worden uitgevoerd in een veilige omgeving:

  • Syntaxfouten worden opgevangen en gelogd; het script wordt overgeslagen.
  • Ongeldige veldwaarden (bijv. niet-bestaande statusnaam) worden genegeerd.
  • Timeouts (10 seconden) voorkomen oneindige loops.
  • Fouten cascaderen niet naar andere regels of systeemcomponenten.

Best practices:

// Controleer op null/undefined voordat u eigenschappen opent
if (ticket.customer && ticket.customer.email) {
// Veilig om ticket.customer.email op te vragen
}

if (message) {
// Veilig om message eigenschappen op te vragen
}

// Gebruik try-catch voor complexe logica
try {
var data = JSON.parse(ticket.custom_json);
ticket.parsed_field = data.value;
} catch (e) {
// Behandel fout netjes
}

Beperkingen​

  • Uitvoeringstimeout: Scripts worden beëindigd na 10 seconden.
  • Geen bestandssysteemtoegang: Bestandsbewerkingen zijn niet beschikbaar.
  • Geen persistente status: Variabelen blijven niet bestaan tussen scriptuitvoeringen.
  • Alleen-lezen velden: ticket.id, ticket.subject, ticket.customer kunnen niet worden gewijzigd.
  • ES5 JavaScript: Moderne JavaScript-functies (arrow functions, const/let, etc.) zijn mogelijk niet beschikbaar.