ศูนย์ช่วยเหลือ KWIGA บริการ การผสานรวม API การตั้งค่า บริการ การส่งออกข้อมูลไปยัง Google Sheets

การส่งออกข้อมูลไปยัง Google Sheets

บทความ:

เราจะแสดงวิธีตั้งค่าการส่งออกข้อมูลอัตโนมัติจาก Kwiga ไปยัง Google Sheets


คุณสามารถตั้งค่าการส่งออกข้อมูลสำหรับเหตุการณ์ต่างๆ โดยใช้ระบบอัตโนมัติ (คุณสามารถระบุการเพิ่มผู้ติดต่อ การเพิ่มแท็ก การซื้อสำเร็จหรือล้มเหลว เป็นต้น เป็นเหตุการณ์ได้ โดยมีรายการเหตุการณ์ทั้งหมดอยู่ ในบทความ).

นอกจากนี้ คุณยังสามารถใช้ตัวเลือกเพื่อส่ง webhook เมื่อใช้วิดเจ็ตได้ โดยเวิร์กโฟลว์ยังคงเหมือนเดิม

ขั้นตอนหลัก:

  1. สร้างไฟล์และเพิ่มสคริปต์ลงในไฟล์

  2. สร้างเว็บแอปและรับลิงก์สำหรับส่ง webhook

  3. ตั้งค่าการส่ง webhook โดยใช้ระบบอัตโนมัติใน Kwiga หรือการส่งแบบฟอร์มในวิดเจ็ต

กระบวนการทั้งหมดแสดงอยู่ในวิดีโอและ ไม่ จำเป็นต้องมีความรู้ด้านการเขียนโปรแกรม เพียงทำตามขั้นตอนที่ระบุไว้ และหากมีบางอย่างใช้งานไม่ได้ โปรดติดต่อฝ่ายสนับสนุน

 

ขั้นตอนที่ 1: สร้างไฟล์ที่จะรับข้อมูลจาก Kwiga

เปิด Google Sheets และสร้างไฟล์ใหม่ จากนั้นเปิดตัวแก้ไขสคริปต์

หน้าต่างใหม่จะเปิดขึ้น และคุณต้องวางสคริปต์ลงในตัวแก้ไข คุณสามารถดาวน์โหลดสคริปต์ได้ ผ่านลิงก์ (หรือคัดลอกข้อความที่ด้านล่างของบทความ) คุณต้องลบข้อความทั้งหมดที่มีอยู่ในตัวแก้ไขออก

ผลลัพธ์สุดท้าย:

ขั้นตอนที่ 2: สร้างเว็บแอปและรับลิงก์สำหรับส่ง webhook

ในตัวแก้ไขสคริปต์เดียวกัน ให้ค้นหาปุ่ม Deploy แล้วเลือก New deployment

เลือก Web app เป็นประเภท และในรายการแบบเลื่อนลง Who has access ให้ตั้งค่าเป็น Everyone จากนั้นคลิก Deploy

ผลลัพธ์คือ คุณจะได้รับ Web App URL ซึ่งจากนั้นคุณต้องเพิ่มใน Kwiga

 

ขั้นตอนที่ 3: ตั้งค่าการส่งข้อมูลใน Kwiga

คลิกปุ่ม All solutions ในเมนูด้านบน แล้วเลือก Automation สร้างทริกเกอร์ใหม่และเลือกเหตุการณ์ที่จะเริ่มระบบอัตโนมัติ ซึ่งอาจเป็นการเพิ่มผู้ติดต่อ การเพิ่มแท็ก การชำระเงิน หรือเหตุการณ์อื่นใด

หลังจากนั้น เลื่อนลงและเลือก Webhook - Send data ในส่วนการดำเนินการ ในช่องลิงก์ ให้ระบุ Web App URL ประเภทคำขอ POST และเลือกฟิลด์ที่ควรส่งออกไปยังตาราง

บันทึก แล้วทุกขั้นตอนก็เสร็จสมบูรณ์

 

หรือคุณสามารถตั้งค่าการส่ง webhook จากวิดเจ็ตได้ ซึ่งใช้ได้เมื่อใช้องค์ประกอบ Form เลือกตัวเลือก Additionally send to a third-party service จากนั้นในแบบฟอร์มที่เปิดขึ้น ให้เพิ่มลิงก์ ประเภทคำขอ POST และเลือกพารามิเตอร์ที่จะส่ง รายการนี้จะแสดงเฉพาะพารามิเตอร์ที่มีอยู่ในแบบฟอร์ม (วิดเจ็ตนี้) เท่านั้น

 

สคริปต์ Google Sheets สำหรับเว็บฮุคทำงานอย่างไร

  • ในการเรียกเว็บฮุคครั้งแรก ส่วนหัวตารางจะถูกสร้างโดยอัตโนมัติตามคีย์ของข้อมูลขาเข้า
  • หากตารางมีส่วนหัวอยู่แล้วและคุณต้องการเริ่มรับฟิลด์ข้อมูลใหม่ ให้เพิ่มส่วนหัวเหล่านี้ลงในตารางด้วยตนเอง
  • สามารถจัดเรียงส่วนหัวใหม่ในตารางได้ — สคริปต์จะระบุตำแหน่งของส่วนหัวโดยอัตโนมัติ
  • โดยค่าเริ่มต้น สคริปต์จะเพิ่มรายการใหม่ทุกครั้งที่ได้รับเว็บฮุค
  • หากคุณระบุฟิลด์ใน keyColumns สคริปต์จะอัปเดตระเบียนที่มีอยู่หรือเพิ่มระเบียนใหม่หากไม่พบรายการที่ตรงกัน
  • ⚠️ สำคัญ: หลังจากแก้ไขสคริปต์ คุณต้องปรับใช้สคริปต์อีกครั้งใน Google Apps Script และอัปเดตลิงก์เว็บฮุค

การเลือกชีต:

  • โดยค่าเริ่มต้น จะใช้ชีตที่ใช้งานอยู่
  • สามารถแทนที่ได้ผ่านพารามิเตอร์ของเว็บฮุค:
  • "sheet_name": "ชื่อชีต" - เพื่อเลือกชีตตามชื่อ
  • "sheet_index": 2 - เพื่อเลือกชีตตามหมายเลข (เริ่มจาก 1)
// ============================================================
// การตั้งค่าสคริปต์
// ============================================================

// การตรวจสอบรายการซ้ำ - ระบุฟิลด์เพื่อค้นหาระเบียนที่มีอยู่
// ตัวอย่างการใช้งาน:
// var keyColumns = ["email"];           - ตรวจสอบด้วยอีเมล
// var keyColumns = ["order_id"];        - ตรวจสอบด้วยรหัสคำสั่งซื้อ
// var keyColumns = ["email", "order_id"];  - ตรวจสอบด้วยหลายฟิลด์
var keyColumns = []; // ปิดใช้งานการตรวจสอบรายการซ้ำ

// ============================================================

// ฟังก์ชันสำหรับส่งการตอบกลับ
function sendResponse(success, message) {
    var response = {
        "status": success ? "success" : "error",
        "message": message
    };
    return ContentService.createTextOutput(JSON.stringify(response))
        .setMimeType(ContentService.MimeType.JSON);
}

// กำลังดึงชีตปลายทางสำหรับเขียนข้อมูล
function getTargetSheet(hook_data) {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

    // กำลังตรวจสอบว่ามีการระบุชื่อหน้าไว้หรือไม่
    if (hook_data && hook_data.sheet_name) {
        try {
            var sheet = spreadsheet.getSheetByName(hook_data.sheet_name);
            if (sheet) {
                return sheet;
            }
        } catch (error) {
            // ไม่พบหน้า
        }
    }

    // กำลังตรวจสอบว่ามีการระบุหมายเลขหน้าไว้หรือไม่
    if (hook_data && hook_data.sheet_index && !isNaN(hook_data.sheet_index)) {
        try {
            var sheets = spreadsheet.getSheets();
            var index = parseInt(hook_data.sheet_index) - 1; // กำลังแปลงเป็นดัชนีโดยเริ่มจาก 0
            if (index >= 0 && index < sheets.length) {
                return sheets[index];
            }
        } catch (error) {
            // ดัชนีหน้าไม่ถูกต้อง
        }
    }

    // โดยค่าเริ่มต้น ให้ใช้หน้าที่ใช้งานอยู่
    return SpreadsheetApp.getActiveSheet();
}

// สร้างส่วนหัวในตารางตามข้อมูลที่ระบุ
function populateHeaders(hook_data, sheet) {
    if (!hook_data || typeof hook_data !== 'object') {
        return false;
    }

    if (!sheet) {
        sheet = getTargetSheet(hook_data);
    }
    var last_row = Math.max(sheet.getLastRow(), 1);
    sheet.insertRowAfter(last_row);

    var headers_row = ['timestamp'];
    var hook_data_keys = Object.keys(hook_data);

    for (var i = 0; i < hook_data_keys.length; i++) {
        headers_row.push(hook_data_keys[i]);
    }

    sheet.appendRow(headers_row);
    SpreadsheetApp.flush();
    return true;
}

// กำลังประมวลผลเว็บฮุคขาเข้า
function doPost(e) {
    var hook_load = null;

    // กำลังตรวจสอบข้อมูล POST
    if (!e || !e.postData || !e.postData.contents) {
        return sendResponse(false, "ไม่มีข้อมูลให้ประมวลผล");
    }

    // กำลังแยกวิเคราะห์ข้อมูล JSON
    try {
        hook_load = JSON.parse(e.postData.contents);
    } catch (error) {
        return sendResponse(false, "เกิดข้อผิดพลาดในการแยกวิเคราะห์ข้อมูล JSON");
    }

    // การตรวจสอบข้อมูลที่ได้รับ
    if (!hook_load || typeof hook_load !== 'object' || Object.keys(hook_load).length === 0) {
        return sendResponse(false, "ได้รับข้อมูลที่ไม่ถูกต้องหรือว่างเปล่า");
    }

    try {
        // กำลังรับหน้าปลายทาง
        var sheet = getTargetSheet(hook_load);
        if (!sheet) {
            return sendResponse(false, "ไม่พบหน้าที่ระบุ");
        }

        // กำลังสร้างส่วนหัวหากตารางว่าง
        if (sheet.getLastColumn() === 0) {
            populateHeaders(hook_load, sheet);
        }

        var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];

        if (headers.length === 0 || headers[0] === "") {
            populateHeaders(hook_load, sheet);
            headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
        }

        // การตรวจสอบรายการซ้ำ
        var data = [];
        var targetRow = -1;
        var numRows = sheet.getLastRow() - 1;

        if (keyColumns.length > 0 && numRows > 0) {
            data = sheet.getRange(2, 1, numRows, sheet.getLastColumn()).getValues();

            for (var r = 0; r < data.length; r++) {
                var row = data[r];
                var match = true;

                for (var k = 0; k < keyColumns.length; k++) {
                    var key = keyColumns[k];
                    var idx = headers.indexOf(key);
                    if (idx === -1 || row[idx] != hook_load[key]) {
                        match = false;
                        break;
                    }
                }

                if (match) {
                    targetRow = r + 2; // ส่วนหัวบัญชี
                    break;
                }
            }
        }

        // กำลังเตรียมข้อมูลสำหรับการป้อน
        var new_sheet_row = new Array(headers.length).fill('');
        for (var h = 0; h < headers.length; h++) {
            var key = headers[h];
            if (key === 'timestamp') {
                new_sheet_row[h] = new Date();
            } else if (hook_load.hasOwnProperty(key)) {
                new_sheet_row[h] = hook_load[key];
            }
        }

        // กำลังบันทึกข้อมูลลงในตาราง
        if (targetRow > -1) {
            sheet.getRange(targetRow, 1, 1, new_sheet_row.length).setValues([new_sheet_row]);
        } else {
            sheet.appendRow(new_sheet_row);
        }

        SpreadsheetApp.flush();

        return sendResponse(true, "บันทึกข้อมูลเรียบร้อยแล้ว");

    } catch (error) {
        return sendResponse(false, "เกิดข้อผิดพลาดในการบันทึกข้อมูล: " + error.message);
    }
}