Cara Membuat Notifikasi Email Pengingat Pajak Kendaraan dengan Google Sheets

Thumbnail: Setup Notifikasi Email Otomatis Pajak Kendaraan

Sistem Otomatis: Notifikasi Email Pengingat Pajak Kendaraan dengan Google Apps Script

Apakah Anda sering lupa tanggal jatuh tempo pajak kendaraan bermotor? Mengurus armada membutuhkan manajemen waktu yang cermat untuk menghindari denda. Dengan memanfaatkan Google Sheets sebagai *database* dan Google Apps Script sebagai mesin otomatisasi, Anda dapat membangun sistem cerdas yang mengirimkan notifikasi email pengingat secara tepat waktu dan bebas repot.

Artikel ini akan memandu Anda langkah demi langkah untuk menerapkan kode Apps Script yang canggih pada tabel data pajak kendaraan Anda, menjadikannya sistem pengingat pajak kendaraan otomatis yang andal dan mencegah pengiriman email duplikasi harian.


🚀 Langkah 1: Siapkan Struktur Data di Google Sheets (Kolom A-J)

Struktur ini krusial karena kode Apps Script mengakses data berdasarkan indeks kolom (A=0, B=1, dst.). Pastikan Anda memiliki kolom A hingga J dengan fungsi yang sesuai.

Kolom Nama Kolom Fungsi Data Indeks Kode (Array)
A Nama Kendaraan Nama atau Deskripsi Kendaraan 0
B Nopol Nomor Polisi Kendaraan 1
C Jenis Kendaraan Contoh: Mobil/Motor 2
D Biaya Tahunan Perkiraan Biaya Pajak Tahunan (Angka) 3
E Biaya 5 Tahunan Perkiraan Biaya Pajak 5 Tahunan (Angka) 4
F Jatuh Tempo Tahun Lalu Tanggal Jatuh Tempo Pajak Tahun Sebelumnya 5
G Jatuh Tempo 5 Tahun Tanggal Jatuh Tempo Ganti Plat/STNK 5 Tahunan 6
H Jatuh Tempo Berikutnya Tanggal Jatuh Tempo Pajak Tahunan/5 Tahunan (Data Kunci) 7
I Sisa Waktu (Hari) SISA HARI Menuju Jatuh Tempo Berikutnya (Rumus Wajib) 8
J Notifikasi Terakhir Kolom untuk mencatat *timestamp* pengiriman (Pencegahan Duplikasi) 9
💡 TIPS KRUSIAL: Rumus Kolom I Kolom I (Sisa Waktu Hari) harus berisi rumus yang menghitung selisih hari. Gunakan rumus: =DATEDIF(TODAY(), H2, "D") (asumsi tanggal jatuh tempo ada di H2). Pastikan format sel adalah Angka (bukan Tanggal).

💻 Langkah 2: Implementasi Google Apps Script (Fungsi Inti)

Buka Google Sheets Anda, lalu klik Ekstensi > Apps Script. Salin dan tempel kode berikut ke dalam editor. Pastikan Anda menyesuaikan variabel TARGET_EMAIL dan CC_EMAIL.


function sendPajakReminder() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spreadsheet.getSheetByName("Sheet1"); 
    var dataRange = sheet.getRange("A2:J" + sheet.getLastRow()); 
    var data = dataRange.getValues();

    var TARGET_EMAIL = "nomerarekarek@gmail.com"; // <-- GANTI DENGAN EMAIL TUJUAN UTAMA
    var CC_EMAIL = "lubistechnician@gmail.com";  // <-- GANTI DENGAN EMAIL CC
    var SENDER_NAME = "PAJAK KENDARAAN";
    var reminderThreshold = 60; // Peringatan 60 hari sebelum jatuh tempo 

    var today = new Date();
    var todayDateString = today.toLocaleDateString('id-ID', {day: '2-digit', month: 'long', year: 'numeric'});

    for (var i = 0; i < data.length; i++) {
        var row = data[i];
        var rowNum = i + 2; 

        var namaKendaraan = row[0];   
        var nopol = row[1];           
        var biayaTahunan = row[3];    
        var biaya5Tahunan = row[4];   
        var jatuhTempo5Tahun = row[6]; 
        var jatuhTempoBerikutnya = row[7]; 
        var sisaWaktuHari = row[8];   
        var statusKirimTeks = row[9]; 

        var isSentToday = (typeof statusKirimTeks === 'string' && statusKirimTeks.includes(todayDateString));

        if (sisaWaktuHari <= reminderThreshold && sisaWaktuHari > 0 && !isSentToday) {
            
            var formatOptions = { day: '2-digit', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit' };
            var jtBerikutnyaFormatted = jatuhTempoBerikutnya instanceof Date ? jatuhTempoBerikutnya.toLocaleDateString('id-ID', formatOptions) : jatuhTempoBerikutnya;
            var jt5TahunFormatted = jatuhTempo5Tahun instanceof Date ? jatuhTempo5Tahun.toLocaleDateString('id-ID', formatOptions) : jatuhTempo5Tahun;
            var siklus = (jatuhTempoBerikutnya instanceof Date && jatuhTempo5Tahun instanceof Date && jatuhTempoBerikutnya.toDateString() === jatuhTempo5Tahun.toDateString()) ? "5 Tahunan (Ganti Plat)" : "Tahunan";
            
            var biayaPajak = (siklus === "5 Tahunan (Ganti Plat)" && biaya5Tahunan > 0) ? biaya5Tahunan : biayaTahunan;
            var biayaFormatted = "Rp " + (biayaPajak ? parseFloat(biayaPajak).toLocaleString('id-ID') : 'Hubungi Samsat');

            var subject = "Peringatan Penting: Jatuh Tempo Pajak Kendaraan (" + namaKendaraan + ") Semakin Dekat";
            
            // --- TEMPLATE EMAIL HTML ---
            var htmlBody = "<div style='font-family: Arial, sans-serif; font-size: 14px; color: #333; max-width: 600px; margin: auto; border: 1px solid #ddd; padding: 20px; border-radius: 8px;'>";
            
            // Header
            htmlBody += "<h2 style='color: #007bff; border-bottom: 2px solid #007bff; padding-bottom: 10px; margin-top: 0;'>Pemberitahuan Jatuh Tempo Pajak Kendaraan</h2>";
            htmlBody += "<p>Bapak/Ibu Yth.,</p>";
            htmlBody += "<p>Email ini dikirimkan otomatis sebagai pengingat untuk pembayaran pajak kendaraan bermotor yang akan jatuh tempo dalam waktu dekat. Mohon segera lakukan pengecekan dan pembayaran.</p>";
            
            // Detail Kendaraan
            htmlBody += "<h3 style='color: #333; border-bottom: 1px solid #eee; padding-bottom: 5px;'>Detail Kendaraan</h3>";
            htmlBody += "<table style='width: 100%; border-collapse: collapse; margin-bottom: 20px;'>";
            htmlBody += "<tr><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; width: 40%;'>Nama Kendaraan</td><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; font-weight: bold;'>" + namaKendaraan + "</td></tr>";
            htmlBody += "<tr><td style='padding: 8px; border-bottom: 1px solid #f0f0f0;'>Nomor Polisi (Nopol)</td><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; font-weight: bold;'>" + nopol + "</td></tr>";
            htmlBody += "<tr><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; background-color: #e6f7ff;'>Jatuh Tempo Berikutnya</td><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; font-weight: bold; color: #d9534f; background-color: #e6f7ff;'>" + jtBerikutnyaFormatted + "</td></tr>";
            htmlBody += "<tr><td style='padding: 8px; border-bottom: 1px solid #f0f0f0;'>Sisa Waktu</td><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; font-weight: bold;'>" + sisaWaktuHari + " Hari</td></tr>";
            htmlBody += "</table>";
            
            // Informasi Pembayaran
            htmlBody += "<h3 style='color: #333; border-bottom: 1px solid #eee; padding-bottom: 5px;'>Informasi Pembayaran</h3>";
            htmlBody += "<table style='width: 100%; border-collapse: collapse; margin-bottom: 20px;'>";
            htmlBody += "<tr><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; width: 40%;'>Siklus Pembayaran</td><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; font-weight: bold; color: " + (siklus === "5 Tahunan (Ganti Plat)" ? '#d9534f' : '#333') + "'>" + siklus + "</td></tr>";
            htmlBody += "<tr><td style='padding: 8px; border-bottom: 1px solid #f0f0f0;'>Jatuh Tempo 5 Tahun (Ganti Plat)</td><td style='padding: 8px; border-bottom: 1px solid #f0f0f0;'>" + jt5TahunFormatted + "</td></tr>";
            htmlBody += "<tr><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; background-color: #f9f9f9;'>Perkiraan Biaya</td><td style='padding: 8px; border-bottom: 1px solid #f0f0f0; font-weight: bold; background-color: #f9f9f9;'>" + biayaFormatted + "</td></tr>";
            htmlBody += "</table>";

            // Footer
            htmlBody += "<p style='font-size: 12px; color: #777; margin-top: 30px;'>Keterlambatan pembayaran dapat mengakibatkan denda sesuai peraturan yang berlaku.</p>";
            htmlBody += "<p>Hormat kami,<br>Administrasi Kendaraan</p>";
            htmlBody += "</div>";

            // KIRIM EMAIL
            MailApp.sendEmail({
                to: TARGET_EMAIL,
                cc: CC_EMAIL,
                subject: subject,
                htmlBody: htmlBody,
                name: SENDER_NAME 
            });

            // CATAT STATUS PENGIRIMAN
            var now = new Date();
            var formattedTimestamp = now.toLocaleDateString('id-ID', {day: '2-digit', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit'}); 
            sheet.getRange(rowNum, 10).setValue(formattedTimestamp); 
        }
    }
    

✨ Contoh Email yang Terkirim (Output dari Script)

Contoh di atas mensimulasikan data dari baris pertama Google Sheet Anda (Xenia 2009) yang diasumsikan memenuhi kriteria pengiriman.


⏰ Langkah 3: Atur Pemicu (Trigger) Harian

Agar fungsi sendPajakReminder() berjalan otomatis setiap hari tanpa perlu menekan tombol, Anda harus mengatur Pemicu Waktu (*Time-driven Trigger*) di Google Apps Script.

  1. Di editor Apps Script, klik ikon Jam (Pemicu/Triggers) di menu sisi kiri.
  2. Klik Tambahkan Pemicu (*Add Trigger*).
  3. Konfigurasikan pengaturan sebagai berikut:
    • Pilih fungsi yang akan dijalankan: sendPajakReminder
    • Pilih sumber peristiwa: Waktu Digerakkan (*Time-driven*)
    • Pilih jenis pemicu berbasis waktu: Pengatur waktu hari (*Day timer*)
    • Pilih jam harian: Pilih rentang waktu (misalnya, 08:00 - 09:00).
  4. Klik Simpan.
⚠️ Otorisasi Pertama: Saat menyimpan pemicu, Google akan meminta izin untuk menjalankan kode yang mengakses email Anda (MailApp) dan Google Sheets. Terima permintaan otorisasi ini untuk mengaktifkan sistem.

✅ Sistem Anda Telah Beroperasi Penuh!

Setelah pemicu diaktifkan, sistem otomatisasi ini akan bekerja cerdas di latar belakang:

  • Deteksi Cerdas: Sistem akan memeriksa data setiap hari. Jika sisa waktu kurang dari atau sama dengan 60 hari dan lebih dari 0 hari, notifikasi siap dikirim.
  • Pencegahan Spam: Berkat pemeriksaan di Kolom J (Notifikasi Terakhir), email hanya akan dikirim sekali per hari untuk setiap kendaraan, memastikan kotak masuk tetap bersih.
  • Detail Lengkap: Email yang terkirim menggunakan format HTML yang rapi dan informatif.
Mas Lubis
Mas Lubis Saya adalah Teknisi sekaligus penulis Blog

Post a Comment for "Cara Membuat Notifikasi Email Pengingat Pajak Kendaraan dengan Google Sheets"