Skip to main content

ข้อมูลอ้างอิงสคริปต์

เอกสารนี้ให้ข้อมูลอ้างอิงที่ครอบคลุมสำหรับการเขียนสคริปต์ในกฎเวิร์กโฟลว์ สคริปต์ช่วยให้คุณสามารถนำตรรกะระบบอัตโนมัติขั้นสูงมาใช้โดยใช้ JavaScript


ภาพรวม​

การกระทำRun Scriptในกฎเวิร์กโฟลว์ดำเนินการโค้ด JavaScript เพื่อทำสถานการณ์การจัดการตั๋วที่ซับซ้อนให้เป็นอัตโนมัติ สคริปต์ทำงานในสภาพแวดล้อม sandbox โดยมีการเข้าถึงข้อมูลตั๋ว บริบทข้อความ และฟังก์ชันช่วยเหลือ

ฟีเจอร์หลัก:

  • อ่านและแก้ไขคุณสมบัติตั๋ว
  • เข้าถึงข้อมูลลูกค้าและเจ้าของ
  • ทำงานกับฟิลด์กำหนดเอง
  • ใช้ตรรกะเงื่อนไขและลูป
  • หมดเวลาการดำเนินการ 10 วินาทีเพื่อความปลอดภัย

อ็อบเจ็กต์ตั๋ว​

อ็อบเจ็กต์ ticket เป็นบริบทหลักสำหรับสคริปต์ของคุณ มันให้การเข้าถึงทั้งการอ่านและเขียนข้อมูลตั๋ว

คุณสมบัติแบบอ่านอย่างเดียว​

// ข้อมูลตั๋วพื้นฐาน
ticket.id // สตริง UUID
ticket.subject // บรรทัดหัวเรื่องตั๋ว

// สถานะปัจจุบัน (อ็อบเจ็กต์)
ticket.status.id // UUID สถานะ
ticket.status.code // รหัสสถานะ (เช่น "open", "closed")
ticket.status.name // ชื่อแสดงสถานะ

// ลำดับความสำคัญปัจจุบัน (อ็อบเจ็กต์)
ticket.priority.id // UUID ลำดับความสำคัญ
ticket.priority.name // ชื่อแสดงลำดับความสำคัญ

// แผนกปัจจุบัน (อ็อบเจ็กต์)
ticket.department.id // UUID แผนก
ticket.department.name // ชื่อแสดงแผนก

// เจ้าของที่ได้รับมอบหมาย (อ็อบเจ็กต์ อาจไม่ได้กำหนด)
ticket.owner.id // UUID ผู้ใช้
ticket.owner.email // อีเมลผู้ใช้
ticket.owner.firstname // ชื่อผู้ใช้
ticket.owner.lastname // นามสกุลผู้ใช้

// ข้อมูลลูกค้า (อ็อบเจ็กต์)
ticket.customer.id // UUID ลูกค้า
ticket.customer.email // อีเมลลูกค้า
ticket.customer.firstname // ชื่อลูกค้า
ticket.customer.lastname // นามสกุลลูกค้า
ticket.customer.name // ชื่อเต็มลูกค้า

// โฟลเดอร์และแท็ก
ticket.folder // โฟลเดอร์ปัจจุบัน: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE"
ticket.tags // อาร์เรย์ของสตริงแท็ก

คุณสมบัติที่เขียนได้​

คุณสามารถแก้ไขคุณสมบัติเหล่านี้โดยการกำหนดโดยตรง:

// ตั้งค่าสถานะตามรหัสหรือ ID
ticket.status = "closed";
ticket.status = "550e8400-e29b-41d4-a716-446655440000";

// ตั้งค่าลำดับความสำคัญตามชื่อหรือ ID
ticket.priority = "High";
ticket.priority = "550e8400-e29b-41d4-a716-446655440001";

// ตั้งค่าแผนกตามชื่อหรือ ID
ticket.department = "Sales";
ticket.department = "550e8400-e29b-41d4-a716-446655440002";

// ตั้งค่าเจ้าของตามอีเมลหรือ ID
ticket.owner = "[email protected]";
ticket.owner = "550e8400-e29b-41d4-a716-446655440003";

// ตั้งค่าโฟลเดอร์
ticket.folder = "ASSIGNED";
ticket.folder = "SPAM";
ticket.folder = "ARCHIVE";
ticket.folder = "INBOX";

// ตั้งค่าแท็ก (แทนที่แท็กที่มีอยู่ทั้งหมด)
ticket.tags = ["urgent", "vip"];

ฟิลด์กำหนดเอง​

ฟิลด์กำหนดเองสามารถอ่านและเขียนได้โดยใช้รหัสของพวกเขา (ไม่ใช่ชื่อที่แสดง)

การอ่านฟิลด์กำหนดเอง​

// เข้าถึงค่าฟิลด์กำหนดเองโดยตรง
var orderId = ticket.order_id; // ฟิลด์ข้อความ
var amount = ticket.order_amount; // ฟิลด์ตัวเลข
var isVip = ticket.is_vip; // ฟิลด์บูลีน
var region = ticket.region; // ฟิลด์เลือก

การเขียนฟิลด์กำหนดเอง​

// ตั้งค่าฟิลด์กำหนดเองข้อความ
ticket.order_id = "ORD-12345";

// ตั้งค่าฟิลด์กำหนดเองตัวเลข
ticket.order_amount = 199.99;

// ตั้งค่าฟิลด์กำหนดเองบูลีน
ticket.is_vip = true;

// ตั้งค่าฟิลด์กำหนดเองเลือก
ticket.category = "billing";

// ตั้งค่าฟิลด์กำหนดเองวันที่ (รูปแบบ ISO 8601)
ticket.due_date = "2024-12-31T23:59:59Z";
ticket.due_date = "2024-12-31";

อ็อบเจ็กต์ข้อความ​

อ็อบเจ็กต์ message พร้อมใช้งานเมื่อกฎถูกทริกเกอร์โดยเหตุการณ์ข้อความ (New Customer Reply, New Staff Reply เป็นต้น)

if (message) {
message.id // UUID ข้อความ
message.body_text // เนื้อหาข้อความ (ข้อความธรรมดา)
message.body_html // เนื้อหาข้อความ (HTML)
message.createdAt // ประทับเวลา ISO 8601
}

ตัวอย่าง:

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

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

ฟังก์ชันช่วยเหลือ​

getStatuses()​

คืนค่าอาร์เรย์ของสถานะที่มีทั้งหมด

var statuses = getStatuses();
// คืนค่า: [{ id: "...", code: "open", name: "Open" }, ...]

// ค้นหาสถานะเฉพาะ
for (var i = 0; i < statuses.length; i++) {
if (statuses[i].code === "pending") {
ticket.status = statuses[i].id;
break;
}
}

getPriorities()​

คืนค่าอาร์เรย์ของลำดับความสำคัญที่มีทั้งหมด

var priorities = getPriorities();
// คืนค่า: [{ id: "...", name: "Low" }, { id: "...", name: "High" }, ...]

getDepartments()​

คืนค่าอาร์เรย์ของแผนกที่มีทั้งหมด

var departments = getDepartments();
// คืนค่า: [{ id: "...", name: "Support" }, { id: "...", name: "Sales" }, ...]

getUsers()​

คืนค่าอาร์เรย์ของผู้ใช้ (เจ้าหน้าที่) ที่มีทั้งหมด

var users = getUsers();
// คืนค่า: [{ id: "...", email: "[email protected]", firstname: "John", lastname: "Doe" }, ...]

fetch()​

ทำคำขอ HTTP ไปยัง API ภายนอก แบบซิงโครนัส - คืนค่าผลลัพธ์โดยตรง

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

ตัวเลือก: method (GET/POST/PUT/DELETE), headers (อ็อบเจ็กต์), body (สตริงหรืออ็อบเจ็กต์)

ตัวอย่าง: ดึงข้อมูลจาก CRM และอัปเดตฟิลด์กำหนดเอง

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

ตัวอย่าง: POST ไปยัง webhook

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

หมายเหตุ: HTTPS เท่านั้น, หมดเวลา 5 วินาที, จำกัดการตอบสนอง 1MB, เครือข่ายภายในถูกบล็อก


รูปแบบทั่วไป​

การกำหนดเงื่อนไข​

// ตั้งค่าลำดับความสำคัญตามหัวเรื่อง
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
} else if (ticket.subject.toLowerCase().includes("question")) {
ticket.priority = "Low";
}

การกำหนดเส้นทางแผนก​

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

ตรรกะตามโดเมนลูกค้า​

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

// การจัดการลูกค้าองค์กร
if (domain === "bigcorp.com" || domain === "enterprise.org") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.is_enterprise = true;
}

// สถาบันการศึกษา
if (domain.endsWith(".edu")) {
ticket.segment = "education";
}
}

การจัดการแท็ก​

// เพิ่มแท็กโดยไม่สูญเสียแท็กที่มีอยู่
var existingTags = ticket.tags || [];
existingTags.push("processed");
existingTags.push("automated");
ticket.tags = existingTags;

การทำงานกับข้อความ​

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

// ตรวจจับคำหลักแสดงความหงุดหงิด
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;
}
}
}

การกำหนดแบบหมุนเวียน​

var users = getUsers();
if (users.length > 0) {
// การกำหนดแบบหมุนเวียนอย่างง่ายตามแฮช ID ตั๋ว
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;
}

การจัดการข้อผิดพลาด​

สคริปต์ถูกดำเนินการในสภาพแวดล้อมที่ปลอดภัย:

  • ข้อผิดพลาดไวยากรณ์ ถูกจับและบันทึก; สคริปต์จะถูกข้าม
  • ค่าฟิลด์ที่ไม่ถูกต้อง (เช่น ชื่อสถานะที่ไม่มีอยู่) จะถูกเพิกเฉย
  • หมดเวลา (10 วินาที) ป้องกันลูปไม่สิ้นสุด
  • ข้อผิดพลาดไม่แพร่กระจาย ไปยังกฎอื่นหรือส่วนประกอบระบบ

แนวปฏิบัติที่ดีที่สุด:

// ตรวจสอบ null/undefined ก่อนเข้าถึงคุณสมบัติ
if (ticket.customer && ticket.customer.email) {
// ปลอดภัยที่จะเข้าถึง ticket.customer.email
}

if (message) {
// ปลอดภัยที่จะเข้าถึงคุณสมบัติข้อความ
}

// ใช้ try-catch สำหรับตรรกะที่ซับซ้อน
try {
var data = JSON.parse(ticket.custom_json);
ticket.parsed_field = data.value;
} catch (e) {
// จัดการข้อผิดพลาดอย่างสงบ
}

ข้อจำกัด​

  • หมดเวลาการดำเนินการ: สคริปต์ถูกยุติหลังจาก 10 วินาที
  • ไม่มีการเข้าถึงระบบไฟล์: การดำเนินการไฟล์ไม่พร้อมใช้งาน
  • ไม่มีสถานะถาวร: ตัวแปรไม่คงอยู่ระหว่างการดำเนินการสคริปต์
  • ฟิลด์แบบอ่านอย่างเดียว: ticket.id, ticket.subject, ticket.customer ไม่สามารถแก้ไขได้
  • JavaScript ES5: ฟีเจอร์ JavaScript สมัยใหม่ (arrow functions, const/let เป็นต้น) อาจไม่พร้อมใช้งาน