Skriptreferens
Detta dokument tillhandahaller en omfattande referens for att skriva skript i arbetsflödesregler. Skript later dig implementera avancerad automatiseringslogik med JavaScript.
Oversikt
Run Script-atgarden i arbetsflödesregler kor JavaScript-kod for att automatisera komplexa arendehanteringsscenarier. Skript kors i en sandboxad miljo med atkomst till arendedata, meddelandekontext och hjalpfunktioner.
Nyckelfunktioner:
- Las och andra arendeegenskaper
- Fa atkomst till kund- och agarinformation
- Arbeta med anpassade falt
- Anvand villkorlig logik och loopar
- 10 sekunders exekveringstimeout for sakerhet
Ticket-objekt
ticket-objektet ar det primara sammanhanget for dina skript. Det ger bade las- och skrivatkomst till arendedata.
Skrivskyddade egenskaper
// Grundlaggande arendeinformation
ticket.id // UUID-strang
ticket.subject // Arendets amnesrad
// Aktuell status (objekt)
ticket.status.id // Status-UUID
ticket.status.code // Statuskod (t.ex. "open", "closed")
ticket.status.name // Statusvisningsnamn
// Aktuell prioritet (objekt)
ticket.priority.id // Prioritets-UUID
ticket.priority.name // Prioritetsvisningsnamn
// Aktuell avdelning (objekt)
ticket.department.id // Avdelnings-UUID
ticket.department.name // Avdelningsvisningsnamn
// Tilldelad agare (objekt, kan vara undefined)
ticket.owner.id // Anvandar-UUID
ticket.owner.email // Anvandarens e-post
ticket.owner.firstname // Anvandarens fornamn
ticket.owner.lastname // Anvandarens efternamn
// Kundinformation (objekt)
ticket.customer.id // Kund-UUID
ticket.customer.email // Kundens e-post
ticket.customer.firstname // Kundens fornamn
ticket.customer.lastname // Kundens efternamn
ticket.customer.name // Kundens fullstandiga namn
// Mapp och taggar
ticket.folder // Aktuell mapp: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE"
ticket.tags // Array av taggar som strangar
Skrivbara egenskaper
Du kan andra dessa egenskaper genom direkt tilldelning:
// Stall in status med kod eller ID
ticket.status = "closed";
ticket.status = "550e8400-e29b-41d4-a716-446655440000";
// Stall in prioritet med namn eller ID
ticket.priority = "High";
ticket.priority = "550e8400-e29b-41d4-a716-446655440001";
// Stall in avdelning med namn eller ID
ticket.department = "Sales";
ticket.department = "550e8400-e29b-41d4-a716-446655440002";
// Stall in agare med e-post eller ID
ticket.owner = "[email protected]";
ticket.owner = "550e8400-e29b-41d4-a716-446655440003";
// Stall in mapp
ticket.folder = "ASSIGNED";
ticket.folder = "SPAM";
ticket.folder = "ARCHIVE";
ticket.folder = "INBOX";
// Stall in taggar (ersatter alla befintliga taggar)
ticket.tags = ["urgent", "vip"];
Anpassade falt
Anpassade falt kan lasas och skrivas med deras kod (inte visningsnamnet).
Lasa anpassade falt
// Fa atkomst till anpassat faltvarde direkt
var orderId = ticket.order_id; // Textfalt
var amount = ticket.order_amount; // Nummerfalt
var isVip = ticket.is_vip; // Boolean-falt
var region = ticket.region; // Select-falt
Skriva anpassade falt
// Stall in text anpassat falt
ticket.order_id = "ORD-12345";
// Stall in nummer anpassat falt
ticket.order_amount = 199.99;
// Stall in boolean anpassat falt
ticket.is_vip = true;
// Stall in select anpassat falt
ticket.category = "billing";
// Stall in datum anpassat falt (ISO 8601-format)
ticket.due_date = "2024-12-31T23:59:59Z";
ticket.due_date = "2024-12-31";
Message-objekt
message-objektet ar tillgangligt nar regeln utloses av en meddelandehandelse (New Customer Reply, New Staff Reply, etc.).
if (message) {
message.id // Meddelande-UUID
message.body_text // Meddelandeinnehall (klartext)
message.body_html // Meddelandeinnehall (HTML)
message.createdAt // ISO 8601-tidsstampel
}
Exempel:
if (message && message.body_text) {
var bodyLower = message.body_text.toLowerCase();
if (bodyLower.includes("cancel subscription")) {
ticket.department = "Retention";
ticket.priority = "High";
}
}
Hjalpfunktioner
getStatuses()
Returnerar en array av alla tillgangliga statusar.
var statuses = getStatuses();
// Returnerar: [{ id: "...", code: "open", name: "Open" }, ...]
// Hitta en specifik status
for (var i = 0; i < statuses.length; i++) {
if (statuses[i].code === "pending") {
ticket.status = statuses[i].id;
break;
}
}
getPriorities()
Returnerar en array av alla tillgangliga prioriteter.
var priorities = getPriorities();
// Returnerar: [{ id: "...", name: "Low" }, { id: "...", name: "High" }, ...]
getDepartments()
Returnerar en array av alla tillgangliga avdelningar.
var departments = getDepartments();
// Returnerar: [{ id: "...", name: "Support" }, { id: "...", name: "Sales" }, ...]
getUsers()
Returnerar en array av alla tillgangliga anvandare (agenter).
var users = getUsers();
// Returnerar: [{ id: "...", email: "[email protected]", firstname: "John", lastname: "Doe" }, ...]
fetch()
Gor HTTP-forfragningar till externa API:er. Synkron - returnerar resultat direkt.
var response = fetch(url, options);
// response: { ok, status, statusText, text, json }
Alternativ: method (GET/POST/PUT/DELETE), headers (objekt), body (strang eller objekt)
Exempel: Hamta fran CRM och uppdatera anpassade falt
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";
}
}
Exempel: POST till webhook
var response = fetch("https://hooks.example.com/helpdesk", {
method: "POST",
body: { ticket_id: ticket.id, customer_email: ticket.customer.email }
});
Anmarkningar: Endast HTTPS, 5s timeout, 1MB svarsgrans, interna natverk blockerade.
Vanliga monster
Villkorlig tilldelning
// Stall in prioritet baserat pa amne
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
} else if (ticket.subject.toLowerCase().includes("question")) {
ticket.priority = "Low";
}
Avdelningsdirigering
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";
}
Kunddomänbaserad logik
if (ticket.customer && ticket.customer.email) {
var email = ticket.customer.email;
var domain = email.split("@")[1];
// Enterprise-kundhantering
if (domain === "bigcorp.com" || domain === "enterprise.org") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.is_enterprise = true;
}
// Utbildningsinstitution
if (domain.endsWith(".edu")) {
ticket.segment = "education";
}
}
Tagghantering
// Lagg till taggar utan att forlora befintliga
var existingTags = ticket.tags || [];
existingTags.push("processed");
existingTags.push("automated");
ticket.tags = existingTags;
Arbeta med meddelanden
if (message && message.body_text) {
var body = message.body_text.toLowerCase();
// Detektera frustrationsord
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-tilldelning
var users = getUsers();
if (users.length > 0) {
// Enkel round-robin baserad pa 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;
}
Felhantering
Skript kors i en saker miljo:
- Syntaxfel fangas och loggas; skriptet hoppas over.
- Ogiltiga faltvarden (t.ex. icke-existerande statusnamn) ignoreras.
- Timeouts (10 sekunder) forhindrar oandliga loopar.
- Fel sprids inte till andra regler eller systemkomponenter.
Basta praxis:
// Kontrollera null/undefined innan atkomst till egenskaper
if (ticket.customer && ticket.customer.email) {
// Sakert att atkomma ticket.customer.email
}
if (message) {
// Sakert att atkomma meddelandeegenskaper
}
// Anvand try-catch for komplex logik
try {
var data = JSON.parse(ticket.custom_json);
ticket.parsed_field = data.value;
} catch (e) {
// Hantera fel graciost
}
Begransningar
- Exekveringstimeout: Skript avslutas efter 10 sekunder.
- Ingen filsystematkomst: Filoperationer ar inte tillgangliga.
- Inget bestandigt tillstand: Variabler bibehalls inte mellan skriptkorningar.
- Skrivskyddade falt:
ticket.id,ticket.subject,ticket.customerkan inte andras. - ES5 JavaScript: Moderna JavaScript-funktioner (pilfunktioner, const/let, etc.) kanske inte ar tillgangliga.