Panduan Lengkap: Membuat Notifikasi Pajak Kendaraan Otomatis di Google Sheets
Bagi pemilik kendaraan, salah satu hal yang paling sering terlupakan adalah tanggal jatuh tempo pajak tahunan atau 5 tahunan. Dengan Google Sheets dan fitur Google Apps Script, kita bisa membuat sistem otomatis yang akan mengirimkan email notifikasi 60 hari sebelum tanggal jatuh tempo tiba.
Ikuti panduan ini mulai dari pembuatan tabel, memasukkan rumus, hingga pemasangan skrip otomatisasi email.
| Table Spreadsheet sebagai Database | 
🚀 Tahap 1: Pembuatan dan Pengaturan Tabel di Google Sheets
Buka Google Sheets dan buatlah sebuah sheet baru. Beri nama tab Anda, misalnya, "Notifikasi" (sesuaikan skrip jika Anda menggunakan nama lain).
Buat header kolom seperti berikut (total 10 kolom):
1. Masukkan Data Dasar (Kolom A - E)
Isi kolom A, B, C, D, dan E dengan data kendaraan Anda. Kolom-kolom ini adalah input utama:
2. Terapkan Rumus Otomatis (Kolom F, G, H, I)
Masukkan rumus-rumus ini pada baris 2, lalu seret (copy-paste) ke bawah untuk semua baris kendaraan Anda:
⚙️ Tahap 2: Pengaturan Google Apps Script (Otomatisasi Email)
Sekarang kita akan memasang kode yang akan membaca tabel di atas dan mengirimkan notifikasi.
1. Buka Apps Script
Di Google Sheets, klik menu Ekstensi (Extensions) > Apps Script.
Tab baru akan terbuka di peramban Anda.
2. Salin & Tempel Kode Skrip Final
Hapus semua kode yang sudah ada di editor Apps Script (function myFunction() { }) dan gantikan dengan kode di bawah ini.
Penting: Pastikan alamat email
TARGET_EMAILdanCC_EMAILsudah sesuai dengan alamat email Anda.
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 = "lubistechnician@gmail.com";var CC_EMAIL = "lubistechnician@gmail.com";var SENDER_NAME = "PAJAK KENDARAAN";var reminderThreshold = 60; // Setting peringatan 60 hari sebelum jatuh tempovar CHECKMARK_SYMBOL = "✓";// Mendapatkan tanggal hari ini dalam format bahasa Indonesia (untuk perbandingan teks)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;// Ambil data dari kolom yang relevan (Indeks array dimulai dari 0)var namaKendaraan = row[0]; // Kolom Avar nopol = row[1]; // Kolom Bvar biayaTahunan = row[3]; // Kolom Dvar biaya5Tahunan = row[4]; // Kolom Evar jatuhTempo5Tahun = row[6]; // Kolom Gvar jatuhTempoBerikutnya = row[7]; // Kolom Hvar sisaWaktuHari = row[8]; // Kolom Ivar statusKirimTeks = row[9]; // Kolom J// LOGIKA PENCEGAHAN DUPLIKASI: Cek apakah teks di Kolom J mengandung tanggal hari inivar isSentToday = (typeof statusKirimTeks === 'string' && statusKirimTeks.includes(todayDateString));// Lanjutkan hanya jika: sisa waktu <= threshold, > 0, DAN BELUM dikirim hari iniif (sisaWaktuHari <= reminderThreshold && sisaWaktuHari > 0 && !isSentToday) {// LOGIKA FORMATTING TANGGAL & BIAYAvar 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'); // Perbaiki output NaNvar subject = "Peringatan Penting: Jatuh Tempo Pajak Kendaraan (" + namaKendaraan + ") Semakin Dekat";// --- TEMPLATE EMAIL DENGAN HTML DAN CSS INLINE ---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;'>";// HeaderhtmlBody += "<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 (Tabel Rapi)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>";// Jenis Pembayaran (Tabel Rapi)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>";// FooterhtmlBody += "<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>";// 1. KIRIM EMAIL (Isi body menggunakan HTML)MailApp.sendEmail({to: TARGET_EMAIL,cc: CC_EMAIL,subject: subject,htmlBody: htmlBody, // Menggunakan htmlBodyname: SENDER_NAME});// 2. CATAT STATUS PENGIRIMAN di KOLOM Jvar now = new Date();var formattedTimestamp = now.toLocaleDateString('id-ID', {day: '2-digit', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit'});// Kolom J (index 9) untuk simbol centang dan tanggal/waktu visualsheet.getRange(rowNum, 10).setValue(CHECKMARK_SYMBOL + ' ' + formattedTimestamp);}}}
3. Pasang Pemicu Waktu (Trigger)
Setelah Anda menyimpan skrip (klik ikon Simpan), Anda harus mengatur kapan skrip ini akan berjalan secara otomatis:
Di panel kiri Apps Script, klik ikon Jam Alarm (Triggers).
Klik tombol Tambahkan Pemicu (Add Trigger) di kanan bawah.
Di jendela konfigurasi:
Pilih fungsi yang akan dijalankan:
sendPajakReminderPilih sumber acara: Berdasarkan waktu (Time-driven)
Pilih jenis pemicu berbasis waktu: Pengatur waktu hari (Day timer)
Pilih jam dalam sehari: Pilih waktu antara 08.00 hingga 09.00 (atau waktu lain yang Anda inginkan).
Klik Simpan.
Peringatan: Google mungkin meminta otorisasi pertama kali. Ikuti langkah-langkahnya dan berikan izin agar skrip dapat mengirim email atas nama Anda.
🔁 Tahap 3: Update Data Setelah Pembayaran Pajak
Sistem notifikasi Anda akan berhenti mengirim email setelah Kolom J terisi simbol centang dan tanggal hari itu. Agar notifikasi dapat berjalan kembali untuk siklus berikutnya, Anda harus melakukan reset manual setelah membayar pajak.
1. Update Tanggal Bayar (Kolom C)
Ubah tanggal pada Kolom C ("Tanggal Bayar Terakhir") menjadi tanggal pembayaran pajak yang baru Anda lakukan.
2. Update Jatuh Tempo 5 Tahun (Kolom F - HANYA JIKA BAYAR 5 TAHUNAN)
Jika Anda baru saja membayar pajak 5 tahunan (ganti plat):
Ubah Tanggal di Kolom F menjadi tanggal baru (Tanggal Anda Membayar Pajak 5 Tahunan).
Jika Anda hanya membayar pajak tahunan:
Tidak ada yang perlu diubah di Kolom F.
3. Reset Status Notifikasi
Hapus semua konten (✓ Tanggal Waktu) di Kolom J untuk baris kendaraan yang bersangkutan.
Setelah di-reset, rumus di Kolom G, H, dan I akan otomatis terbarui, dan sistem notifikasi Anda siap bekerja lagi untuk tahun atau lima tahun berikutnya!


Post a Comment for "Panduan Lengkap: Membuat Notifikasi Pajak Kendaraan Otomatis di Google Sheets"