Hướng dẫn

Xây Chatbot Zalo OA Tự Động Từ Dữ Liệu Google Sheets

Tuân HoangTuân Hoang
16 tháng 7, 2026
8 phút đọc
Ảnh minh họa bài viết: Xây Chatbot Zalo OA Tự Động Từ Dữ Liệu Google Sheets

Khách hàng nhắn Zalo OA hỏi giá, hỏi giờ mở cửa, hỏi cách đặt hàng — toàn câu hỏi lặp đi lặp lại mỗi ngày, nhưng bạn chưa muốn trả tiền cho nền tảng chatbot phức tạp?

Bài viết này hướng dẫn dựng một chatbot Zalo OA đơn giản: trả lời tự động dựa trên tra cứu từ khóa, dữ liệu câu hỏi/trả lời lưu ngay trong Google Sheets — không cần nền tảng chatbot trả phí, không cần biết AI/NLP.

Kiến Trúc Tổng Quan: Zalo Webhook → Apps Script → Google Sheets

Trước khi viết code, cần hiểu rõ luồng hoạt động. Đây không phải chatbot AI — nó là một hệ thống tra cứu tự động, hoạt động theo 4 bước:

1. Khách nhắn tin vào Zalo OA

→ 2. Zalo gửi sự kiện webhook đến Apps Script Web App (doPost)

→ 3. Apps Script tra cứu từ khóa trong Google Sheets, tìm câu trả lời khớp nhất

→ 4. Apps Script gọi lại Zalo OA API để gửi câu trả lời cho khách

Ba thành phần chính:

  • Zalo OA + Webhook: Zalo for Business cho phép đăng ký một URL webhook — mỗi khi có tin nhắn đến, Zalo tự động POST dữ liệu tin nhắn đến URL đó.
  • Apps Script Web App: Đóng vai trò "bộ não" trung gian — nhận webhook, xử lý logic, gọi lại Zalo API để phản hồi. Không cần server riêng, deploy miễn phí trong vài phút.
  • Google Sheets: Kho lưu kịch bản chatbot — nơi bạn (hoặc nhân viên không biết code) cập nhật câu hỏi/trả lời bất cứ lúc nào.

Cấu Trúc Google Sheets Lưu Kịch Bản Chatbot

Tạo một sheet tên "Kich_Ban" với 3 cột chính. Cấu trúc càng đơn giản, càng dễ bảo trì:

CộtNội dungVí dụ
Từ khóa kích hoạtCác từ khóa cách nhau bởi dấu phẩy, chatbot sẽ so khớp nếu tin nhắn khách chứa 1 trong các từ nàygiá, bảng giá, chi phí
Câu trả lờiNội dung text trả lời tự độngBảng giá phần mềm từ 299K/tháng, xem chi tiết tại sheet.com.vn/bang-gia
Loại phản hồitext (mặc định) hoặc link (kèm nút bấm mở link)text

Ví dụ vài dòng thực tế trong sheet:

Từ khóa kích hoạtCâu trả lờiLoại phản hồi
giờ mở cửa, giờ làm việcBên mình hỗ trợ khách hàng từ 8h-21h các ngày trong tuần ạ.text
giá, bảng giá, chi phíXem bảng giá chi tiết tại đây nhé:link
hướng dẫn, cách dùngAnh/chị xem hướng dẫn sử dụng tại đây ạ:link
xin chào, hello, hiChào anh/chị! Em có thể hỗ trợ gì về sản phẩm ạ?text

Điểm hay của cách này: nhân viên bán hàng — không cần biết lập trình — có thể tự thêm/sửa dòng bất cứ lúc nào, chatbot cập nhật ngay lập tức mà không cần deploy lại code.

Viết Apps Script Web App Nhận Webhook Từ Zalo

Mở Google Sheets → Extensions → Apps Script, tạo file mới và viết hàm doPost — đây là hàm Apps Script tự động gọi mỗi khi có request POST gửi đến URL Web App:

function doPost(e) {
  const data = JSON.parse(e.postData.contents);

  // Zalo gửi sự kiện dạng { event_name, sender: { id }, message: { text } }
  if (data.event_name !== 'user_send_text') {
    return ContentService.createTextOutput('OK');
  }

  const userId = data.sender.id;
  const userMessage = data.message.text.toLowerCase().trim();

  const reply = timKiemCauTraLoi(userMessage);
  guiTinNhanZalo(userId, reply);

  return ContentService.createTextOutput('OK');
}

Sau khi viết xong, deploy: Deploy → New deployment → chọn "Web app" → Execute as "Me" → Who has access "Anyone". Copy URL vừa tạo, đây chính là webhook URL cần đăng ký trên Zalo OA (mục Cấu hình Webhook trong Zalo for Business).

Logic Tìm Kiếm Từ Khóa Đơn Giản (Không Cần AI/NLP)

Đây là phần cốt lõi — nhưng thực chất rất đơn giản: chỉ là so khớp chuỗi (string matching), không có xử lý ngôn ngữ tự nhiên nào:

function timKiemCauTraLoi(tinNhanKhach) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Kich_Ban');
  const data = sheet.getDataRange().getValues();

  // Bỏ qua hàng tiêu đề (hàng 1)
  for (let i = 1; i < data.length; i++) {
    const tuKhoaList = data[i][0].split(',').map(tk => tk.trim().toLowerCase());
    const cauTraLoi = data[i][1];

    // Kiểm tra xem tin nhắn khách có chứa bất kỳ từ khóa nào không
    const coKhopTuKhoa = tuKhoaList.some(tuKhoa => tinNhanKhach.includes(tuKhoa));

    if (coKhopTuKhoa) {
      return cauTraLoi;
    }
  }

  // Không tìm thấy từ khóa nào khớp — trả lời mặc định
  return 'Cảm ơn anh/chị đã nhắn tin! Nhân viên sẽ phản hồi trong ít phút, hoặc anh/chị có thể hỏi rõ hơn về sản phẩm/giá/hướng dẫn ạ.';
}

Hàm này chỉ làm một việc: duyệt từng dòng trong Sheets, kiểm tra tin nhắn khách có chứa từ khóa nào không, khớp thì trả về câu trả lời tương ứng. Không phân tích ý định (intent), không hiểu đồng nghĩa, không xử lý lỗi chính tả — đây chính là giới hạn cần lưu ý ở phần sau.

Gọi Lại Zalo OA API Để Phản Hồi

Sau khi có câu trả lời, cần gọi Zalo OA Send API để gửi tin nhắn lại cho khách. Cần có Access Token của Zalo OA (lấy từ Zalo for Business, mục API):

function guiTinNhanZalo(userId, noiDung) {
  const ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('ZALO_ACCESS_TOKEN');

  const payload = {
    recipient: { user_id: userId },
    message: { text: noiDung }
  };

  UrlFetchApp.fetch('https://openapi.zalo.me/v3.0/oa/message/cs', {
    method: 'post',
    contentType: 'application/json',
    headers: { access_token: ACCESS_TOKEN },
    payload: JSON.stringify(payload)
  });
}

Lưu Access Token trong Script Properties (Project Settings → Script Properties) thay vì viết thẳng vào code — tránh lộ token khi chia sẻ file. Lưu ý: Access Token của Zalo OA hết hạn sau một khoảng thời gian, cần dùng Refresh Token để lấy token mới định kỳ (xem thêm ở bài Gửi Tin Nhắn Zalo Từ Google Sheets bên dưới về cách quản lý token).

Giới Hạn Của Cách Làm Này — Cần Hiểu Rõ Trước Khi Triển Khai

Đây là phần quan trọng nhất bài viết. Chatbot tra cứu từ khóa không phải giải pháp toàn năng, và việc hiểu rõ giới hạn giúp bạn tránh kỳ vọng sai:

Giới hạnẢnh hưởng thực tế
Không hiểu ngữ nghĩa, chỉ so khớp chuỗi ký tựKhách gõ sai chính tả hoặc diễn đạt khác đi (ví dụ "nhiêu tiền" thay vì "giá") có thể không khớp được từ khóa nào
Không nhớ ngữ cảnh hội thoại trước đóMỗi tin nhắn được xử lý độc lập — không thể trả lời câu hỏi kiểu "còn cái kia thì sao?"
Không xử lý được câu hỏi phức tạp nhiều lớpKhông thể tư vấn, so sánh sản phẩm, hay dẫn dắt khách qua nhiều bước như chatbot bán hàng thực sự
Giới hạn quota Apps ScriptKhoảng 20.000 lượt gọi URL/ngày (tài khoản cá nhân) — đủ cho SME nhưng không phù hợp lưu lượng lớn
Không có analytics/báo cáo hội thoại sẵnMuốn biết khách hỏi gì nhiều nhất, tỉ lệ chatbot trả lời đúng — phải tự làm thêm log riêng

Nói ngắn gọn: cách làm này phù hợp để trả lời FAQ đơn giản, lặp lại — giờ mở cửa, bảng giá, cách đặt hàng, liên hệ hỗ trợ. Nó không thay thế được chatbot AI thực sự hay nhân viên tư vấn.

Khi Nào Nên Nâng Cấp Lên Giải Pháp Chuyên Nghiệp Hơn?

Cân nhắc chuyển sang nền tảng chatbot chuyên dụng (có NLP, tích hợp AI) khi gặp một trong các dấu hiệu sau:

  • Tỉ lệ "không hiểu câu hỏi" cao: Nếu bạn thấy nhiều tin nhắn khách rơi vào câu trả lời mặc định dù nội dung hỏi hợp lý, nghĩa là logic từ khóa đơn giản không còn đáp ứng đủ.
  • Cần xử lý hội thoại nhiều bước: Ví dụ chatbot cần hỏi lại khách "anh muốn xem sản phẩm loại nào?" rồi dẫn dắt tiếp — logic if/else từ khóa sẽ trở nên rối và khó bảo trì.
  • Lượng tin nhắn tăng vượt quota Apps Script: Khi chạy campaign lớn, lưu lượng tin nhắn tăng đột biến, cần hạ tầng ổn định hơn (server riêng, queue xử lý).
  • Cần tích hợp đặt hàng/thanh toán trong hội thoại: Đây là nghiệp vụ phức tạp, nên dùng nền tảng chuyên dụng có sẵn tích hợp thay vì tự viết từ đầu.

Ở giai đoạn đó, nên cân nhắc các nền tảng chatbot chuyên nghiệp có NLP thực sự, hoặc thuê đội phát triển riêng xây dựng theo nhu cầu cụ thể. Cách làm bằng Google Sheets trong bài này phù hợp làm bước khởi đầu chi phí thấp, không phải giải pháp lâu dài cho doanh nghiệp có lượng tương tác lớn.

Câu Hỏi Thường Gặp

Chatbot Zalo OA làm từ Google Sheets có phải là AI không?

Không. Đây là chatbot dựa trên tra cứu từ khóa đơn giản, không hiểu ngữ nghĩa, không phải trí tuệ nhân tạo thực sự.

Cách này có tốn phí không?

Gần như miễn phí — chỉ tốn thời gian thiết lập, không cần trả phí nền tảng chatbot bên thứ ba.

Chatbot kiểu này xử lý được bao nhiêu tin nhắn cùng lúc?

Khoảng 20.000 lượt gọi URL/ngày với tài khoản cá nhân — đủ cho SME, cần cân nhắc hạ tầng khác nếu lưu lượng lớn.

Khi nào nên chuyển sang nền tảng chuyên nghiệp?

Khi cần hiểu câu hỏi đa dạng cách diễn đạt, hội thoại nhiều bước, tích hợp thanh toán, hoặc lưu lượng tin nhắn lớn cần độ ổn định cao.

Không muốn tự viết Apps Script từ đầu?

Các phần mềm trên Google Sheets của SheetStore đã có sẵn tính năng tự động hóa tích hợp — không cần code, không cần tự cấu hình webhook.

Xem phần mềm tự động hóa có sẵn →

Chia sẻ bài viết:

Tuân Hoang

Tuân Hoang

Đội ngũ SheetStore

Google SheetsGoogle Apps ScriptCRMAutomationPhần mềm quản lý doanh nghiệp

Google Workspace Certified, 5+ years experience

Bạn thấy bài viết hữu ích?

Đăng ký nhận thông báo khi có bài viết mới.

Nhận thông báo khi có bài viết mới. Không spam, hứa luôn! 😊

Bình luận (0)

Vui lòng đăng nhập để tham gia thảo luận