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
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 ...
Komentar
Posting Komentar