Google Apps Script

Webhook Google Sheets: Nhận Dữ Liệu Từ Form, Zalo OA, Facebook

Tuân HoangTuân Hoang
1 tháng 5, 2026
Cập nhật: 8 tháng 10, 2026
5 phút đọc
Ảnh minh họa bài viết: Webhook Google Sheets: Nhận Dữ Liệu Từ Form, Zalo OA, Facebook

Trả lời nhanh: Viết hàm doPost(e) trong Apps Script để đọc dữ liệu JSON gửi đến và ghi vào sheet bằng appendRow, sau đó Deploy dạng Web App (quyền truy cập: Anyone) để lấy URL. Dán URL đó vào phần cấu hình webhook của form, Zalo OA hoặc công cụ chuyển lead Facebook là dữ liệu tự chảy vào Google Sheets, không cần server riêng.

Webhook Là Gì Và Tại Sao Dùng Google Apps Script?

Webhook là cơ chế một ứng dụng tự động gửi dữ liệu đến URL khác khi có sự kiện xảy ra. Google Apps Script cho phép tạo Web App (URL endpoint) để nhận webhook mà không cần server riêng — hoàn toàn miễn phí và không cần kiến thức backend phức tạp.

Tạo Webhook Endpoint Với Apps Script

// doPost: xử lý POST request (webhook)
function doPost(e) {
  try {
    const data = JSON.parse(e.postData.contents);
    const sheet = SpreadsheetApp.getActiveSpreadsheet()
      .getSheetByName('WebhookData');

    // Thêm dữ liệu vào Google Sheets
    sheet.appendRow([
      new Date(),          // Timestamp
      data.source || '',   // Nguồn (zalo/facebook/form)
      data.name || '',     // Tên khách hàng
      data.phone || '',    // Số điện thoại
      data.email || '',    // Email
      data.message || '',  // Nội dung
      JSON.stringify(data) // Raw data
    ]);

    // Trả về response thành công
    return ContentService
      .createTextOutput(JSON.stringify({ status: 'ok', message: 'Data received' }))
      .setMimeType(ContentService.MimeType.JSON);

  } catch (err) {
    return ContentService
      .createTextOutput(JSON.stringify({ status: 'error', message: err.toString() }))
      .setMimeType(ContentService.MimeType.JSON);
  }
}

// doGet: để test webhook bằng browser
function doGet(e) {
  return ContentService
    .createTextOutput('Webhook is running!')
    .setMimeType(ContentService.MimeType.TEXT);
}

Deploy Webhook Trên Apps Script

  1. Vào Extensions → Apps Script
  2. Paste code trên vào editor
  3. Click Deploy → New deployment
  4. Type: Web app
  5. Execute as: Me
  6. Who has access: Anyone
  7. Copy URL webhook

Nhận Dữ Liệu Từ Zalo OA

// Xử lý payload từ Zalo OA webhook
function processZaloPayload(data) {
  // Zalo gửi event khi user nhắn tin OA
  if (data.event_name === 'user_send_text') {
    const userId = data.sender.id;
    const message = data.message.text;
    const timestamp = new Date(data.timestamp);

    return {
      source: 'zalo_oa',
      userId: userId,
      message: message,
      timestamp: timestamp
    };
  }

  // Zalo Form submission
  if (data.event_name === 'form_submit') {
    return {
      source: 'zalo_form',
      name: data.info.name,
      phone: data.info.phone,
      message: JSON.stringify(data.info)
    };
  }
}

Nhận Lead Từ Facebook Lead Ads

// Facebook gửi leadgen webhook
function processFacebookLead(data) {
  const entry = data.entry[0];
  const changes = entry.changes[0];

  if (changes.field === 'leadgen') {
    const leadId = changes.value.leadgen_id;
    const formId = changes.value.form_id;

    // Fetch chi tiết lead từ Graph API
    const accessToken = PropertiesService.getScriptProperties()
      .getProperty('FB_ACCESS_TOKEN');

    const leadData = JSON.parse(UrlFetchApp.fetch(
      `https://graph.facebook.com/${leadId}?access_token=${accessToken}`
    ).getContentText());

    // Parse field_data
    const fields = {};
    leadData.field_data.forEach(f => {
      fields[f.name] = f.values[0];
    });

    return {
      source: 'facebook_lead',
      name: fields['full_name'] || fields['name'] || '',
      phone: fields['phone_number'] || '',
      email: fields['email'] || '',
      message: JSON.stringify(fields)
    };
  }
}

Thông Báo Realtime Khi Có Lead Mới

function notifyNewLead(leadData) {
  const salesTeamEmail = 'sales@company.com';

  GmailApp.sendEmail(
    salesTeamEmail,
    `🔔 Lead mới từ ${leadData.source}: ${leadData.name}`,
    `Tên: ${leadData.name}
Điện thoại: ${leadData.phone}
Email: ${leadData.email}
Nguồn: ${leadData.source}`
  );
}

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

Tích Hợp Zalo OA Official Account API Chính Thức

Ngoài xử lý payload webhook thủ công ở trên, Zalo OA còn hỗ trợ đăng ký webhook chính thức qua Official Account Manager để nhận sự kiện tin nhắn/follow theo thời gian thực, thay vì phải tự polling:

  1. Vào Official Account Manager → Cài đặt → Webhook
  2. Nhập URL webhook Apps Script đã deploy ở bước trên
  3. Chọn các sự kiện cần lắng nghe: user_send_text, follow, unfollow
  4. Zalo sẽ gửi POST request kèm chữ ký xác thực (signature) trong header — nên validate signature trước khi ghi vào Sheets để tránh giả mạo request

Webhook Apps Script có timeout không?

Có. Apps Script Web App timeout sau 6 phút mỗi lần chạy, áp dụng cho cả tài khoản cá nhân lẫn Google Workspace. Đủ dùng cho hầu hết webhook use case vì mỗi request chỉ mất vài giây.

Có thể nhận nhiều webhook cùng lúc không?

Apps Script xử lý đồng thời được, nhưng có giới hạn concurrent executions (30 cho tài khoản thường). Nếu cần xử lý lượng lớn, nên dùng trigger để xử lý hàng đợi thay vì xử lý realtime.

Dữ liệu webhook có bảo mật không?

URL webhook là public, bất kỳ ai có URL đều có thể gửi data. Để bảo mật, thêm secret token validation: kiểm tra header Authorization hoặc signature trước khi xử lý dữ liệu.

Bài viết liên quan

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