AI Insights
Generate a summary and suggested tags for this post.
Salah satu error paling umum di admin kantor: nomor invoice bentrok atau skip nomor. Padahal itu masalah serius — audit pajak bisa bermasalah, sistem akuntansi jadi kacau.
Solusinya: script Apps Script yang auto-generate nomor invoice berurutan, unik, tanpa duplikat — jalan otomatis begitu kamu isi baris baru di Sheets.

Kenapa Nomor Otomatis?
| Manual | Otomatis (Apps Script) |
|---|---|
| Rentan salah ketik / duplikat | Nomor unik, berurutan |
| Harus cek nomor terakhir manual | Script cek otomatis |
| Beda format antar admin | Format konsisten (INV-2025-0001) |
| Skip nomor saat lupa | Tidak akan pernah skip |
Format yang Populer

Beberapa format standar yang sering dipakai:
| Format | Contoh | Cocok Untuk |
|---|---|---|
| PREFIX-YYYY-#### | INV-2025-0042 | Perusahaan umum |
| PREFIX/MM/YYYY/### | FKT/05/2025/003 | Sistem bulanan |
| PREFIX-KOTA-#### | INV-BDG-0087 | Multi-cabang |
| YYYYMMDD-#### | 20250520-0001 | Retail harian |
Script: Auto-Number saat Baris Baru
Buka Sheets → Extensions → Apps Script → paste:
const KOLOM_NO_INVOICE = 1; // kolom A
const KOLOM_TRIGGER = 4; // kolom D (Total) — saat diisi, nomor tergenerate
const PREFIX = "INV";
function onEdit(e) {
const sheet = e.range.getSheet();
if (sheet.getName() !== "Invoice") return;
const row = e.range.getRow();
const col = e.range.getColumn();
if (row < 2) return;
if (col !== KOLOM_TRIGGER) return;
// Skip kalau nomor invoice sudah ada
const cellNo = sheet.getRange(row, KOLOM_NO_INVOICE);
if (cellNo.getValue()) return;
// Ambil nomor terakhir
const data = sheet.getRange(2, KOLOM_NO_INVOICE, sheet.getLastRow() - 1, 1).getValues();
const tahun = new Date().getFullYear();
let maxUrut = 0;
data.forEach(([val]) => {
const m = String(val).match(new RegExp(`^${PREFIX}-${tahun}-(\\d+)$`));
if (m) maxUrut = Math.max(maxUrut, Number(m[1]));
});
const nomorBaru = `${PREFIX}-${tahun}-${String(maxUrut + 1).padStart(4, "0")}`;
cellNo.setValue(nomorBaru);
}Cara kerja: begitu kamu isi kolom Total (kolom D), nomor invoice otomatis muncul di kolom A dengan format INV-2025-0001.
Aktifkan Trigger onEdit

Fungsi onEdit(e) adalah simple trigger — otomatis aktif tanpa perlu setup trigger manual. Tapi ada batasan: tidak bisa akses GmailApp/UrlFetch.
Kalau butuh akses eksternal (misal kirim invoice via email setelah nomor ter-generate), pakai installable trigger:
- Editor → ⏰ Triggers → Add Trigger.
- Function: pilih fungsi utama (bukan onEdit, ganti nama jadi
generateNoInvoice). - Event source: From spreadsheet → On edit.
- Save.
Alternatif: Reset Nomor per Bulan
Kalau maunya nomor reset tiap bulan (INV-05-2025-0001 → INV-06-2025-0001):
const bulan = String(new Date().getMonth() + 1).padStart(2, "0");
const tahun = new Date().getFullYear();
const regex = new RegExp(`^${PREFIX}-${bulan}-${tahun}-(\\d+)$`);
// ...cari maxUrut sesuai regex baru
const nomorBaru = `${PREFIX}-${bulan}-${tahun}-${String(maxUrut + 1).padStart(4, "0")}`;Lock Kolom Nomor Invoice
Supaya nomor invoice tidak bisa diedit manual (mencegah admin nakal ubah nomor):
- Klik kanan kolom A → Protect range.
- Set permissions → hanya Owner yang bisa edit.
- Script tetap bisa write ke kolom protected (karena jalan sebagai Owner).
Kasus Nyata
Selain invoice, teknik yang sama bisa dipakai untuk:
| Dokumen | Format | Kolom Trigger |
|---|---|---|
| Purchase Order | PO-2025-0001 | Total harga |
| Surat Jalan | SJ-2025-0001 | Nama pelanggan |
| Kuitansi | KWT-2025-0001 | Jumlah |
| Tiket Support | TICKET-2025-0001 | Judul tiket |
| No. Antrian | ANT-20250520-001 | Nama customer |
Tips Anti-Duplikat
- Trigger di kolom "wajib isi" — pilih kolom yang PASTI diisi terakhir.
- Sortir data by tanggal — biar nomor urut sinkron dengan waktu input.
- Log setiap generate — simpan ke sheet "Log" dengan timestamp & user.
- Fungsi cek duplikat — sebelum set nilai, verifikasi belum ada di data.
- Backup harian — kombinasikan dengan script backup (lihat artikel sebelumnya).
Kesimpulan
Auto-number di Sheets adalah fondasi automation kantor — sekali setup 10 menit, kamu:
- ✅ Tidak akan pernah duplikat nomor lagi
- ✅ Format konsisten seragam antar admin
- ✅ Hemat 30 detik per invoice = jam-jam produktivitas per bulan
- ✅ Bisa direplikasi untuk PO, kuitansi, tiket, dll
Kombinasikan dengan script invoice generator otomatis dan email reminder — kamu punya sistem billing mini yang jalan sendiri, gratis, tanpa langganan tool CRM. 🧾
