Cara Membuat Notifikasi Email Pengingat Pajak Kendaraan dengan Google Sheets
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 |
=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)
Pemberitahuan Jatuh Tempo Pajak Kendaraan
Bapak/Ibu Yth.,
Email ini dikirimkan otomatis sebagai pengingat untuk pembayaran pajak kendaraan bermotor yang akan jatuh tempo dalam waktu dekat. Mohon segera lakukan pengecekan dan pembayaran.
Detail Kendaraan
| Nama Kendaraan | Xenia 2009 |
| Nomor Polisi (Nopol) | W 1612 TC |
| Jatuh Tempo Berikutnya | 17 Mei 2026 |
| Sisa Waktu | 182 Hari |
Informasi Pembayaran
| Siklus Pembayaran | Tahunan |
| Jatuh Tempo 5 Tahun (Ganti Plat) | 17 Mei 2027 |
| Perkiraan Biaya | Rp 1.796.700 |
Keterlambatan pembayaran dapat mengakibatkan denda sesuai peraturan yang berlaku.
Hormat kami,
Administrasi Kendaraan
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.
- Di editor Apps Script, klik ikon Jam (Pemicu/Triggers) di menu sisi kiri.
- Klik Tambahkan Pemicu (*Add Trigger*).
- 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).
- Pilih fungsi yang akan dijalankan:
- Klik Simpan.
✅ 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.
Post a Comment for "Cara Membuat Notifikasi Email Pengingat Pajak Kendaraan dengan Google Sheets"