📌 Hướng dẫn cài đặt Google Sheet (Chống trùng SĐT & chống trùng bài):
Mở Google Sheet của bạn → Chọn menu Tiện ích mở rộng → Apps Script .
Xóa hết nội dung cũ, copy và dán toàn bộ đoạn mã bên dưới vào.
Bấm nút Triển khai → Triển khai mới (hoặc Quản lý bản triển khai).
Chọn loại: Ứng dụng web (Web app) .
Người thực thi (Execute as) : Tôi (Me).
Ai có quyền truy cập (Who has access) : Chọn Bất kỳ ai (Anyone) (BẮT BUỘC để không bị lỗi HTTP 403) .
Bấm Triển khai → Cấp quyền truy cập Google Sheet → Copy link Web App dán vào ô bên trên.
📋 Code Apps Script dán vào Sheet:
Copy Code
const SECRET = 'doi-thanh-chuoi-bi-mat';
const SHEET_NAME = 'Leads';
const HEADERS = ['Thời gian', 'Người đăng', 'Link người đăng', 'SĐT', 'Link bài', 'Nội dung bài', 'Comment đã gửi', 'Trạng thái', 'Nguồn'];
function doPost(e) {
try {
const data = JSON.parse(e.postData.contents);
if (data.secret !== SECRET) return out({ ok: false, error: 'bad secret' });
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sh = ss.getSheetByName(SHEET_NAME) || ss.insertSheet(SHEET_NAME);
if (sh.getLastRow() === 0) {
sh.appendRow(HEADERS);
sh.setFrozenRows(1);
}
const row = data.row.map(String);
const phone = (row[3] || '').trim();
const postUrl = (row[4] || '').trim();
let targetRow = -1;
const lastRow = sh.getLastRow();
if (lastRow > 1) {
const dataRange = sh.getRange(2, 1, lastRow - 1, 5).getValues();
for (let i = 0; i < dataRange.length; i++) {
const existPhone = String(dataRange[i][3] || '').trim();
const existUrl = String(dataRange[i][4] || '').trim();
const isSamePhone = phone && phone !== 'Chưa có SĐT' && existPhone && (existPhone === phone || existPhone.includes(phone) || phone.includes(existPhone));
const isSameUrl = postUrl && existUrl && (existUrl === postUrl || existUrl.includes(postUrl) || postUrl.includes(existUrl));
if (isSamePhone || isSameUrl) {
targetRow = i + 2;
break;
}
}
}
if (targetRow > 0) {
// ĐÃ TỒN TẠI → CẬP NHẬT DÒNG CŨ (KHÔNG TẠO DÒNG MỚI)
sh.getRange(targetRow, 1, 1, row.length).setNumberFormat('@').setValues([row]);
return out({ ok: true, action: 'updated', row: targetRow });
} else {
// CHƯA CÓ → TẠO DÒNG MỚI
const newRow = lastRow + 1;
sh.getRange(newRow, 1, 1, row.length).setNumberFormat('@').setValues([row]);
return out({ ok: true, action: 'created', row: newRow });
}
} catch (err) {
return out({ ok: false, error: String(err) });
}
}
function out(obj) {
return ContentService.createTextOutput(JSON.stringify(obj)).setMimeType(ContentService.MimeType.JSON);
}