Skip to main content

Search

Manjemen Aset Dengan Google Sheet dan App Script

Mengelola data dengan google sheet memiliki keunggulan dikarekan data bisa di akses secara online. dan salah satu implementasi yang bisa kita manfaatkan adalah  membuat sistem pengarsipan surat kelur dan masuk dengan google sheet dan pada postingan ini kita akan membangun sistem manajemen aset menggunakan google sheet serta appscript sebagai penunjang untuk memenuhi kebutuhan fitur yang akan kita buat dan tentunya saat anda ingin implementasikan ke dalam tempat anda anda hrus pasikan kesesuaikan aset dan perhitungan yang akan di bahawa pada postingan ini.



Sebelum kita melakukan sampai dengan pembuatan function pada google appscript  langlah  yang harus kita buat dalam membuat sistem manajemen aset dengan google sheets dan appscript adalah 

1. Analisa kebutuhan

Pada tahap ini tentu kita harus melakukan analisa terhadapat kebutuhan manajmeen aset tersebut kita harus pastikan bahwa penggunaan google sheet dapat memenuhi kebutuhan semua fitur yang dinginkan jika tidak sesuai maka tentunya bisa menggunakan teknologi lain. Jika dirasa bisa memenuhi maka anda harus petakan fitur apa saya yang akan bisa memenuhi kebuhan tersebut. pada contoh ini adalah

Perusahaan A ingin mengelola aset secara mudah dengan fitur dapat memasukan data aset, dapat memasukan data perawatan, dapat memasukan data peminjaman serta dapat melihat dasrboard grafik serta mencetak laporan aset. 

2. Desain

Dari contoh tersebut kit adesain langsung menggunakan google sheet jika sudah memehuni kebutuhan maka bisa disampaikan ke pihak yang berkepentingan

a. Sheet Dashboard untuk menmpilkan data grafik data aset

b. Sheet Aset untuk form input aset dan cetak label aset

c. Sheet Perawatan untuk form input perawatan aset

d. Sheet Peminjaman untuk form input peminjaman aset

e. Sheet laporan untuk form cetak laporan data aset

f. Sheet Data Aset sebagai sheet untuk menampung data aset dari hasil input aset

g. Sheet Data Perawatan sebagai sheet untuk menampung data perawatan hasil dari form input perawatan

h. Sheet Data Peminjaman sebagai sheet untuk menampung data peminjaman hasil form input peminjaman

i. Print Aset sebagai datai sementara hasil cetak laporan aset

j. sheer ref digunakan refensi data untuk filter dengan query berdasarkan data pilihan pada sheet dashboard

3. Pembuatan function di appscript

Setelah desain disetujui maka langkah berikutnya adalah membuat function di appscript untuk memenuhi kebutuhan fitur yang telah di implementasikan pada desain tersebut

4. Uji coba

Setelah tahpa pembuatan functon selesai maka langkah berikutnya adalah melakukan uji coba seluruh fitur termasuk perhitungan nilai yang telah di sepakati atau di tentukan oleh pihka yang berkepentingan

5. Implementasi Sistem

Langkah berikutnya adalah implementasi sistem yang sistem yang telah dibuat dan telah dilakukan uji coba maka langkah berikutnya adalah melakukn implementasi sistem yang dibuat dengan melakukan share link google sheet sebagai editor kepada pihat yang memiliki wewenang. 

6. Berikut ini adalah function code dari hasil contoh pembuat sistem manajemen aset dengan google sheet dan App Script


Generate no aset

function generateNoAset() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Aset');
if (!dataSheet) {
dataSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('Data Aset');
}
var year = new Date().getFullYear().toString().slice(-2);
var lastRow = dataSheet.getLastRow();
var lastNo = lastRow > 1 ? parseInt(dataSheet.getRange(lastRow, 1).getValue().slice(5)) : 0;
var newNo = ('000' + (lastNo + 1)).slice(-4);
var noAset = "AST" + year + newNo;
sheet.getRange('D3').setValue(noAset);
sheet.getRange('D9').setValue(new Date()).setNumberFormat("dd/MM/yyyy");
}


Simpan aset

function saveOrUpdateDataAset() {
var ui = SpreadsheetApp.getUi();
var response = ui.alert(
'Konfirmasi Penyimpanan/Pembaruan',
'Apakah Anda ingin menyimpan atau memperbarui data aset?',
ui.ButtonSet.OK_CANCEL
);

if (response == ui.Button.CANCEL) {
ui.alert('Proses dibatalkan.');
return;
}

var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Aset');

if (!dataSheet) {
ui.alert('Sheet "Data Aset" tidak ditemukan!');
return;
}

var noAset = sheet.getRange('D3').getValue().toString().trim(); // Ambil No Aset dari input
if (!noAset) {
ui.alert('No Aset tidak boleh kosong!');
return;
}

var dataValues = dataSheet.getDataRange().getValues();
var foundRow = -1; // Untuk menyimpan baris jika No Aset ditemukan
var currentStatus = 'Aktif'; // Default jika data baru

// Loop untuk mencari No Aset dan menyimpan status lama jika ada
for (var i = 1; i < dataValues.length; i++) { // Mulai dari index 1 karena index 0 adalah header
if (dataValues[i][0].toString().trim() === noAset) {
foundRow = i + 1; // Baris di Google Sheets dimulai dari 1
currentStatus = dataValues[i][11]; // Simpan status lama
break;
}
}

// Data yang akan disimpan atau diperbarui
var data = [
noAset,
sheet.getRange('D4').getValue(),
sheet.getRange('D5').getValue(),
sheet.getRange('D6').getValue(),
sheet.getRange('D7').getValue(),
sheet.getRange('D8').getValue(),
sheet.getRange('D9').getValue(),
sheet.getRange('D10').getValue(),
sheet.getRange('D11').getValue(),
sheet.getRange('D12').getValue(),
sheet.getRange('D13').getValue(),
currentStatus, // Gunakan status lama jika update, atau 'Aktif' jika data baru
`=IF(G${foundRow > 0 ? foundRow : dataSheet.getLastRow() + 1}>TODAY(); I${foundRow > 0 ? foundRow : dataSheet.getLastRow() + 1}; MAX(0; I${foundRow > 0 ? foundRow : dataSheet.getLastRow() + 1} - ((I${foundRow > 0 ? foundRow : dataSheet.getLastRow() + 1}/ J${foundRow > 0 ? foundRow : dataSheet.getLastRow() + 1}) * DATEDIF(G${foundRow > 0 ? foundRow : dataSheet.getLastRow() + 1}; TODAY(); "Y"))))`
];

if (foundRow > 0) {
// Jika No Aset ditemukan → Update data
dataSheet.getRange(foundRow, 1, 1, data.length).setValues([data]);
ui.alert('Data aset berhasil diperbarui!');
} else {
// Jika No Aset tidak ditemukan → Simpan data baru
dataSheet.appendRow(data);
ui.alert('Data aset berhasil disimpan!');
resetForm();
}
}

Pencarian Aset

function searchAset() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Aset');
if (!dataSheet) {
SpreadsheetApp.getUi().alert('Sheet "Data Aset" tidak ditemukan!');
return;
}
var noAset = Browser.inputBox('Masukkan No Aset untuk dicari:');
if (!noAset) return;
var data = dataSheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0].toString() === noAset) { // Pastikan tipe data cocok
sheet.getRange('D3').setValue(data[i][0]);
sheet.getRange('D4').setValue(data[i][1]);
sheet.getRange('D5').setValue(data[i][2]);
sheet.getRange('D6').setValue(data[i][3]);
sheet.getRange('D7').setValue(data[i][4]);
sheet.getRange('D8').setValue(data[i][5]);
sheet.getRange('D9').setValue(data[i][6]).setNumberFormat("dd/MM/yyyy");
sheet.getRange('D10').setValue(data[i][7]);
sheet.getRange('D11').setValue(data[i][8]);
sheet.getRange('D12').setValue(data[i][9]);
sheet.getRange('D13').setValue(data[i][10]);
SpreadsheetApp.getUi().alert('Data aset ditemukan dan ditampilkan!');
return;
}
}

SpreadsheetApp.getUi().alert('No Aset tidak ditemukan!');
}

Hapus Aset

function hapusAset() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Aset');
if (!dataSheet) {
SpreadsheetApp.getUi().alert('Sheet Data Aset tidak ditemukan!');
return;
}
var noAset = sheet.getRange('D3').getValue();
if (!noAset) {
SpreadsheetApp.getUi().alert('Masukkan nomor Aset yang ingin dibatalkan.');
return;
}
var dataValues = dataSheet.getDataRange().getValues();
for (var i = 1; i < dataValues.length; i++) {
if (dataValues[i][0] === noAset) {
dataSheet.getRange(i + 1, 12).setValue("Non Aktif");
SpreadsheetApp.getUi().alert('Aset berhasil di Hapus!');
resetForm();
return;
}
}
SpreadsheetApp.getUi().alert('Nomor Aset tidak ditemukan!');
}

Cetak Label

function showCetakLabelAsetPopup() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var rawData = sheet.getRange('G3').getValue(); // Ambil data aset dari G3
var asetList = rawData.split(',').map(item => item.trim()); // Pisahkan dan trim spasi

Logger.log("Data mentah dari G3: " + rawData);
Logger.log("Data setelah split & trim: " + JSON.stringify(asetList));

if (asetList.length === 0 || asetList[0] === "") {
SpreadsheetApp.getUi().alert("Tidak ada data aset untuk dicetak!");
return;
}

var htmlTemplate = HtmlService.createTemplateFromFile('CetakLabelAset');
htmlTemplate.data = JSON.stringify(asetList); // Kirim data ke HTML

var output = htmlTemplate.evaluate().setWidth(400).setHeight(500);
SpreadsheetApp.getUi().showSidebar(output); // Menampilkan di sidebar
}

Halaman Cetak

<!DOCTYPE html>
<html>
<head>
<title>Cetak Label Aset</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin: 5px;
}
.container {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 20px;
}
.label {
border: 2px solid black;
padding: 10px;
justify-content: center;
width: 150px;
margin: 5px;
}
@media print {
#printButton {
display: none;
}
.label {
page-break-inside: avoid;
}
}
</style>
<script src="https://cdn.jsdelivr.net/npm/qrcodejs/qrcode.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
var asetList = JSON.parse('<?= data ?>'); // Ambil data aset dari Code.gs
console.log("Data Aset:", asetList); // Debugging

var container = document.getElementById("qrContainer");

asetList.forEach(aset => {
var labelDiv = document.createElement("div");
labelDiv.className = "label";

var qrDiv = document.createElement("div");
qrDiv.id = `qr-${aset}`;

new QRCode(qrDiv, {
text: aset,
width: 150,
height: 150
});

var label = document.createElement("p");
label.textContent = aset;

labelDiv.appendChild(qrDiv);
labelDiv.appendChild(label);
container.appendChild(labelDiv);
});
});

function printLabel() {
window.print();
setTimeout(function() {
google.script.host.close(); // Tutup sidebar setelah cetak
}, 500);
}
</script>
</head>
<body>
<h2>Cetak Label Aset</h2>
<div class="container" id="qrContainer"></div>
<br>
<button id="printButton" onclick="printLabel()">Cetak</button>
</body>
</html>


Reset form

function resetForm() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange('D4:D14').clearContent();
generateNoAset();
}




Generate no perawatan 

function generateNoPerawatan() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Perawatan');
if (!dataSheet) {
dataSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('Data Perawatan');
}
var year = new Date().getFullYear().toString().slice(-2);
var lastRow = dataSheet.getLastRow();
var lastNo = lastRow > 1 ? parseInt(dataSheet.getRange(lastRow, 1).getValue().slice(5)) : 0;
var newNo = ('000' + (lastNo + 1)).slice(-4);
var noPerawatan = "PRT" + year + newNo;
sheet.getRange('D3').setValue(noPerawatan);
sheet.getRange('D6').setValue(new Date()).setNumberFormat("dd/MM/yyyy");
}

Simpan Perawatan 

function saveDataPerawatan() {
var ui = SpreadsheetApp.getUi();
var response = ui.alert(
'Konfirmasi Penyimpanan',
'Apakah Anda yakin ingin menyimpan data ini? Data yang sudah dimasukkan tidak dapat dihapus.',
ui.ButtonSet.OK_CANCEL
);

if (response == ui.Button.CANCEL) {
ui.alert('Penyimpanan dibatalkan.');
return;
}

var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Perawatan');
if (!dataSheet) {
ui.alert('Sheet Data Perawatan tidak ditemukan!');
return;
}
var noPerawatan = sheet.getRange('D3').getValue();
var noAset = sheet.getRange('D4').getValue();
var status = sheet.getRange('D12').getValue();
var selesaiDate = status === "Selesai" ? new Date() : "";
var requiredFields = ['D3', 'D4', 'D5', 'D6', 'D7', 'D8', 'D9', 'D12'];
for (var i = 0; i < requiredFields.length; i++) {
if (!sheet.getRange(requiredFields[i]).getValue()) {
ui.alert('Gagal menyimpan! Semua kolom harus terisi.');
return;
}
}
var dataValues = dataSheet.getDataRange().getValues();
for (var i = 1; i < dataValues.length; i++) {
if (dataValues[i][1] === noAset && dataValues[i][7] === "Batal") {
ui.alert('Gagal menyimpan! No Aset ini masih dalam status "Batal" di Data Perawatan.');
return;
}
}
var data = [
noPerawatan,
noAset,
sheet.getRange('D5').getValue(),
sheet.getRange('D6').getValue(),
sheet.getRange('D7').getValue(),
sheet.getRange('D8').getValue(),
sheet.getRange('D9').getValue(),
sheet.getRange('D12').getValue(),
selesaiDate
];
for (var i = 1; i < dataValues.length; i++) {
if (dataValues[i][0] === noPerawatan) {
dataSheet.getRange(i + 1, 1, 1, 9).setValues([data]);
ui.alert('Data perawatan berhasil diperbarui!');
resetFormPerawatan();
return;
}
}
dataSheet.appendRow(data);
ui.alert('Data perawatan berhasil disimpan!');
resetFormPerawatan();
}

Pencarian data perawatan

function searchPerawatan() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Perawatan');
if (!dataSheet) {
SpreadsheetApp.getUi().alert('Sheet Data Perawatan tidak ditemukan!');
return;
}
var noPerawatan = Browser.inputBox('Masukkan No Perawatan untuk dicari:');
if (!noPerawatan) return;
var data = dataSheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0] === noPerawatan) {
sheet.getRange('D3').setValue(data[i][0]);
sheet.getRange('D4').setValue(data[i][1]);
sheet.getRange('D5').setValue(data[i][2]);
sheet.getRange('D6').setValue(data[i][3]);
sheet.getRange('D7').setValue(data[i][4]);
sheet.getRange('D8').setValue(data[i][5]);
sheet.getRange('D9').setValue(data[i][6]);
sheet.getRange('D12').setValue(data[i][7]);
SpreadsheetApp.getUi().alert('Data perawatan ditemukan dan ditampilkan!');
return;
}
}
SpreadsheetApp.getUi().alert('No Perawatan tidak ditemukan!');
}

function resetFormPerawatan() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange('D4:D12').clearContent();
generateNoPerawatan();
}

Cetak Perawatan 

function showCetakSuratPerawatanPopup() {
var data = getSuratDataPerawatan(); // Ambil data dari sheet
var htmlTemplate = HtmlService.createTemplateFromFile('CetakSuratPerawatan');
htmlTemplate.data = data; // Kirim data ke HTML
var output = htmlTemplate.evaluate().setWidth(600).setHeight(400);
SpreadsheetApp.getUi().showModalDialog(output, 'Cetak Surat Perawatan');
}


function getSuratDataPerawatan() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var rawTanggal = sheet.getRange('D6').getValue();
var formattedTanggal = formatTanggalPR(rawTanggal); // Ubah tanggal ke format teks

var data = {
noPerawatan: sheet.getRange('D3').getValue(),
noAset: sheet.getRange('D4').getValue(),
namaPerawatan: sheet.getRange('D5').getValue(),
tanggal: formattedTanggal, // Gunakan tanggal yang sudah diformat
deskripsi: sheet.getRange('D9').getValue(),
teknisi: sheet.getRange('D7').getValue(),
biaya: sheet.getRange('D8').getValue(),
status: sheet.getRange('D12').getValue()
};

return JSON.stringify(data);
}

function formatTanggalPR(tanggal) {
if (!(tanggal instanceof Date)) return tanggal; // Jika bukan Date, kembalikan apa adanya
var bulanIndo = [
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
];
var hari = tanggal.getDate();
var bulan = bulanIndo[tanggal.getMonth()];
var tahun = tanggal.getFullYear();
return hari + " " + bulan + " " + tahun;
}


function cetakSuratPerawatan() {
var data = getSuratDataPerawatan();
var html = HtmlService.createTemplateFromFile('CetakSuratPerawatan');
html.data = data;
return html.evaluate();
}

Halaman Cetat Perawatan

<!DOCTYPE html>
<html>
<head>
<title>Cetak Surat Perawatan</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin: 20px;
}
.container {
border: 2px solid black;
padding: 20px;
display: inline-block;
text-align: left;
}
h2 {
text-align: center;
text-decoration: underline;
}
.info {
margin-bottom: 10px;
}
.signature {
margin-top: 50px;
text-align: left;
}
@media print {
#printButton {
display: none;
}
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
var data = JSON.parse(<?= data ?>);

document.getElementById("noPerawatan").textContent = data.noPerawatan;
document.getElementById("teknisi").textContent = data.teknisi;
document.getElementById("tanggal").textContent = data.tanggal;
document.getElementById("noAset").textContent = data.noAset;
document.getElementById("namaPerawatan").textContent = data.namaPerawatan;
document.getElementById("deskripsi").textContent = data.deskripsi;
});

function printSuratPerawatan() {
window.print();
}
</script>
</head>
<body>
<div class="container">
<h2>SURAT PERAWATAN ASET</h2>
<p><strong>No. Perawatan:</strong> <span id="noPerawatan"></span></p>
<p><strong>Kepada:</strong> <span id="teknisi"></span></p>
<p>Jakarta, <span id="tanggal"></span></p>
<p>Dengan hormat,</p>
<p>Sehubungan dengan kebutuhan perawatan aset, kami menginformasikan bahwa perawatan untuk aset dengan detail sebagai berikut akan dilaksanakan:</p>
<div class="info">
<p><strong>No. Aset:</strong> <span id="noAset"></span></p>
<p><strong>Nama Perawatan:</strong> <span id="namaPerawatan"></span></p>
<p><strong>Deskripsi:</strong> <span id="deskripsi"></span></p>
</div>

<p>Kami mohon agar pihak terkait dapat mempersiapkan segala sesuatunya untuk kelancaran proses perawatan ini. Apabila ada pertanyaan atau informasi lebih lanjut, silakan menghubungi petugas aset.</p>

<p>Demikian surat jalan perawatan ini kami buat. Atas perhatian dan kerjasamanya, kami ucapkan terima kasih.</p>

<div class="signature">
<p><strong>Hormat kami,</strong></p>
<br><br>
<p>____________________</p>
<p>Petugas</p>
</div>
</div>
<br>
<button id="printButton" onclick="printSuratPerawatan()">Cetak</button>
</body>
</html>





Generate no peminjaman 

function generateNoPeminjaman() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Peminjaman');
if (!dataSheet) {
dataSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('Data Peminjaman');
}
var year = new Date().getFullYear().toString().slice(-2);
var lastRow = dataSheet.getLastRow();
var lastNo = lastRow > 1 ? parseInt(dataSheet.getRange(lastRow, 1).getValue().slice(5)) : 0;
var newNo = ('000' + (lastNo + 1)).slice(-4);
var noPeminjaman = "PJM" + year + newNo;
sheet.getRange('D3').setValue(noPeminjaman);
sheet.getRange('D6').setValue(new Date()).setNumberFormat("dd/MM/yyyy");
sheet.getRange('D7').setValue(new Date()).setNumberFormat("dd/MM/yyyy");
sheet.getRange('D12').setValue("Dipinjam");
sheet.getRange('D13').setValue("Terisi Otomatis Saat Dikembalikan");
}

Simpan data peminjaman

function saveDataPeminjaman() {
var ui = SpreadsheetApp.getUi();
var response = ui.alert(
'Konfirmasi Penyimpanan',
'Apakah Anda akan menyimpan data peminjaman? Data yang sudah dimasukkan tidak dapat dihapus.',
ui.ButtonSet.OK_CANCEL
);

if (response == ui.Button.CANCEL) {
ui.alert('Penyimpanan dibatalkan.');
return; // Keluar jika user membatalkan
}

var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Peminjaman');
if (!dataSheet) {
ui.alert('Sheet Data Peminjaman tidak ditemukan!');
return;
}

var noPeminjaman = sheet.getRange('D3').getValue();
var noAset = sheet.getRange('D4').getValue();
var status = sheet.getRange('D12').getValue();
var kembaliDate = status === "Dikembalikan" ? new Date() : "";

// Pastikan semua field penting terisi
var requiredFields = ['D3', 'D4', 'D5', 'D6', 'D7', 'D9', 'D12'];
for (var i = 0; i < requiredFields.length; i++) {
if (!sheet.getRange(requiredFields[i]).getValue()) {
ui.alert('Gagal menyimpan! Semua kolom wajib harus terisi.');
return;
}
}

// Cek apakah aset masih dalam status "Dipinjam"
var dataValues = dataSheet.getDataRange().getValues();
for (var i = 1; i < dataValues.length; i++) {
if (dataValues[i][1] === noAset && dataValues[i][7] === "Dipinjam") {
ui.alert('Gagal menyimpan! No Aset ini masih dalam status "Dipinjam" di Data Peminjaman.');
return;
}
}

var data = [
noPeminjaman,
noAset,
sheet.getRange('D5').getValue(),
sheet.getRange('D6').getValue(),
sheet.getRange('D7').getValue(),
sheet.getRange('D8').getValue(),
sheet.getRange('D9').getValue(),
status,
kembaliDate
];

// Perbarui data jika sudah ada
for (var i = 1; i < dataValues.length; i++) {
if (dataValues[i][0] === noPeminjaman) {
dataSheet.getRange(i + 1, 1, 1, 9).setValues([data]); // Perbaiki jumlah kolom
ui.alert('Data peminjaman berhasil diperbarui!');
resetFormPeminjaman();
return;
}
}

// Simpan data baru
dataSheet.appendRow(data);
ui.alert('Data peminjaman berhasil disimpan!');
resetFormPeminjaman();
}

function resetFormPeminjaman() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange('D4:D13').clearContent();
generateNoPeminjaman();
}


Pencarian data peminjaman

function searchPeminjaman() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Peminjaman');
if (!dataSheet) {
SpreadsheetApp.getUi().alert('Sheet Data Peminjaman tidak ditemukan!');
return;
}
var noPeminjaman = Browser.inputBox('Masukkan No Peminjaman untuk dicari:');
if (!noPeminjaman) return;
var data = dataSheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0] === noPeminjaman) {
sheet.getRange('D3').setValue(data[i][0]);
sheet.getRange('D4').setValue(data[i][1]);
sheet.getRange('D5').setValue(data[i][2]);
sheet.getRange('D6').setValue(data[i][3]);
sheet.getRange('D7').setValue(data[i][4]);
sheet.getRange('D8').setValue(data[i][5]);
sheet.getRange('D9').setValue(data[i][6]);
sheet.getRange('D12').setValue(data[i][7]);
sheet.getRange('D13').setValue(data[i][8]);
SpreadsheetApp.getUi().alert('Data peminjaman ditemukan dan ditampilkan!');
return;
}
}
SpreadsheetApp.getUi().alert('No Peminjaman tidak ditemukan!');
}

Pengembalian Peminjaman

function kembalikanPeminjaman() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data Peminjaman');

if (!dataSheet) {
SpreadsheetApp.getUi().alert('Sheet Data Peminjaman tidak ditemukan!');
return;
}

var noPeminjaman = sheet.getRange('D3').getValue().toString().trim();
if (!noPeminjaman) {
SpreadsheetApp.getUi().alert('Masukkan nomor peminjaman yang ingin dikembalikan.');
return;
}

var tglRencanaKembali = sheet.getRange('D7').getValue();
var StatusPeminjaman = sheet.getRange('D12').getValue();
var tglKembali = new Date(); // Tanggal hari ini

// Konversi tanggal ke format YYYYMMDD agar waktu tidak mempengaruhi perbandingan
function formatDateOnly(date) {
if (!(date instanceof Date)) return null;
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
}

var tglRencanaKembaliFormatted = formatDateOnly(tglRencanaKembali);
var tglKembaliFormatted = formatDateOnly(tglKembali);

var status = "Sesuai";
if (tglRencanaKembaliFormatted && tglKembaliFormatted) {
if (tglRencanaKembaliFormatted < tglKembaliFormatted) {
status = "Terlambat";
}
} else {
SpreadsheetApp.getUi().alert('Tanggal rencana kembali tidak valid!');
return;
}

var dataValues = dataSheet.getDataRange().getValues();
for (var i = 1; i < dataValues.length; i++) {
if (dataValues[i][0].toString().trim() === noPeminjaman && dataValues[i][7] === "Dipinjam") {
// Update status peminjaman di Data Peminjaman
dataSheet.getRange(i + 1, 8).setValue("Selesai"); // Kolom Status Peminjaman
dataSheet.getRange(i + 1, 9).setValue(tglKembali).setNumberFormat("dd/MM/yyyy"); // Kolom Tanggal Kembali
dataSheet.getRange(i + 1, 10).setValue(status); // Kolom Keterangan

SpreadsheetApp.getUi().alert('Peminjaman berhasil dikembalikan!');
resetFormPeminjaman();
return;
}
}

SpreadsheetApp.getUi().alert('Gagal Pengembalian cek status peminjaman!');
}

Cetak peminjaman

function getBeritaAcaraData() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var rawTanggal = sheet.getRange('D6').getValue();
var formattedTanggal = formatTanggalPM(rawTanggal);
var rawPengembalian = sheet.getRange('D7').getValue();
var formattedPengembalian = formatTanggalPM(rawPengembalian);
var data = {
tanggal: formattedTanggal,
lokasi: sheet.getRange('D10').getValue(),
pemberiPinjaman: sheet.getRange('D11').getValue(),
peminjam: sheet.getRange('D5').getValue(),
noPeminjaman: sheet.getRange('D3').getValue(),
noAset: sheet.getRange('D4').getValue(),
tanggalPeminjaman: formattedTanggal,
rencanaPengembalian: formattedPengembalian,
biaya: sheet.getRange('D8').getValue(),
keterangan: sheet.getRange('D9').getValue(),
kondisi: sheet.getRange('D12').getValue()
};
return JSON.stringify(data);
}

function formatTanggalPM(tanggal) {
if (!(tanggal instanceof Date)) return tanggal;
var bulanIndo = [
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
];
var hari = tanggal.getDate();
var bulan = bulanIndo[tanggal.getMonth()];
var tahun = tanggal.getFullYear();
return hari + " " + bulan + " " + tahun;
}

function showCetakBeritaAcaraPopup() {
var data = getBeritaAcaraData();
var htmlTemplate = HtmlService.createTemplateFromFile('CetakBeritaAcara');
htmlTemplate.data = data;
var output = htmlTemplate.evaluate().setWidth(600).setHeight(400);
SpreadsheetApp.getUi().showModalDialog(output, 'Cetak Berita Acara');
}

Halaman cetak berita acara peminjaman

<!DOCTYPE html>
<html>
<head>
<title>Cetak Berita Acara Peminjaman</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin: 20px;
}
.container {
border: 2px solid black;
padding: 20px;
display: inline-block;
text-align: left;
}
h2 {
text-align: center;
text-decoration: underline;
}
.signature {
margin-top: 50px;
text-align: left;
}
@media print {
#printButton {
display: none;
}
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
var data = JSON.parse('<?= data ?>');
document.querySelectorAll("#tanggal").forEach(el => el.textContent = data.tanggal || "Data tidak tersedia");
document.querySelectorAll("#peminjam").forEach(el => el.textContent = data.peminjam || "Data tidak tersedia");
document.getElementById("pemberiPinjaman").textContent = data.pemberiPinjaman || "Data tidak tersedia";
document.getElementById("noPeminjaman").textContent = data.noPeminjaman || "Data tidak tersedia";
document.getElementById("noAset").textContent = data.noAset || "Data tidak tersedia";
document.getElementById("tanggalPeminjaman").textContent = data.tanggalPeminjaman || "Data tidak tersedia";
document.getElementById("rencanaPengembalian").textContent = data.rencanaPengembalian || "Data tidak tersedia";
document.getElementById("keterangan").textContent = data.keterangan || "Data tidak tersedia";
document.getElementById("kondisi").textContent = data.kondisi || "Data tidak tersedia";
});

function printBeritaAcara() {
window.print();
}
</script>
</head>
<body>
<div class="container">
<h2>BERITA ACARA PEMINJAMAN</h2>
<p>Pada hari ini, <span id="tanggal"></span>, telah dilaksanakan serah terima aset dari <span id="pemberiPinjaman"></span> kepada <span id="peminjam"></span>.</p>
<h3>1. DATA PEMINJAMAN</h3>
<p><strong>Nomor Peminjaman:</strong> <span id="noPeminjaman"></span></p>
<p><strong>Nomor Aset:</strong> <span id="noAset"></span></p>
<p><strong>Tanggal Peminjaman:</strong> <span id="tanggalPeminjaman"></span></p>
<p><strong>Rencana Pengembalian:</strong> <span id="rencanaPengembalian"></span></p>
<p><strong>Keterangan:</strong> <span id="keterangan"></span></p>
<h3>2. KONDISI ASET</h3>
<p>Aset yang dipinjamkan dalam kondisi <span id="kondisi"></span>. Pihak peminjam bertanggung jawab atas kerusakan atau kehilangan aset selama masa peminjaman.</p>
<h3>3. PENUTUP</h3>
<p>Berita acara ini dibuat dan ditandatangani oleh kedua belah pihak sebagai bukti sah telah dilaksanakannya peminjaman aset.</p>
<div class="signature">
<p><strong>Jakarta, <span id="tanggal"></span></strong></p>
<p><strong>Petugas</strong></p>
<br><br>
<p>(____________________)</p>
<br>
<p><strong>Peminjam</strong></p>
<br><br>
<p>(<strong><span id="peminjam"></span></strong>)</p>
</div>
</div>
<br>
<button id="printButton" onclick="printBeritaAcara()">Cetak</button>
</body>
</html>


Laporan

function tampilkanAset() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var dataSheet = ss.getSheetByName('Data Aset');
if (!dataSheet) {
SpreadsheetApp.getUi().alert('Sheet "Data Aset" tidak ditemukan!');
return;
}

// Ambil filter tanggal
var startDate = sheet.getRange('D3').getValue();
var endDate = sheet.getRange('D4').getValue();

if (!(startDate instanceof Date) || !(endDate instanceof Date)) {
SpreadsheetApp.getUi().alert('Masukkan tanggal yang valid di sel D3 dan D4.');
return;
}

// Konversi tanggal
var startDateStr = formatTanggalTanpaWaktu(startDate);
var endDateStr = formatTanggalTanpaWaktu(endDate);

var data = dataSheet.getDataRange().getValues();
var filteredData = [];

for (var i = 1; i < data.length; i++) {
var purchaseDate = data[i][6]; // Tanggal Pembelian

if (purchaseDate instanceof Date) {
var purchaseDateStr = formatTanggalTanpaWaktu(purchaseDate); // Hilangkan waktu

if (purchaseDateStr >= startDateStr && purchaseDateStr <= endDateStr) {
filteredData.push(data[i]);
}
}
}

if (filteredData.length === 0) {
SpreadsheetApp.getUi().alert('Tidak ada data aset yang sesuai dengan filter.');
return;
}

var printSheet = ss.getSheetByName('Print Aset');
if (!printSheet) {
printSheet = ss.insertSheet('Print Aset');
} else {
printSheet.clearContents();
}

var headers = ['No Aset', 'Nama Aset', 'No Seri', 'Kategori', 'Lokasi', 'Ruang', 'Tanggal Pembelian', 'Supplier', 'Harga Perolehan', 'Masa Manfaat (Tahun)', 'Kondisi', 'Status', 'Harga Sekarang'];
printSheet.getRange(1, 1, 1, headers.length).setValues([headers]);

// Menampilkan hasil filter tanpa nomor urut
printSheet.getRange(2, 1, filteredData.length, headers.length).setValues(filteredData);

SpreadsheetApp.getUi().alert('Data aset telah difilter dan siap dicetak di sheet "Print Aset".');
}


function formatTanggalTanpaWaktu(date) {
var year = date.getFullYear();
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var day = ('0' + date.getDate()).slice(-2);
return year + '-' + month + '-' + day; // Format YYYY-MM-DD
}


function getPrintAsetData() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Print Aset');
if (!sheet) return [];

var data = sheet.getDataRange().getValues();
if (data.length <= 1) return []; // Jika hanya ada header, kembalikan array kosong

data.shift(); // Hapus header

for (var i = 0; i < data.length; i++) {
var dateValue = data[i][6];
data[i][6] = formatTanggal(dateValue);
}

return JSON.stringify(data); // format JSON
}

function formatTanggal(date) {
if (date instanceof Date) {
var year = date.getFullYear();
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var day = ('0' + date.getDate()).slice(-2);
return day + '/' + month + '/' + year;
}
return date;
}

function printAset() {
var htmlOutput = HtmlService.createHtmlOutputFromFile('CetakDataAset')
.setWidth(1000)
.setHeight(600);
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Print Data Aset');
}

function resetLaporan() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange('D3:D4').clearContent();
resetPrintAset();
sheet.getRange('D3').setValue(new Date()).setNumberFormat("dd/MM/yyyy");
sheet.getRange('D4').setValue(new Date()).setNumberFormat("dd/MM/yyyy");
}
function resetPrintAset() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Print Aset');
sheet.getRange('A:N').clearContent();
}

Cetak Halaman Laporan

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Print Data Aset</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: Arial, sans-serif;
}

body {
background-color: #f4f4f4;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 20px;
}

.container {
width: 100%;
max-width: 1500px;
background: #fff;
padding: 20px;
border-radius: 10px;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
overflow-x: auto;
}

h2 {
color: #333;
margin-bottom: 20px;
text-align: center;
}

table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
}

th, td {
padding: 12px;
text-align: left;
border: 1px solid #ddd;
}

thead th {
background-color: black !important;
color: white !important;
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}

tr:nth-child(even) {
background-color: #f9f9f9;
}

tr:hover {
background-color: #eaeaea;
}

.print-btn {
display: inline-block;
margin-top: 20px;
padding: 12px 20px;
font-size: 16px;
background-color: #28a745;
color: white;
border: none;
cursor: pointer;
border-radius: 5px;
transition: background 0.3s;
}

.print-btn:hover {
background-color: #218838;
}

/* Css saat dicetak */
@media print {
body {
background: white;
padding: 0;
}

.container {
width: 100%;
box-shadow: none;
}

h2 {
text-align: center;
color: black;
}

.print-btn {
display: none;
}

table {
width: 100%;
page-break-inside: auto;
}

thead {
display: table-header-group;
}

tbody {
display: table-row-group;
}

tr {
page-break-inside: avoid;
}

td, th {
font-size: 12px;
white-space: nowrap;
}
}

</style>
<script>
function printPage() {
window.print();
}

function loadData() {
google.script.run.withSuccessHandler(function(response) {
var data = JSON.parse(response);
var tbody = document.getElementById("data-container");
tbody.innerHTML = "";

if (data.length === 0) {
tbody.innerHTML = "<tr><td colspan='14' style='text-align:center;'>Tidak ada data yang tersedia.</td></tr>";
return;
}

data.forEach((row, index) => {
var tr = document.createElement("tr");

// Tambahkan nomor urut
var tdNo = document.createElement("td");
tdNo.textContent = index + 1;
tr.appendChild(tdNo);

row.forEach(cell => {
var td = document.createElement("td");
td.textContent = cell;
tr.appendChild(td);
});

tbody.appendChild(tr);
});
}).getPrintAsetData();
}

window.onload = loadData;
</script>
</head>
<body>
<div class="container">
<h2>Data Aset</h2>
<table>
<thead>
<tr>
<th>No</th>
<th>No Aset</th>
<th>Nama Aset</th>
<th>No Seri</th>
<th>Kategori</th>
<th>Lokasi</th>
<th>Ruang</th>
<th>Tanggal Pembelian</th>
<th>Supplier</th>
<th>Harga Perolehan</th>
<th>Masa Manfaat</th>
<th>Kondisi</th>
<th>Status</th>
<th>Harga Sekarang</th>
</tr>
</thead>
<tbody id="data-container">
<tr><td colspan="13" style="text-align:center;">Sedang Memuat data...</td></tr>
</tbody>
</table>
<button class="print-btn" onclick="printPage()">Print</button>
</div>
</body>
</html>



Newest Post