Scripting-reference
Dette dokument giver en omfattende reference til at skrive scripts i workflow-regler. Scripts giver dig mulighed for at implementere avanceret automatiseringslogik ved hjælp af JavaScript.
Oversigt
Handlingen Run Script i workflow-regler udfører JavaScript-kode for at automatisere komplekse ticket-håndteringsscenarier. Scripts kører i et sandkassemiljø med adgang til ticketdata, beskedkontekst og hjælpefunktioner.
Nøglefunktioner:
- Læs og modificer ticketegenskaber
- Få adgang til kunde- og ejerinformation
- Arbejd med brugerdefinerede felter
- Brug betinget logik og loops
- 10-sekunders udførelsestimeout for sikkerhed
Ticket-objekt
ticket-objektet er den primære kontekst for dine scripts. Det giver både læse- og skriveadgang til ticketdata.
Skrivebeskyttede egenskaber
// Grundlæggende ticketinformation
ticket.id // UUID-streng
ticket.subject // Ticketens emnelinje
// Nuværende status (objekt)
ticket.status.id // Status UUID
ticket.status.code // Statuskode (f.eks. "open", "closed")
ticket.status.name // Statusvisningsnavn
// Nuværende prioritet (objekt)
ticket.priority.id // Prioritets-UUID
ticket.priority.name // Prioritetsvisningsnavn
// Nuværende afdeling (objekt)
ticket.department.id // Afdelings-UUID
ticket.department.name // Afdelingsvisningsnavn
// Tildelt ejer (objekt, kan være undefined)
ticket.owner.id // Bruger-UUID
ticket.owner.email // Bruger-e-mail
ticket.owner.firstname // Brugers fornavn
ticket.owner.lastname // Brugers efternavn
// Kundeinformation (objekt)
ticket.customer.id // Kunde-UUID
ticket.customer.email // Kunde-e-mail
ticket.customer.firstname // Kundes fornavn
ticket.customer.lastname // Kundes efternavn
ticket.customer.name // Kundens fulde navn
// Mappe og tags
ticket.folder // Nuværende mappe: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE"
ticket.tags // Array af tag-strenge
Skrivbare egenskaber
Du kan ændre disse egenskaber ved direkte tildeling:
// Indstil status efter kode eller ID
ticket.status = "closed";
ticket.status = "550e8400-e29b-41d4-a716-446655440000";
// Indstil prioritet efter navn eller ID
ticket.priority = "High";
ticket.priority = "550e8400-e29b-41d4-a716-446655440001";
// Indstil afdeling efter navn eller ID
ticket.department = "Sales";
ticket.department = "550e8400-e29b-41d4-a716-446655440002";
// Indstil ejer efter e-mail eller ID
ticket.owner = "[email protected]";
ticket.owner = "550e8400-e29b-41d4-a716-446655440003";
// Indstil mappe
ticket.folder = "ASSIGNED";
ticket.folder = "SPAM";
ticket.folder = "ARCHIVE";
ticket.folder = "INBOX";
// Indstil tags (erstatter alle eksisterende tags)
ticket.tags = ["urgent", "vip"];
Brugerdefinerede felter
Brugerdefinerede felter kan læses og skrives ved hjælp af deres kode (ikke visningsnavnet).
Læsning af brugerdefinerede felter
// Adgang til brugerdefineret feltværdi direkte
var orderId = ticket.order_id; // Tekstfelt
var amount = ticket.order_amount; // Nummerfelt
var isVip = ticket.is_vip; // Boolean-felt
var region = ticket.region; // Select-felt
Skrivning af brugerdefinerede felter
// Indstil tekst brugerdefineret felt
ticket.order_id = "ORD-12345";
// Indstil nummer brugerdefineret felt
ticket.order_amount = 199.99;
// Indstil boolean brugerdefineret felt
ticket.is_vip = true;
// Indstil select brugerdefineret felt
ticket.category = "billing";
// Indstil dato brugerdefineret felt (ISO 8601-format)
ticket.due_date = "2024-12-31T23:59:59Z";
ticket.due_date = "2024-12-31";
Message-objekt
message-objektet er tilgængeligt, når reglen udløses af en beskedbegivenhed (New Customer Reply, New Staff Reply osv.).
if (message) {
message.id // Besked UUID
message.body_text // Beskedindhold (ren tekst)
message.body_html // Beskedindhold (HTML)
message.createdAt // ISO 8601 tidsstempel
}
Eksempel:
if (message && message.body_text) {
var bodyLower = message.body_text.toLowerCase();
if (bodyLower.includes("cancel subscription")) {
ticket.department = "Retention";
ticket.priority = "High";
}
}
Hjælpefunktioner
getStatuses()
Returnerer et array af alle tilgængelige statusser.
var statuses = getStatuses();
// Returnerer: [{ id: "...", code: "open", name: "Open" }, ...]
// Find en specifik status
for (var i = 0; i < statuses.length; i++) {
if (statuses[i].code === "pending") {
ticket.status = statuses[i].id;
break;
}
}
getPriorities()
Returnerer et array af alle tilgængelige prioriteter.
var priorities = getPriorities();
// Returnerer: [{ id: "...", name: "Low" }, { id: "...", name: "High" }, ...]
getDepartments()
Returnerer et array af alle tilgængelige afdelinger.
var departments = getDepartments();
// Returnerer: [{ id: "...", name: "Support" }, { id: "...", name: "Sales" }, ...]
getUsers()
Returnerer et array af alle tilgængelige brugere (agenter).
var users = getUsers();
// Returnerer: [{ id: "...", email: "[email protected]", firstname: "John", lastname: "Doe" }, ...]
fetch()
Foretager HTTP-anmodninger til eksterne API'er. Synkron - returnerer resultat direkte.
var response = fetch(url, options);
// response: { ok, status, statusText, text, json }
Muligheder: method (GET/POST/PUT/DELETE), headers (objekt), body (streng eller objekt)
Eksempel: Hent fra CRM og opdater brugerdefinerede felter
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";
}
}
Eksempel: POST til webhook
var response = fetch("https://hooks.example.com/helpdesk", {
method: "POST",
body: { ticket_id: ticket.id, customer_email: ticket.customer.email }
});
Bemærkninger: Kun HTTPS, 5s timeout, 1MB responsgrænse, interne netværk blokeret.
Almindelige mønstre
Betinget tildeling
// Indstil prioritet baseret på emne
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";
}
Kundedomæne-baseret logik
if (ticket.customer && ticket.customer.email) {
var email = ticket.customer.email;
var domain = email.split("@")[1];
// Enterprise-kundehåndtering
if (domain === "bigcorp.com" || domain === "enterprise.org") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.is_enterprise = true;
}
// Uddannelsesinstitution
if (domain.endsWith(".edu")) {
ticket.segment = "education";
}
}
Tag-håndtering
// Tilføj tags uden at miste eksisterende
var existingTags = ticket.tags || [];
existingTags.push("processed");
existingTags.push("automated");
ticket.tags = existingTags;
Arbejde med beskeder
if (message && message.body_text) {
var body = message.body_text.toLowerCase();
// Detekter frustrationsnøgleord
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-tildeling
var users = getUsers();
if (users.length > 0) {
// Simpel round-robin baseret på 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;
}
Fejlhåndtering
Scripts udføres i et sikkert miljø:
- Syntaksfejl fanges og logges; scriptet springes over.
- Ugyldige feltværdier (f.eks. ikke-eksisterende statusnavn) ignoreres.
- Timeouts (10 sekunder) forhindrer uendelige løkker.
- Fejl kaskaderer ikke til andre regler eller systemkomponenter.
Bedste praksis:
// Tjek for null/undefined før adgang til egenskaber
if (ticket.customer && ticket.customer.email) {
// Sikkert at tilgå ticket.customer.email
}
if (message) {
// Sikkert at tilgå message-egenskaber
}
// Brug try-catch for kompleks logik
try {
var data = JSON.parse(ticket.custom_json);
ticket.parsed_field = data.value;
} catch (e) {
// Håndter fejl elegant
}
Begrænsninger
- Udførelsestimeout: Scripts afsluttes efter 10 sekunder.
- Ingen filsystemadgang: Filoperationer er ikke tilgængelige.
- Ingen vedvarende tilstand: Variabler bevares ikke mellem scriptudførelser.
- Skrivebeskyttede felter:
ticket.id,ticket.subject,ticket.customerkan ikke ændres. - ES5 JavaScript: Moderne JavaScript-funktioner (pilefunktioner, const/let osv.) er muligvis ikke tilgængelige.