Skriptausreferenssi
Tämä dokumentti tarjoaa kattavan referenssin skriptien kirjoittamiseen työnkulkusäännöissä. Skriptit antavat sinun toteuttaa edistynyttä automaatiologiikkaa JavaScriptiä käyttäen.
Yleiskatsaus
Run Script -toiminto työnkulkusäännöissä suorittaa JavaScript-koodia automatisoidakseen monimutkaisia tikettien käsittelyskenaarioita. Skriptit suoritetaan hiekkalaatikkoympäristössä pääsyllä tikettidataan, viestikontekstiin ja apufunktioihin.
Keskeiset ominaisuudet:
- Lue ja muokkaa tikettiominaisuuksia
- Käytä asiakas- ja omistajatietoja
- Työskentele mukautettujen kenttien kanssa
- Käytä ehdollista logiikkaa ja silmukoita
- 10 sekunnin suoritus-timeout turvallisuuden vuoksi
Ticket-objekti
ticket-objekti on ensisijainen konteksti skripteillesi. Se tarjoaa sekä luku- että kirjoituspääsyn tikettidataan.
Vain luku -ominaisuudet
// Perus tikettitiedot
ticket.id // UUID-merkkijono
ticket.subject // Tiketin aihe
// Nykyinen tila (objekti)
ticket.status.id // Tilan UUID
ticket.status.code // Tilakoodi (esim. "open", "closed")
ticket.status.name // Tilan näyttönimi
// Nykyinen prioriteetti (objekti)
ticket.priority.id // Prioriteetin UUID
ticket.priority.name // Prioriteetin näyttönimi
// Nykyinen osasto (objekti)
ticket.department.id // Osaston UUID
ticket.department.name // Osaston näyttönimi
// Osoitettu omistaja (objekti, voi olla undefined)
ticket.owner.id // Käyttäjän UUID
ticket.owner.email // Käyttäjän sähköposti
ticket.owner.firstname // Käyttäjän etunimi
ticket.owner.lastname // Käyttäjän sukunimi
// Asiakastiedot (objekti)
ticket.customer.id // Asiakkaan UUID
ticket.customer.email // Asiakkaan sähköposti
ticket.customer.firstname // Asiakkaan etunimi
ticket.customer.lastname // Asiakkaan sukunimi
ticket.customer.name // Asiakkaan koko nimi
// Kansio ja tagit
ticket.folder // Nykyinen kansio: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE"
ticket.tags // Tagi-merkkijonojen taulukko
Kirjoitettavat ominaisuudet
Voit muokata näitä ominaisuuksia suoralla määrityksellä:
// Aseta tila koodilla tai ID:llä
ticket.status = "closed";
ticket.status = "550e8400-e29b-41d4-a716-446655440000";
// Aseta prioriteetti nimellä tai ID:llä
ticket.priority = "High";
ticket.priority = "550e8400-e29b-41d4-a716-446655440001";
// Aseta osasto nimellä tai ID:llä
ticket.department = "Sales";
ticket.department = "550e8400-e29b-41d4-a716-446655440002";
// Aseta omistaja sähköpostilla tai ID:llä
ticket.owner = "[email protected]";
ticket.owner = "550e8400-e29b-41d4-a716-446655440003";
// Aseta kansio
ticket.folder = "ASSIGNED";
ticket.folder = "SPAM";
ticket.folder = "ARCHIVE";
ticket.folder = "INBOX";
// Aseta tagit (korvaa kaikki olemassa olevat tagit)
ticket.tags = ["urgent", "vip"];
Mukautetut kentät
Mukautettuja kenttiä voidaan lukea ja kirjoittaa niiden koodin avulla (ei näyttönimen).
Mukautettujen kenttien lukeminen
// Käytä mukautetun kentän arvoa suoraan
var orderId = ticket.order_id; // Tekstikenttä
var amount = ticket.order_amount; // Numerokenttä
var isVip = ticket.is_vip; // Boolean-kenttä
var region = ticket.region; // Valitse-kenttä
Mukautettujen kenttien kirjoittaminen
// Aseta teksti mukautettu kenttä
ticket.order_id = "ORD-12345";
// Aseta numero mukautettu kenttä
ticket.order_amount = 199.99;
// Aseta boolean mukautettu kenttä
ticket.is_vip = true;
// Aseta valitse mukautettu kenttä
ticket.category = "billing";
// Aseta päivämäärä mukautettu kenttä (ISO 8601 muoto)
ticket.due_date = "2024-12-31T23:59:59Z";
ticket.due_date = "2024-12-31";
Message-objekti
message-objekti on saatavilla kun sääntö laukaistaan viestitapahtumalla (New Customer Reply, New Staff Reply, jne.).
if (message) {
message.id // Viestin UUID
message.body_text // Viestin sisältö (pelkkä teksti)
message.body_html // Viestin sisältö (HTML)
message.createdAt // ISO 8601 aikaleima
}
Esimerkki:
if (message && message.body_text) {
var bodyLower = message.body_text.toLowerCase();
if (bodyLower.includes("cancel subscription")) {
ticket.department = "Retention";
ticket.priority = "High";
}
}
Apufunktiot
getStatuses()
Palauttaa taulukon kaikista saatavilla olevista tiloista.
var statuses = getStatuses();
// Palauttaa: [{ id: "...", code: "open", name: "Open" }, ...]
// Etsi tietty tila
for (var i = 0; i < statuses.length; i++) {
if (statuses[i].code === "pending") {
ticket.status = statuses[i].id;
break;
}
}
getPriorities()
Palauttaa taulukon kaikista saatavilla olevista prioriteeteista.
var priorities = getPriorities();
// Palauttaa: [{ id: "...", name: "Low" }, { id: "...", name: "High" }, ...]
getDepartments()
Palauttaa taulukon kaikista saatavilla olevista osastoista.
var departments = getDepartments();
// Palauttaa: [{ id: "...", name: "Support" }, { id: "...", name: "Sales" }, ...]
getUsers()
Palauttaa taulukon kaikista saatavilla olevista käyttäjistä (agenteista).
var users = getUsers();
// Palauttaa: [{ id: "...", email: "[email protected]", firstname: "John", lastname: "Doe" }, ...]
fetch()
Tekee HTTP-pyyntöjä ulkoisiin API:hin. Synkroninen - palauttaa tuloksen suoraan.
var response = fetch(url, options);
// response: { ok, status, statusText, text, json }
Vaihtoehdot: method (GET/POST/PUT/DELETE), headers (objekti), body (merkkijono tai objekti)
Esimerkki: Hae CRM:stä ja päivitä mukautetut kentät
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";
}
}
Esimerkki: POST webhookiin
var response = fetch("https://hooks.example.com/helpdesk", {
method: "POST",
body: { ticket_id: ticket.id, customer_email: ticket.customer.email }
});
Huomautukset: Vain HTTPS, 5s timeout, 1MB vastausraja, sisäiset verkot estetty.
Yleiset mallit
Ehdollinen määritys
// Aseta prioriteetti aiheen perusteella
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
} else if (ticket.subject.toLowerCase().includes("question")) {
ticket.priority = "Low";
}
Osastojen reititys
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";
}
Asiakkaan verkkotunnukseen perustuva logiikka
if (ticket.customer && ticket.customer.email) {
var email = ticket.customer.email;
var domain = email.split("@")[1];
// Yritysasiakkaan käsittely
if (domain === "bigcorp.com" || domain === "enterprise.org") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.is_enterprise = true;
}
// Oppilaitokset
if (domain.endsWith(".edu")) {
ticket.segment = "education";
}
}
Tagien hallinta
// Lisää tageja menettämättä olemassa olevia
var existingTags = ticket.tags || [];
existingTags.push("processed");
existingTags.push("automated");
ticket.tags = existingTags;
Viestien käsittely
if (message && message.body_text) {
var body = message.body_text.toLowerCase();
// Tunnista turhautumisen avainsanat
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-osoitus
var users = getUsers();
if (users.length > 0) {
// Yksinkertainen round-robin tiketin ID:n hashin perusteella
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;
}
Virheenkäsittely
Skriptit suoritetaan turvallisessa ympäristössä:
- Syntaksivirheet kaapataan ja kirjataan lokiin; skripti ohitetaan.
- Virheelliset kenttäarvot (esim. olematon tilan nimi) ohitetaan.
- Timeoutit (10 sekuntia) estävät loputtomia silmukoita.
- Virheet eivät leviä muihin sääntöihin tai järjestelmäkomponentteihin.
Parhaat käytännöt:
// Tarkista null/undefined ennen ominaisuuksien käyttöä
if (ticket.customer && ticket.customer.email) {
// Turvallista käyttää ticket.customer.email
}
if (message) {
// Turvallista käyttää message-ominaisuuksia
}
// Käytä try-catch monimutkaiselle logiikalle
try {
var data = JSON.parse(ticket.custom_json);
ticket.parsed_field = data.value;
} catch (e) {
// Käsittele virhe armollisesti
}
Rajoitukset
- Suoritus-timeout: Skriptit lopetetaan 10 sekunnin jälkeen.
- Ei tiedostojärjestelmäpääsyä: Tiedostotoiminnot eivät ole saatavilla.
- Ei pysyvää tilaa: Muuttujat eivät säily skriptien suoritusten välillä.
- Vain luku -kentät:
ticket.id,ticket.subject,ticket.customerei voida muokata. - ES5 JavaScript: Modernit JavaScript-ominaisuudet (nuolifunktiot, const/let jne.) eivät ehkä ole saatavilla.