Panduan Membuat Bot Telegram ke Google Sheets Untuk Laporan Keuangan

Membuat bot Telegram yang terintegrasi dengan Google Sheets untuk pencatatan keuangan adalah langkah yang sangat cerdas. Anda bisa mencatat pengeluaran/pemasukan langsung lewat chat, dan bot akan otomatis mengisinya ke pembukuan Anda.

Berikut adalah panduan step-by-step lengkap, mulai dari persiapan hingga kodingannya. Kita akan menggunakan Google Apps Script (gratis dan tidak perlu hosting tambahan).

Step 1: Siapkan Google Sheets

  1. Buat Spreadsheet baru di Google Drive Anda.
  2. Beri nama sheet pertama dengan nama Transaksi
  3. Buatlah header di baris pertama dengan kolom berikut:
    • A1: Tanggal
    • B1: Jenis (Pemasukan/Pengeluaran)
    • C1: Nominal
    • D1: Keterangan
💡 PENTING: Salin ID Spreadsheet Anda. ID ini ada di URL browser Anda: https://docs.google.com/spreadsheets/d/[ID_SPREADSHEET_ANDA]/edit

Step 2: Buat Bot Telegram via BotFather

  1. Buka aplikasi Telegram, cari @BotFather.
  2. Kirim perintah /newbot.
  3. Masukkan nama bot Anda (bebas, contoh: Catatan Keuangan Bot).
  4. Masukkan username bot (harus diakhiri dengan kata 'bot', contoh: keuangan_pribadi_bot).
  5. BotFather akan memberikan HTTP API Token. Simpan token ini.

Step 3: Tulis Kodingan di Google Apps Script

  1. Di Google Sheets Anda, klik menu Ekstensi (Extensions) > Apps Script.
  2. Hapus semua kode bawaan yang ada di editor, lalu copy-paste kode di bawah ini:

// Ganti dengan Token Bot Telegram Anda
const TOKEN = "ISI_TOKEN_TELEGRAM_ANDA_DI_SINI"; 
// Ganti dengan ID Google Sheet Anda
const SPREADSHEET_ID = "ISI_ID_SPREADSHEET_ANDA_DI_SINI"; 

function doPost(e) {
  try {
    const data = JSON.parse(e.postData.contents);
    const chatId = data.message.chat.id;
    const text = data.message.text;
    
    const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName("Transaksi");
    
    // Perintah /start
    if (text === "/start") {
      const welcomeMsg = "Halo! Saya Bot Pencatat Keuangan. \n\n" +
                         "**Format Mencatat:**\n" +
                         "Format: `[Jenis] [Nominal] [Keterangan]`\n" +
                         "Contoh: `Pengeluaran 50000 Makan Siang`\n" +
                         "Contoh: `Pemasukan 1500000 Gaji`\n\n" +
                         "**Melihat Laporan:**\n" +
                         "Ketik `/laporan` untuk melihat total bulan ini.";
      sendText(chatId, welcomeMsg);
      return;
    }
    
    // Perintah /laporan
    if (text === "/laporan") {
      const laporan = hitungLaporan(sheet);
      sendText(chatId, laporan);
      return;
    }
    
    // Proses Pencatatan (Parsing teks)
    // Memisah teks berdasarkan spasi
    const parts = text.split(" ");
    
    if (parts.length >= 3) {
      const jenisInput = parts[0].toLowerCase();
      const nominal = parseFloat(parts[1]);
      const keterangan = parts.slice(2).join(" "); // Menggabungkan sisa teks jika keterangan lebih dari 1 kata
      
      let jenis = "";
      if (jenisInput === "pemasukan" || jenisInput === "masuk") {
        jenis = "Pemasukan";
      } else if (jenisInput === "pengeluaran" || jenisInput === "keluar") {
        jenis = "Pengeluaran";
      }
      
      // Validasi input
      if (jenis && !isNaN(nominal)) {
        const waktuSekarang = new Date();
        
        // Input ke Google Sheets [Tanggal, Jenis, Nominal, Keterangan]
        sheet.appendRow([waktuSekarang, jenis, nominal, keterangan]);
        
        sendText(chatId, `✅ **Berhasil dicatat!**\n📅 ${waktuSekarang.toLocaleDateString('id-ID')}\n🔹 ${jenis}: Rp ${nominal.toLocaleString('id-ID')}\n📝 Keterangan: ${keterangan}`);
      } else {
        sendText(chatId, "❌ Format salah atau nominal bukan angka. Contoh: `Pengeluaran 50000 Makan`");
      }
    } else {
      sendText(chatId, "❓ Perintah tidak dikenali. Gunakan format: `Pengeluaran 50000 Makan` atau ketik `/laporan` untuk ringkasan.");
    }
    
  } catch (error) {
    // Jika ada error tidak membuat bot crash
    Logger.log(error.toString());
  }
}

// Fungsi untuk mengirim pesan ke Telegram
function sendText(chatId, text) {
  const url = "https://api.telegram.org/bot" + TOKEN + "/sendMessage";
  const payload = {
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify({
      "chat_id": chatId,
      "text": text,
      "parse_mode": "Markdown"
    })
  };
  UrlFetchApp.fetch(url, payload);
}

// Fungsi untuk menghitung laporan bulanan
function hitungLaporan(sheet) {
  const data = sheet.getDataRange().getValues();
  const bulanSekarang = new Date().getMonth();
  const tahunSekarang = new Date().getFullYear();
  
  let totalPemasukan = 0;
  let totalPengeluaran = 0;
  
  // Looping data dari baris ke-2 (melewati header)
  for (let i = 1; i < data.length; i++) {
    const tgl = new Date(data[i][0]);
    const jenis = data[i][1];
    const nominal = data[i][2];
    
    // Filter berdasarkan bulan dan tahun berjalan
    if (tgl.getMonth() === bulanSekarang && tgl.getFullYear() === tahunSekarang) {
      if (jenis === "Pemasukan") {
        totalPemasukan += nominal;
      } else if (jenis === "Pengeluaran") {
        totalPengeluaran += nominal;
      }
    }
  }
  
  const saldo = totalPemasukan - totalPengeluaran;
  const namaBulan = ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"];
  
  let ringkasan = `📊 **LAPORAN KEUANGAN (${namaBulan[bulanSekarang]} ${tahunSekarang})**\n\n` +
                  `🟢 Pemasukan: Rp ${totalPemasukan.toLocaleString('id-ID')}\n` +
                  `🔴 Pengeluaran: Rp ${totalPengeluaran.toLocaleString('id-ID')}\n` +
                  `──────────────────\n` +
                  `💰 **Sisa Saldo:** Rp ${saldo.toLocaleString('id-ID')}`;
                  
  return ringkasan;
}
  1. Ganti "ISI_TOKEN_TELEGRAM_ANDA_DI_SINI" dengan token dari BotFather.
  2. Ganti "ISI_ID_SPREADSHEET_ANDA_DI_SINI" dengan ID Spreadsheet Anda.
  3. Klik ikon Simpan (Save) (gambar disket).

Step 4: Deploy Kodingan sebagai Web App

Agar Telegram bisa mengirim data ke Google Sheets, kita harus mempublikasikan kode di atas.

  1. Di kanan atas halaman Apps Script, klik tombol Terapkan (Deploy) > Terapkan baru (New deployment).
  2. Klik ikon gear (Pilih jenis), lalu pilih Aplikasi web (Web app).
  3. Isikan deskripsi bebas (misal: Versi 1).
  4. Pada bagian Yang memiliki akses (Who has access), ubah menjadi Siapa saja (Anyone). (Ini krusial agar Telegram bisa mengaksesnya).
  5. Klik Terapkan (Deploy).
  6. Anda mungkin akan diminta memberikan izin (Authorize access). Pilih akun Google Anda, klik Advanced, lalu klik Go to Untitled project (unsafe), dan pilih Allow.
  7. Setelah berhasil, Anda akan mendapatkan URL Aplikasi Web (Web app URL). Salin URL tersebut.

Step 5: Hubungkan Web App Ke Telegram (Set Webhook)

Langkah terakhir adalah memberi tahu Telegram ke mana harus mengirim pesan. Kita perlu menembak URL Webhook.

Cara paling mudah, buka browser baru (Chrome/Firefox), lalu buka URL berikut setelah Anda sesuaikan:

https://api.telegram.org/bot[TOKEN_TELEGRAM_ANDA]/setWebhook?url=[URL_WEB_APP_ANDA]

Ganti [TOKEN_TELEGRAM_ANDA] dan [URL_WEB_APP_ANDA] dengan data yang sudah Anda simpan sebelumnya.

Contoh URL yang benar: https://api.telegram.org/bot123456:ABCdefGhI/setWebhook?url=https://script.google.com/macros/s/XYZ123/exec

Jika sukses, di layar browser akan muncul teks:

{"ok":true,"result":true,"description":"Webhook was set"}

🚀 Cara Penggunaan & Pengujian

Sekarang buka bot Telegram Anda dan klik /start.

1. Cara Mencatat Transaksi

Kirim pesan dengan format: [Jenis] [Nominal] [Keterangan] (dipisahkan spasi).

  • Contoh Pemasukan:
    Pemasukan 2000000 Gaji Bulanan
  • Contoh Pengeluaran:
    Pengeluaran 45000 Beli Kopi dan Cemilan

Bot akan otomatis membalas dengan centang hijau (✅ Berhasil dicatat!), dan data langsung masuk ke Google Sheets secara real-time.

2. Cara Menerima Laporan

Cukup ketik perintah ini di chat bot:

/laporan

Bot akan membaca data di Google Sheets, menyaring transaksi yang terjadi di bulan ini saja, menghitung totalnya, dan mengirimkan ringkasannya (Pemasukan, Pengeluaran, dan Sisa Saldo) langsung ke Anda.

Posting Komentar

0 Komentar