Langsung ke konten utama

Debug

function TRX_SHEET_NAME(){ return "TRX"; } // ganti kalau nama sheet trx kamu beda function _trxSheet_(){ const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName(TRX_SHEET_NAME()); if (!sh) throw new Error("Sheet TRX tidak ditemukan: " + TRX_SHEET_NAME()); return sh; } function _getHeader_(sh){ return sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0].map(x=>String(x||"").trim()); } function _colIndex_(header, key){ const i = header.indexOf(key); return i === -1 ? 0 : (i+1); // 1-based } /** * Pastikan ada kolom "ID" (uppercase sesuai foto). * Kita taruh di paling kanan biar gak ganggu urutan lama. */ function _ensureIdColumn_(){ const sh = _trxSheet_(); let header = _getHeader_(sh); let idCol = _colIndex_(header, "ID"); if (idCol) return { sh, header, idCol }; // tambah kolom paling kanan sh.insertColumnAfter(sh.getLastColumn()); sh.getRange(1, sh.getLastColumn()).setValue("ID"); header = _getHeader_(sh); idCol = _colIndex_(header, "ID"); return { sh, header, idCol }; } /** Isi UUID untuk baris lama yang ID-nya kosong */ function _fillMissingIds_(){ const { sh, idCol } = _ensureIdColumn_(); const last = sh.getLastRow(); if (last < 2) return { ok:true, filled:0 }; const rng = sh.getRange(2, idCol, last-1, 1); const vals = rng.getValues(); let filled = 0; for (let i=0; i

Komentar

Postingan populer dari blog ini

Index

Dashboard Konter Dashboard Konter Cash & Bank Saldo Awal Topup DANA Setor/Tarik Riwayat Saldo CASH + BANK CASH Rp 0 BANK Rp 0 TOTAL Rp 0 Refresh Laporan Buka Laporan Filter tanggal + ringkasan profit & total transaksi. Saldo Awal Saldo Bank Saldo Cash Catatan: nilai ini jadi saldo dasar (bank & cash). Batal Simpan Topup DANA ...

Indext ppob

Dashboard Konter Dashboard Konter Cash & Bank — Saldo Awal Reload Omset Hari Ini Rp 0 0 transaksi Profit Hari Ini Rp 0 Admin/fee (akumulasi) Cari Tip: ketik “dana”, “setor”, “tarik”, atau catatan. Topup Setor/Tarik Riwayat Laporan (Range) Saldo CASH + BANK CASH Rp 0 BANK Rp 0 TOTAL ...