FaizBlog LogoFaizBlog
Back to all articles
Google Apps ScriptInvoiceGoogle SheetsOtomatisasionEdit

Cara Bikin Nomor Invoice Otomatis di Google Sheets (INV-2025-0001)

Panduan lengkap generate nomor invoice / PO / kuitansi otomatis di Google Sheets dengan Apps Script trigger onEdit. Berurutan, unik, tanpa duplikat.

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.

Manual vs Otomatis

Kenapa Nomor Otomatis?

ManualOtomatis (Apps Script)
Rentan salah ketik / duplikatNomor unik, berurutan
Harus cek nomor terakhir manualScript cek otomatis
Beda format antar adminFormat konsisten (INV-2025-0001)
Skip nomor saat lupaTidak akan pernah skip

Format yang Populer

Format nomor invoice

Beberapa format standar yang sering dipakai:

FormatContohCocok Untuk
PREFIX-YYYY-####INV-2025-0042Perusahaan umum
PREFIX/MM/YYYY/###FKT/05/2025/003Sistem bulanan
PREFIX-KOTA-####INV-BDG-0087Multi-cabang
YYYYMMDD-####20250520-0001Retail 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

Trigger onEdit menyala

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:

  1. Editor → ⏰ TriggersAdd Trigger.
  2. Function: pilih fungsi utama (bukan onEdit, ganti nama jadi generateNoInvoice).
  3. Event source: From spreadsheet → On edit.
  4. Save.

Alternatif: Reset Nomor per Bulan

Kalau maunya nomor reset tiap bulan (INV-05-2025-0001INV-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):

  1. Klik kanan kolom A → Protect range.
  2. Set permissions → hanya Owner yang bisa edit.
  3. Script tetap bisa write ke kolom protected (karena jalan sebagai Owner).

Kasus Nyata

Selain invoice, teknik yang sama bisa dipakai untuk:

DokumenFormatKolom Trigger
Purchase OrderPO-2025-0001Total harga
Surat JalanSJ-2025-0001Nama pelanggan
KuitansiKWT-2025-0001Jumlah
Tiket SupportTICKET-2025-0001Judul tiket
No. AntrianANT-20250520-001Nama 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. 🧾