Přeskočit na hlavní obsah

Referenční příručka skriptování

Tento dokument poskytuje komplexní referenci pro psaní skriptů v pravidlech workflow. Skripty umožňují implementovat pokročilou logiku automatizace pomocí JavaScriptu.


Přehled​

Akce Run Script v pravidlech workflow vykonává JavaScript kód pro automatizaci komplexních scénářů zpracování tiketů. Skripty běží v izolovaném prostředí s přístupem k datům tiketu, kontextu zprávy a pomocným funkcím.

Klíčové vlastnosti:

  • Čtení a úprava vlastností tiketu
  • Přístup k informacím o zákazníkovi a vlastníkovi
  • Práce s vlastními poli
  • Použití podmíněné logiky a cyklů
  • 10sekundový timeout provádění pro bezpečnost

Objekt Ticket​

Objekt ticket je primárním kontextem pro vaše skripty. Poskytuje přístup pro čtení i zápis k datům tiketu.

Vlastnosti pouze pro čtení​

// Základní informace o tiketu
ticket.id // UUID řetězec
ticket.subject // Předmět tiketu

// Aktuální stav (objekt)
ticket.status.id // UUID stavu
ticket.status.code // Kód stavu (např. "open", "closed")
ticket.status.name // Zobrazované jméno stavu

// Aktuální priorita (objekt)
ticket.priority.id // UUID priority
ticket.priority.name // Zobrazované jméno priority

// Aktuální oddělení (objekt)
ticket.department.id // UUID oddělení
ticket.department.name // Zobrazované jméno oddělení

// Přiřazený vlastník (objekt, může být undefined)
ticket.owner.id // UUID uživatele
ticket.owner.email // Email uživatele
ticket.owner.firstname // Křestní jméno uživatele
ticket.owner.lastname // Příjmení uživatele

// Informace o zákazníkovi (objekt)
ticket.customer.id // UUID zákazníka
ticket.customer.email // Email zákazníka
ticket.customer.firstname // Křestní jméno zákazníka
ticket.customer.lastname // Příjmení zákazníka
ticket.customer.name // Celé jméno zákazníka

// Složka a tagy
ticket.folder // Aktuální složka: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE"
ticket.tags // Pole řetězců tagů

Zapisovatelné vlastnosti​

Můžete upravovat tyto vlastnosti přímým přiřazením:

// Nastavit stav podle kódu nebo ID
ticket.status = "closed";
ticket.status = "550e8400-e29b-41d4-a716-446655440000";

// Nastavit prioritu podle jména nebo ID
ticket.priority = "High";
ticket.priority = "550e8400-e29b-41d4-a716-446655440001";

// Nastavit oddělení podle jména nebo ID
ticket.department = "Sales";
ticket.department = "550e8400-e29b-41d4-a716-446655440002";

// Nastavit vlastníka podle emailu nebo ID
ticket.owner = "[email protected]";
ticket.owner = "550e8400-e29b-41d4-a716-446655440003";

// Nastavit složku
ticket.folder = "ASSIGNED";
ticket.folder = "SPAM";
ticket.folder = "ARCHIVE";
ticket.folder = "INBOX";

// Nastavit tagy (nahrazuje všechny existující tagy)
ticket.tags = ["urgent", "vip"];

Vlastní pole​

Vlastní pole lze číst a zapisovat pomocí jejich kódu (nikoli zobrazovaného jména).

Čtení vlastních polí​

// Přímý přístup k hodnotě vlastního pole
var orderId = ticket.order_id; // Textové pole
var amount = ticket.order_amount; // Číselné pole
var isVip = ticket.is_vip; // Boolean pole
var region = ticket.region; // Pole výběru

Zápis vlastních polí​

// Nastavit textové vlastní pole
ticket.order_id = "ORD-12345";

// Nastavit číselné vlastní pole
ticket.order_amount = 199.99;

// Nastavit boolean vlastní pole
ticket.is_vip = true;

// Nastavit pole výběru
ticket.category = "billing";

// Nastavit pole data (formát ISO 8601)
ticket.due_date = "2024-12-31T23:59:59Z";
ticket.due_date = "2024-12-31";

Objekt Message​

Objekt message je k dispozici, když je pravidlo spuštěno událostí zprávy (New Customer Reply, New Staff Reply atd.).

if (message) {
message.id // UUID zprávy
message.body_text // Obsah zprávy (prostý text)
message.body_html // Obsah zprávy (HTML)
message.createdAt // Časové razítko ISO 8601
}

Příklad:

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

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

Pomocné funkce​

getStatuses()​

Vrací pole všech dostupných stavů.

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

// Najít konkrétní stav
for (var i = 0; i < statuses.length; i++) {
if (statuses[i].code === "pending") {
ticket.status = statuses[i].id;
break;
}
}

getPriorities()​

Vrací pole všech dostupných priorit.

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

getDepartments()​

Vrací pole všech dostupných oddělení.

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

getUsers()​

Vrací pole všech dostupných uživatelů (agentů).

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

fetch()​

Provádí HTTP požadavky na externí API. Synchronní - vrací výsledek přímo.

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

Možnosti: method (GET/POST/PUT/DELETE), headers (objekt), body (řetězec nebo objekt)

Příklad: Načtení z CRM a aktualizace vlastních polí

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

Příklad: POST do webhooku

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

Poznámky: Pouze HTTPS, 5s timeout, 1MB limit odpovědi, interní sítě blokované.


Běžné vzory​

Podmíněné přiřazení​

// Nastavit prioritu podle předmětu
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
} else if (ticket.subject.toLowerCase().includes("question")) {
ticket.priority = "Low";
}

Směrování oddělení​

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

Logika založená na doméně zákazníka​

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

// Zpracování podnikových zákazníků
if (domain === "bigcorp.com" || domain === "enterprise.org") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.is_enterprise = true;
}

// Vzdělávací instituce
if (domain.endsWith(".edu")) {
ticket.segment = "education";
}
}

Správa tagů​

// Přidat tagy bez ztráty existujících
var existingTags = ticket.tags || [];
existingTags.push("processed");
existingTags.push("automated");
ticket.tags = existingTags;

Práce se zprávami​

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

// Detekce klíčových slov frustrace
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;
}
}
}

Přiřazení Round-Robin​

var users = getUsers();
if (users.length > 0) {
// Jednoduchý round-robin na základě hashe ID tiketu
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;
}

Zpracování chyb​

Skripty jsou vykonávány v bezpečném prostředí:

  • Syntaktické chyby jsou zachyceny a zalogované; skript je přeskočen.
  • Neplatné hodnoty polí (např. neexistující název stavu) jsou ignorovány.
  • Timeouty (10 sekund) zabraňují nekonečným cyklům.
  • Chyby se nekaskádují do dalších pravidel nebo systémových komponent.

Osvědčené postupy:

// Zkontrolujte na null/undefined před přístupem k vlastnostem
if (ticket.customer && ticket.customer.email) {
// Bezpečný přístup k ticket.customer.email
}

if (message) {
// Bezpečný přístup k vlastnostem zprávy
}

// Použijte try-catch pro komplexní logiku
try {
var data = JSON.parse(ticket.custom_json);
ticket.parsed_field = data.value;
} catch (e) {
// Zpracovat chybu elegantně
}

Omezení​

  • Timeout provádění: Skripty jsou ukončeny po 10 sekundách.
  • Žádný přístup k souborovému systému: Souborové operace nejsou k dispozici.
  • Žádný trvalý stav: Proměnné nepřetrvávají mezi prováděními skriptů.
  • Pole pouze pro čtení: ticket.id, ticket.subject, ticket.customer nelze upravovat.
  • ES5 JavaScript: Moderní JavaScript funkce (arrow functions, const/let atd.) nemusí být k dispozici.