Gå til hovedinnhold

Skriptreferanse

Dette dokumentet gir en omfattende referanse for å skrive skript i arbeidsflytregler. Skript lar deg implementere avansert automatiseringslogikk ved hjelp av JavaScript.


Oversikt​

Run Script-handlingen i arbeidsflytregler kjører JavaScript-kode for å automatisere komplekse billettbehandlingsscenarier. Skript kjører i et isolert miljø med tilgang til billettdata, meldingskontekst og hjelpefunksjoner.

Nøkkelfunksjoner:

  • Les og endre billettegenskaper
  • Tilgang til kunde- og eierinformasjon
  • Arbeid med egendefinerte felt
  • Bruk betinget logikk og løkker
  • 10-sekunders kjøringstidsavbrudd for sikkerhet

Ticket-objekt​

ticket-objektet er den primære konteksten for skriptene dine. Det gir både lese- og skrivetilgang til billettdata.

Skrivebeskyttede egenskaper​

// Grunnleggende billettinformasjon
ticket.id // UUID-streng
ticket.subject // Billettemne

// Gjeldende status (objekt)
ticket.status.id // Status UUID
ticket.status.code // Statuskode (f.eks. "open", "closed")
ticket.status.name // Status visningsnavn

// Gjeldende prioritet (objekt)
ticket.priority.id // Prioritet UUID
ticket.priority.name // Prioritet visningsnavn

// Gjeldende avdeling (objekt)
ticket.department.id // Avdeling UUID
ticket.department.name // Avdeling visningsnavn

// Tildelt eier (objekt, kan være undefined)
ticket.owner.id // Bruker UUID
ticket.owner.email // Bruker e-post
ticket.owner.firstname // Bruker fornavn
ticket.owner.lastname // Bruker etternavn

// Kundeinformasjon (objekt)
ticket.customer.id // Kunde UUID
ticket.customer.email // Kunde e-post
ticket.customer.firstname // Kunde fornavn
ticket.customer.lastname // Kunde etternavn
ticket.customer.name // Kunde fullt navn

// Mappe og tagger
ticket.folder // Gjeldende mappe: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE"
ticket.tags // Array av tag-strenger

Skrivbare egenskaper​

Du kan endre disse egenskapene ved direkte tilordning:

// Sett status etter kode eller ID
ticket.status = "closed";
ticket.status = "550e8400-e29b-41d4-a716-446655440000";

// Sett prioritet etter navn eller ID
ticket.priority = "High";
ticket.priority = "550e8400-e29b-41d4-a716-446655440001";

// Sett avdeling etter navn eller ID
ticket.department = "Sales";
ticket.department = "550e8400-e29b-41d4-a716-446655440002";

// Sett eier etter e-post eller ID
ticket.owner = "[email protected]";
ticket.owner = "550e8400-e29b-41d4-a716-446655440003";

// Sett mappe
ticket.folder = "ASSIGNED";
ticket.folder = "SPAM";
ticket.folder = "ARCHIVE";
ticket.folder = "INBOX";

// Sett tagger (erstatter alle eksisterende tagger)
ticket.tags = ["urgent", "vip"];

Egendefinerte felt​

Egendefinerte felt kan leses og skrives ved hjelp av deres kode (ikke visningsnavnet).

Lese egendefinerte felt​

// Tilgang til egendefinert feltverdi direkte
var orderId = ticket.order_id; // Tekstfelt
var amount = ticket.order_amount; // Tallfelt
var isVip = ticket.is_vip; // Boolsk felt
var region = ticket.region; // Valgfelt

Skrive egendefinerte felt​

// Sett tekst egendefinert felt
ticket.order_id = "ORD-12345";

// Sett tall egendefinert felt
ticket.order_amount = 199.99;

// Sett boolsk egendefinert felt
ticket.is_vip = true;

// Sett valg egendefinert felt
ticket.category = "billing";

// Sett dato egendefinert felt (ISO 8601-format)
ticket.due_date = "2024-12-31T23:59:59Z";
ticket.due_date = "2024-12-31";

Message-objekt​

message-objektet er tilgjengelig når regelen utløses av en meldingshendelse (New Customer Reply, New Staff Reply, osv.).

if (message) {
message.id // Meldings UUID
message.body_text // Meldingsinnhold (ren tekst)
message.body_html // Meldingsinnhold (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";
}
}

Hjelpefunksjoner​

getStatuses()​

Returnerer et array med alle tilgjengelige statuser.

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

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

getPriorities()​

Returnerer et array med alle tilgjengelige prioriteter.

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

getDepartments()​

Returnerer et array med alle tilgjengelige avdelinger.

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

getUsers()​

Returnerer et array med alle tilgjengelige brukere (agenter).

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

fetch()​

Utfører HTTP-forespørsler til eksterne API-er. Synkron - returnerer resultat direkte.

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

Alternativer: method (GET/POST/PUT/DELETE), headers (objekt), body (streng eller objekt)

Eksempel: Hent fra CRM og oppdater egendefinerte felt

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 }
});

Merknader: Kun HTTPS, 5s tidsavbrudd, 1MB responsgrense, interne nettverk blokkert.


Vanlige mønstre​

Betinget tilordning​

// Sett prioritet basert på emne
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
} else if (ticket.subject.toLowerCase().includes("question")) {
ticket.priority = "Low";
}

Avdelingsruting​

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";
}

Kundedomenebasert logikk​

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

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

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

Tag-administrasjon​

// Legg til tagger uten å miste eksisterende
var existingTags = ticket.tags || [];
existingTags.push("processed");
existingTags.push("automated");
ticket.tags = existingTags;

Arbeid med meldinger​

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

// Oppdag frustrasjonsnøkkelord
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 tilordning​

var users = getUsers();
if (users.length > 0) {
// Enkel round-robin basert på billett-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;
}

Feilhåndtering​

Skript kjøres i et sikkert miljø:

  • Syntaksfeil fanges opp og logges; skriptet hoppes over.
  • Ugyldige feltverdier (f.eks. ikke-eksisterende statusnavn) ignoreres.
  • Tidsavbrudd (10 sekunder) forhindrer uendelige løkker.
  • Feil kaskaderer ikke til andre regler eller systemkomponenter.

Beste praksis:

// Sjekk for null/undefined før du får tilgang til egenskaper
if (ticket.customer && ticket.customer.email) {
// Trygt å få tilgang til ticket.customer.email
}

if (message) {
// Trygt å få tilgang til meldingsegenskaper
}

// Bruk try-catch for kompleks logikk
try {
var data = JSON.parse(ticket.custom_json);
ticket.parsed_field = data.value;
} catch (e) {
// Håndter feil grasiøst
}

Begrensninger​

  • Kjøringstidsavbrudd: Skript avsluttes etter 10 sekunder.
  • Ingen filsystemtilgang: Filoperasjoner er ikke tilgjengelige.
  • Ingen vedvarende tilstand: Variabler vedvarer ikke mellom skriptkjøringer.
  • Skrivebeskyttede felt: ticket.id, ticket.subject, ticket.customer kan ikke endres.
  • ES5 JavaScript: Moderne JavaScript-funksjoner (pilfunksjoner, const/let, osv.) er kanskje ikke tilgjengelige.