Kirim WhatsApp Otomatis dari Google Sheets via BalesOtomatis.id

🧩 Apa yang Akan Kamu Buat?

Kamu akan membuat sistem yang bisa:

  • Baca data dari Google Sheets

  • Kirim pesan WhatsApp otomatis lewat BalesOtomatis.id

  • Tandai status 'SENT' agar tidak terkirim dua kali

Semua ini cukup kamu setup sekali saja, dan akan berjalan otomatis πŸ’‘


βœ… Langkah 1: Buat Google Sheets-nya

  1. Buka Google Sheets: https://sheets.new

  2. Buat kolom seperti ini (baris pertama = header):

col_1
col_2
col_3
phone_no
status

Andi

Produk ABC

2 Hari

6281234567890

phone_no = nomor WhatsApp tujuan status = nanti diisi otomatis kalau sudah terkirim


βœ… Langkah 2: Buka Google Apps Script

  1. Di menu atas Google Sheets, klik: Extensions β†’ Apps Script

  2. Ganti nama project jadi misalnya: WA Sender

  3. Hapus semua isi default

  4. Copy-paste kode di bawah ini:

function sendPersonalMessages() {
  // === KONFIGURASI UTAMA ===
  const CONFIG = {
    sheetName: "Sheet1", // Nama sheet
    phoneColumnName: "phone_no", // Kolom nomor HP
    messageTemplate: "Halo {{col_1}}, pesanan {{col_2}} Anda akan sampai dalam {{col_3}}. Terima kasih πŸ™",
    api_key: "YOUR-API-KEY",
    number_id: "YOUR-NUMBER-ID",
    enable_typing: "1",
    method_send: "async", // async / sync
    country_code: "62",
    minPhoneLength: 10 // validasi dasar nomor HP
  };
  // ==========================

  try {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(CONFIG.sheetName);
    if (!sheet) throw new Error(`Sheet '${CONFIG.sheetName}' tidak ditemukan`);

    const data = sheet.getDataRange().getValues();
    if (data.length < 2) throw new Error(`Sheet '${CONFIG.sheetName}' tidak memiliki data`);

    const headers = data[0];
    const rows = data.slice(1);
    const phoneIndex = headers.indexOf(CONFIG.phoneColumnName);

    if (phoneIndex === -1) {
      throw new Error(`Kolom '${CONFIG.phoneColumnName}' tidak ditemukan di header`);
    }

    rows.forEach((row, rowIndex) => {
      const actualRow = rowIndex + 2; // index baris untuk log (karena mulai dari baris 2 di spreadsheet)

      // Lewati baris kosong
      if (row.every(cell => cell === "")) {
        Logger.log(`Baris ${actualRow} dilewati (kosong)`);
        return;
      }

      const phoneNo = row[phoneIndex];
      if (!phoneNo || phoneNo.toString().length < CONFIG.minPhoneLength) {
        Logger.log(`Baris ${actualRow} dilewati (nomor HP tidak valid: '${phoneNo}')`);
        return;
      }

      // Bangun data placeholder
      const rowData = {};
      headers.forEach((col, i) => {
        rowData[`{{${col}}}`] = row[i] || "";
      });

      // Gantikan semua placeholder
      let finalMessage = CONFIG.messageTemplate;
      Object.entries(rowData).forEach(([placeholder, value]) => {
        finalMessage = finalMessage.replaceAll(placeholder, value.toString());
      });

      // Siapkan payload
      const payload = {
        api_key: CONFIG.api_key,
        number_id: CONFIG.number_id,
        enable_typing: CONFIG.enable_typing,
        method_send: CONFIG.method_send,
        phone_no: phoneNo.toString(),
        country_code: CONFIG.country_code,
        message: finalMessage
      };

      const options = {
        method: "post",
        contentType: "application/json",
        payload: JSON.stringify(payload),
        muteHttpExceptions: true
      };

      try {
        const response = UrlFetchApp.fetch("https://api.balesotomatis.id/public/v1/send_personal_message", options);
        const code = response.getResponseCode();
        const result = response.getContentText();

        if (code >= 200 && code < 300) {
          Logger.log(`βœ… Baris ${actualRow} sukses kirim ke ${phoneNo}:\n${result}`);
        } else {
          Logger.log(`❌ Baris ${actualRow} GAGAL kirim (status ${code}):\n${result}`);
        }
      } catch (e) {
        Logger.log(`❌ Baris ${actualRow} ERROR saat mengirim: ${e.message}`);
      }
    });

  } catch (globalError) {
    Logger.log("πŸ’₯ ERROR GLOBAL: " + globalError.message);
  }
}

βœ… Langkah 3: Isi API Key dan Info Lain

Ganti bagian ini di atas script:

  api_key: "ISI_API_KEY_KAMU",
  number_id: "ISI_NUMBER_ID_KAMU",

Kamu bisa ambil api_key dan number_id dari dashboard akun BalesOtomatis.id.


βœ… Langkah 4: Jalankan Manual Pertama Kali

  1. Klik tombol ▢️ (Run) di toolbar

  2. Pilih sendLatestRowIfNotSent

  3. Authorize akses jika diminta

  4. Lihat tab β€œLogs” β†’ View > Logs untuk hasil kirim


βœ… Langkah 5: Otomatisasi Kirim Tiap 5 Menit

  1. Klik ikon ⏰ "Triggers" (atau menu Triggers)

  2. Klik tombol + Add Trigger

  3. Atur:

    • Function: sendLatestRowIfNotSent

    • Event source: Time-driven

    • Type: Every 5 minutes

Sistem sekarang akan jalan sendiri tiap 5 menit! πŸͺ„


🟒 HASILNYA:

  • Kamu cukup tambahkan baris baru di Google Sheets

  • Sistem otomatis kirim pesan via BalesOtomatis.id

  • Baris yang sukses akan ditandai SENT agar tidak dobel

Last updated