Website SPPD Online Menggunakan Apps Script
1. Copy Spreadsheet (Klik Disini)
2. Pada Spreadsheet yang telah di copy di atas terdapat beberapa sheet yaitu :
- sheet login
- sheet Data
- sheet Pangkat
- sheet Rekening
- sheet Tanda Tangan
- sheet SPJ
3. Buatlah lembar kerja Apps Script dengan cara klik menu Ekstensi/Extensions lalu pilih Apps Script.
4. Pada lembar kerja Apps Script terdapat beberapa file yaitu :
- Code.gs
- Laporan.gs
- SPJ.gs
- header.html
- login.html
- register.html
- main.html
- formsppd.html
- laporan.html
- laporanspj.html
- sppdkosong.html
- datapegawai.html
- tandatangan.html
- rekeningbelanja.html
- visit.html
5. Copy dan pastekan script di bawah ini ke Code.gs
Masukkan Password Untuk Melihat Script (Password ada di dalam video)
//Source Code by : www.javabitpro.com
let MySheets = SpreadsheetApp.getActiveSpreadsheet();
let LoginSheet = MySheets.getSheetByName("login");
function doGet(e) {
var output = HtmlService.createTemplateFromFile('login');
var sess = getSession();
if (sess.loggedIn) {
let page = e.parameter.page;
if (page == null) page = "main";
var output = HtmlService.createTemplateFromFile(page);
}
return output.evaluate();
}
function includeHeader() {
return HtmlService.createTemplateFromFile("header.html").evaluate().getContent();
}
function include(filename) {
return HtmlService.createHtmlOutputFromFile(filename)
.getContent();
}
function myURL() {
return ScriptApp.getService().getUrl();
}
function setSession(session) {
var sId = Session.getTemporaryActiveUserKey();
var uProp = PropertiesService.getUserProperties();
uProp.setProperty(sId, JSON.stringify(session));
}
function getSession() {
var sId = Session.getTemporaryActiveUserKey();
var uProp = PropertiesService.getUserProperties();
var sData = uProp.getProperty(sId);
return sData ? JSON.parse(sData) : { loggedIn: false };
}
function loginUser(pUID, pPassword) {
if (loginCheck(pUID, pPassword)) {
var sess = getSession();
sess.loggedIn = true;
sess.userId = pUID; // Simpan ID pengguna ke sesi
// Cek apakah pengguna adalah admin
sess.isAdmin = (pUID === 'Admin123' && pPassword === 'Admin123');
setSession(sess);
return 'success';
} else {
return 'failure';
}
}
function isUserAdmin() {
var sess = getSession();
return sess.isAdmin || false; // Kembalikan status admin
}
function getUserId() {
var sess = getSession();
return sess.userId ? sess.userId : '';
}
function logoutUser() {
var sess = getSession();
sess.loggedIn = false;
setSession(sess);
}
function loginCheck(pUID, pPassword) {
let LoginPass = false;
let ReturnData = LoginSheet.getRange("A:A").createTextFinder(pUID).matchEntireCell(true).findAll();
ReturnData.forEach(function (range) {
let StartRow = range.getRow();
let TmpPass = LoginSheet.getRange(StartRow, 2).getValue();
if (TmpPass == pPassword) {
LoginPass = true;
}
});
return LoginPass;
}
function UserRegister(pUID, pPassword, pName) {
let RetMsg = '';
let ReturnData = LoginSheet.getRange("A:A").createTextFinder(pUID).matchEntireCell(true).findAll();
let StartRow = 0;
ReturnData.forEach(function (range) {
StartRow = range.getRow();
});
if (StartRow > 0) {
RetMsg = 'danger, User Already Exists';
} else {
LoginSheet.appendRow([pUID, pPassword, pName]);
RetMsg = 'success, User Successfully Registered';
}
return RetMsg;
}
function OpenPage(PageName) {
return HtmlService.createHtmlOutputFromFile(PageName).getContent();
}
//END LOGIN DAN REGISTER
//INPUT DATA
function saveData(formData) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
if (formData.pengikut.length === 0) {
// Jika tidak ada pengikut, tetap simpan Nomor, Nama, NIP, Pangkat, dan Jabatan tanpa pengikut
sheet.appendRow([formData.nomor, formData.nomorsppd, formData.dasar, formData.tingkatbiaya, formData.maksud, formData.alatangkut, formData.asalberangkat, formData.tujuan, formData.tanggalberangkat, formData.tanggalpulang, formData.lamaperjalanan, formData.instansi, formData.jenisSppdDropdown, formData.kegiatanDropdown, formData.subKegiatanDropdown, formData.kodeRekeningDropdown, formData.lainlain, formData.tanggalbuat, formData.nama, formData.nip, formData.pangkat, formData.jabatan, '', '']);
} else {
// Simpan Nomor, Nama, NIP, Pangkat, Jabatan di baris pertama dengan pengikut pertama
var firstRow = [formData.nomor, formData.nomorsppd, formData.dasar, formData.tingkatbiaya, formData.maksud, formData.alatangkut, formData.asalberangkat, formData.tujuan, formData.tanggalberangkat, formData.tanggalpulang, formData.lamaperjalanan, formData.instansi, formData.jenisSppdDropdown, formData.kegiatanDropdown, formData.subKegiatanDropdown, formData.kodeRekeningDropdown, formData.lainlain, formData.tanggalbuat, formData.nama, formData.nip, formData.pangkat, formData.jabatan, formData.pengikut[0].pengikut,formData.pengikut[0].nippengikut,formData.pengikut[0].pangkatpengikut,formData.pengikut[0].jabatanpengikut, formData.pengikut[0].tanggallahir];
sheet.appendRow(firstRow);
// Baris berikutnya hanya untuk pengikut dan tanggal lahir, kolom lainnya dikosongkan
for (var i = 1; i < formData.pengikut.length; i++) {
sheet.appendRow([formData.nomor, formData.nomorsppd, formData.dasar, formData.tingkatbiaya, formData.maksud, formData.alatangkut, formData.asalberangkat, formData.tujuan, formData.tanggalberangkat, formData.tanggalpulang, formData.lamaperjalanan, formData.instansi,formData.jenisSppdDropdown, formData.kegiatanDropdown, formData.subKegiatanDropdown, formData.kodeRekeningDropdown, formData.lainlain, formData.tanggalbuat, formData.nama, formData.nip, formData.pangkat, formData.jabatan, formData.pengikut[i].pengikut,formData.pengikut[i].nippengikut,formData.pengikut[i].pangkatpengikut,formData.pengikut[i].jabatanpengikut, formData.pengikut[i].tanggallahir]);
}
}
}
function getPangkatData() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
var data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 7).getValues(); // Ambil data Nama, NIP, Pangkat, Jabatan, Tanggal Lahir, Instansi
// Konversi semua data ke string jika ada tanggal
for (var i = 0; i < data.length; i++) {
data[i][4] = formatDate(data[i][4]); // Mengonversi tanggal lahir (kolom ke-5) ke string
}
return data; // Mengembalikan array data ke client-side
}
function getPengikutNames() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
var names = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1).getValues(); // Ambil data Nama
return names.flat(); // Mengembalikan array satu dimensi
}
function getDataByName(name) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
var data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 6).getValues(); // Ambil data Nama, NIP, Pangkat, Jabatan, Tanggal Lahir, Instansi
var result = null;
data.forEach(row => {
if (row[0] === name) {
result = {
nama: row[0],
nip: row[1],
pangkat: row[2],
jabatan: row[3],
tanggalLahir: formatDate(row[4])// Pastikan menjadi string
};
}
});
return result; // Kembalikan data sebagai objek
}
function getRekeningData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Rekening");
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 4).getValues(); // Mengambil data dari kolom A hingga D
return data; // Mengembalikan array berisi data Kegiatan, SubKegiatan, KodeRekening, dan SubRekening
}
//END INPUT DATA
// Fungsi untuk mengubah tipe date menjadi string
function formatDate(date) {
if (date instanceof Date) {
return Utilities.formatDate(date, Session.getScriptTimeZone(), "dd-MM-yyyy"); // Format sesuai kebutuhan
}
return date; // Kembalikan nilai asli jika bukan tanggal
}
//CRUD Pegawai
// Fungsi untuk mengambil data dari sheet
function getDataPegawai() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
const data = sheet.getDataRange().getValues();
// Mengonversi tanggal ke format string
return data.slice(1).map(row => {
// Mengubah tanggal ke string (format: YYYY-MM-DD)
if (row[4] instanceof Date) {
const dateString = Utilities.formatDate(row[4], Session.getScriptTimeZone(), "yyyy-MM-dd");
row[4] = dateString;
}
return row;
});
}
// Fungsi untuk menambahkan data
function addDataPegawai(nama, nip, pangkat, jabatan, tanggalLahir) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
sheet.appendRow([nama, nip, pangkat, jabatan, tanggalLahir]);
return getDataPegawai(); // Kembali dengan data terbaru
}
// Fungsi untuk mengupdate data
function updateDataPegawai(rowIndex, nama, nip, pangkat, jabatan, tanggalLahir) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
// Jika tanggal lahir adalah string, konversi kembali ke format Date
const dateValue = new Date(tanggalLahir); // Ubah kembali ke Date jika diperlukan
sheet.getRange(rowIndex + 2, 1, 1, 5).setValues([[nama, nip, pangkat, jabatan, dateValue]]);
return getDataPegawai(); // Kembali dengan data terbaru
}
// Fungsi untuk menghapus data
function deleteDataPegawai(rowIndex) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
sheet.deleteRow(rowIndex + 2); // Menghapus data berdasarkan index
return getDataPegawai(); // Kembali dengan data terbaru
}
//CRUD Tanda Tangan
// Fungsi untuk mendapatkan data dari sheet Tanda Tangan
function getDataTandaTangan() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 7).getValues(); // Mengambil semua data kecuali header
return data;
}
// Fungsi untuk menambahkan data ke sheet Tanda Tangan
function addDataTandaTangan(jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
sheet.appendRow([jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2]);
return getDataTandaTangan(); // Mengembalikan data terbaru
}
// Fungsi untuk mengupdate data Tanda Tangan
function updateDataTandaTangan(rowIndex, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
sheet.getRange(rowIndex + 2, 1, 1, 7).setValues([[jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2]]);
return getDataTandaTangan(); // Mengembalikan data terbaru
}
// Fungsi untuk menghapus data dari sheet Tanda Tangan
function deleteDataTandaTangan(rowIndex) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
sheet.deleteRow(rowIndex + 2); // Menghapus baris (indeks + 2 karena header berada di baris pertama)
return getDataTandaTangan(); // Mengembalikan data terbaru
}
//CRUD Rekening Belanja
// Fungsi untuk mengambil data dari sheet Rekening
function getDataRekening() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rekening');
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 4).getValues();
return data;
}
// Fungsi untuk menambah data baru ke sheet Rekening
function addDataRekening(jenisSPPD, kegiatan, subKegiatan, kodeRekening) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rekening');
sheet.appendRow([jenisSPPD, kegiatan, subKegiatan, kodeRekening]);
return getDataRekening(); // Kembali dengan data terbaru
}
// Fungsi untuk mengupdate data di sheet Rekening
function updateDataRekening(rowIndex, jenisSPPD, kegiatan, subKegiatan, kodeRekening) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rekening');
sheet.getRange(rowIndex + 2, 1, 1, 4).setValues([[jenisSPPD, kegiatan, subKegiatan, kodeRekening]]);
return getDataRekening(); // Kembali dengan data terbaru
}
// Fungsi untuk menghapus data dari sheet Rekening
function deleteDataRekening(rowIndex) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rekening');
sheet.deleteRow(rowIndex + 2);
return getDataRekening(); // Kembali dengan data terbaru
}
//Source Code by : www.javabitpro.com
let MySheets = SpreadsheetApp.getActiveSpreadsheet();
let LoginSheet = MySheets.getSheetByName("login");
function doGet(e) {
var output = HtmlService.createTemplateFromFile('login');
var sess = getSession();
if (sess.loggedIn) {
let page = e.parameter.page;
if (page == null) page = "main";
var output = HtmlService.createTemplateFromFile(page);
}
return output.evaluate();
}
function includeHeader() {
return HtmlService.createTemplateFromFile("header.html").evaluate().getContent();
}
function include(filename) {
return HtmlService.createHtmlOutputFromFile(filename)
.getContent();
}
function myURL() {
return ScriptApp.getService().getUrl();
}
function setSession(session) {
var sId = Session.getTemporaryActiveUserKey();
var uProp = PropertiesService.getUserProperties();
uProp.setProperty(sId, JSON.stringify(session));
}
function getSession() {
var sId = Session.getTemporaryActiveUserKey();
var uProp = PropertiesService.getUserProperties();
var sData = uProp.getProperty(sId);
return sData ? JSON.parse(sData) : { loggedIn: false };
}
function loginUser(pUID, pPassword) {
if (loginCheck(pUID, pPassword)) {
var sess = getSession();
sess.loggedIn = true;
sess.userId = pUID; // Simpan ID pengguna ke sesi
// Cek apakah pengguna adalah admin
sess.isAdmin = (pUID === 'Admin123' && pPassword === 'Admin123');
setSession(sess);
return 'success';
} else {
return 'failure';
}
}
function isUserAdmin() {
var sess = getSession();
return sess.isAdmin || false; // Kembalikan status admin
}
function getUserId() {
var sess = getSession();
return sess.userId ? sess.userId : '';
}
function logoutUser() {
var sess = getSession();
sess.loggedIn = false;
setSession(sess);
}
function loginCheck(pUID, pPassword) {
let LoginPass = false;
let ReturnData = LoginSheet.getRange("A:A").createTextFinder(pUID).matchEntireCell(true).findAll();
ReturnData.forEach(function (range) {
let StartRow = range.getRow();
let TmpPass = LoginSheet.getRange(StartRow, 2).getValue();
if (TmpPass == pPassword) {
LoginPass = true;
}
});
return LoginPass;
}
function UserRegister(pUID, pPassword, pName) {
let RetMsg = '';
let ReturnData = LoginSheet.getRange("A:A").createTextFinder(pUID).matchEntireCell(true).findAll();
let StartRow = 0;
ReturnData.forEach(function (range) {
StartRow = range.getRow();
});
if (StartRow > 0) {
RetMsg = 'danger, User Already Exists';
} else {
LoginSheet.appendRow([pUID, pPassword, pName]);
RetMsg = 'success, User Successfully Registered';
}
return RetMsg;
}
function OpenPage(PageName) {
return HtmlService.createHtmlOutputFromFile(PageName).getContent();
}
//END LOGIN DAN REGISTER
//INPUT DATA
function saveData(formData) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
if (formData.pengikut.length === 0) {
// Jika tidak ada pengikut, tetap simpan Nomor, Nama, NIP, Pangkat, dan Jabatan tanpa pengikut
sheet.appendRow([formData.nomor, formData.nomorsppd, formData.dasar, formData.tingkatbiaya, formData.maksud, formData.alatangkut, formData.asalberangkat, formData.tujuan, formData.tanggalberangkat, formData.tanggalpulang, formData.lamaperjalanan, formData.instansi, formData.jenisSppdDropdown, formData.kegiatanDropdown, formData.subKegiatanDropdown, formData.kodeRekeningDropdown, formData.lainlain, formData.tanggalbuat, formData.nama, formData.nip, formData.pangkat, formData.jabatan, '', '']);
} else {
// Simpan Nomor, Nama, NIP, Pangkat, Jabatan di baris pertama dengan pengikut pertama
var firstRow = [formData.nomor, formData.nomorsppd, formData.dasar, formData.tingkatbiaya, formData.maksud, formData.alatangkut, formData.asalberangkat, formData.tujuan, formData.tanggalberangkat, formData.tanggalpulang, formData.lamaperjalanan, formData.instansi, formData.jenisSppdDropdown, formData.kegiatanDropdown, formData.subKegiatanDropdown, formData.kodeRekeningDropdown, formData.lainlain, formData.tanggalbuat, formData.nama, formData.nip, formData.pangkat, formData.jabatan, formData.pengikut[0].pengikut,formData.pengikut[0].nippengikut,formData.pengikut[0].pangkatpengikut,formData.pengikut[0].jabatanpengikut, formData.pengikut[0].tanggallahir];
sheet.appendRow(firstRow);
// Baris berikutnya hanya untuk pengikut dan tanggal lahir, kolom lainnya dikosongkan
for (var i = 1; i < formData.pengikut.length; i++) {
sheet.appendRow([formData.nomor, formData.nomorsppd, formData.dasar, formData.tingkatbiaya, formData.maksud, formData.alatangkut, formData.asalberangkat, formData.tujuan, formData.tanggalberangkat, formData.tanggalpulang, formData.lamaperjalanan, formData.instansi,formData.jenisSppdDropdown, formData.kegiatanDropdown, formData.subKegiatanDropdown, formData.kodeRekeningDropdown, formData.lainlain, formData.tanggalbuat, formData.nama, formData.nip, formData.pangkat, formData.jabatan, formData.pengikut[i].pengikut,formData.pengikut[i].nippengikut,formData.pengikut[i].pangkatpengikut,formData.pengikut[i].jabatanpengikut, formData.pengikut[i].tanggallahir]);
}
}
}
function getPangkatData() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
var data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 7).getValues(); // Ambil data Nama, NIP, Pangkat, Jabatan, Tanggal Lahir, Instansi
// Konversi semua data ke string jika ada tanggal
for (var i = 0; i < data.length; i++) {
data[i][4] = formatDate(data[i][4]); // Mengonversi tanggal lahir (kolom ke-5) ke string
}
return data; // Mengembalikan array data ke client-side
}
function getPengikutNames() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
var names = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1).getValues(); // Ambil data Nama
return names.flat(); // Mengembalikan array satu dimensi
}
function getDataByName(name) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
var data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 6).getValues(); // Ambil data Nama, NIP, Pangkat, Jabatan, Tanggal Lahir, Instansi
var result = null;
data.forEach(row => {
if (row[0] === name) {
result = {
nama: row[0],
nip: row[1],
pangkat: row[2],
jabatan: row[3],
tanggalLahir: formatDate(row[4])// Pastikan menjadi string
};
}
});
return result; // Kembalikan data sebagai objek
}
function getRekeningData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Rekening");
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 4).getValues(); // Mengambil data dari kolom A hingga D
return data; // Mengembalikan array berisi data Kegiatan, SubKegiatan, KodeRekening, dan SubRekening
}
//END INPUT DATA
// Fungsi untuk mengubah tipe date menjadi string
function formatDate(date) {
if (date instanceof Date) {
return Utilities.formatDate(date, Session.getScriptTimeZone(), "dd-MM-yyyy"); // Format sesuai kebutuhan
}
return date; // Kembalikan nilai asli jika bukan tanggal
}
//CRUD Pegawai
// Fungsi untuk mengambil data dari sheet
function getDataPegawai() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
const data = sheet.getDataRange().getValues();
// Mengonversi tanggal ke format string
return data.slice(1).map(row => {
// Mengubah tanggal ke string (format: YYYY-MM-DD)
if (row[4] instanceof Date) {
const dateString = Utilities.formatDate(row[4], Session.getScriptTimeZone(), "yyyy-MM-dd");
row[4] = dateString;
}
return row;
});
}
// Fungsi untuk menambahkan data
function addDataPegawai(nama, nip, pangkat, jabatan, tanggalLahir) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
sheet.appendRow([nama, nip, pangkat, jabatan, tanggalLahir]);
return getDataPegawai(); // Kembali dengan data terbaru
}
// Fungsi untuk mengupdate data
function updateDataPegawai(rowIndex, nama, nip, pangkat, jabatan, tanggalLahir) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
// Jika tanggal lahir adalah string, konversi kembali ke format Date
const dateValue = new Date(tanggalLahir); // Ubah kembali ke Date jika diperlukan
sheet.getRange(rowIndex + 2, 1, 1, 5).setValues([[nama, nip, pangkat, jabatan, dateValue]]);
return getDataPegawai(); // Kembali dengan data terbaru
}
// Fungsi untuk menghapus data
function deleteDataPegawai(rowIndex) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pangkat');
sheet.deleteRow(rowIndex + 2); // Menghapus data berdasarkan index
return getDataPegawai(); // Kembali dengan data terbaru
}
//CRUD Tanda Tangan
// Fungsi untuk mendapatkan data dari sheet Tanda Tangan
function getDataTandaTangan() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 7).getValues(); // Mengambil semua data kecuali header
return data;
}
// Fungsi untuk menambahkan data ke sheet Tanda Tangan
function addDataTandaTangan(jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
sheet.appendRow([jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2]);
return getDataTandaTangan(); // Mengembalikan data terbaru
}
// Fungsi untuk mengupdate data Tanda Tangan
function updateDataTandaTangan(rowIndex, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
sheet.getRange(rowIndex + 2, 1, 1, 7).setValues([[jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2]]);
return getDataTandaTangan(); // Mengembalikan data terbaru
}
// Fungsi untuk menghapus data dari sheet Tanda Tangan
function deleteDataTandaTangan(rowIndex) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
sheet.deleteRow(rowIndex + 2); // Menghapus baris (indeks + 2 karena header berada di baris pertama)
return getDataTandaTangan(); // Mengembalikan data terbaru
}
//CRUD Rekening Belanja
// Fungsi untuk mengambil data dari sheet Rekening
function getDataRekening() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rekening');
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 4).getValues();
return data;
}
// Fungsi untuk menambah data baru ke sheet Rekening
function addDataRekening(jenisSPPD, kegiatan, subKegiatan, kodeRekening) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rekening');
sheet.appendRow([jenisSPPD, kegiatan, subKegiatan, kodeRekening]);
return getDataRekening(); // Kembali dengan data terbaru
}
// Fungsi untuk mengupdate data di sheet Rekening
function updateDataRekening(rowIndex, jenisSPPD, kegiatan, subKegiatan, kodeRekening) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rekening');
sheet.getRange(rowIndex + 2, 1, 1, 4).setValues([[jenisSPPD, kegiatan, subKegiatan, kodeRekening]]);
return getDataRekening(); // Kembali dengan data terbaru
}
// Fungsi untuk menghapus data dari sheet Rekening
function deleteDataRekening(rowIndex) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rekening');
sheet.deleteRow(rowIndex + 2);
return getDataRekening(); // Kembali dengan data terbaru
}
6. Copy dan pastekan script di bawah ini ke Laporan.gs
Masukkan Password Untuk Melihat Script (Password sama dengan di atas)
//Source Code by www.javabitpro.com
function getData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const data = sheet.getDataRange().getValues();
const headers = data[0];
// Mendapatkan userId dari sesi
const userId = getUserId();
const results = data.slice(1).map(row => {
let rowData = {};
headers.forEach((header, index) => {
if (header.includes("Tanggal")) {
rowData[header] = row[index] instanceof Date ? row[index].toLocaleDateString() : row[index];
} else {
rowData[header] = row[index];
}
});
return rowData;
});
// Menyaring hasil berdasarkan kolom Instansi (indeks 11)
const filteredResults = results.filter(row => row[headers[11]] === userId);
return filteredResults;
}
function deleteRow(nomor) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const data = sheet.getDataRange().getValues();
let rowsToDelete = []; // Array untuk menyimpan index baris yang akan dihapus
// Loop untuk menemukan semua baris dengan nomor yang sama
for (let i = 1; i < data.length; i++) { // Mulai dari 1 untuk melewatkan header
if (data[i][0] == nomor) { // Kolom pertama adalah nomor
rowsToDelete.push(i + 1); // Tambahkan baris yang cocok ke array, i+1 untuk mencocokkan index di spreadsheet
}
}
// Hapus baris dari bawah ke atas agar index tidak bergeser
for (let i = rowsToDelete.length - 1; i >= 0; i--) {
sheet.deleteRow(rowsToDelete[i]);
}
}
//Print
function getDataByNomor(nomor) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data'); // Ganti dengan nama sheet yang sesuai
const data = sheet.getDataRange().getValues();
const headers = data[0];
const groupedItems = {};
for (let i = 1; i < data.length; i++) {
if (data[i][0] === nomor) { // Ganti 0 dengan indeks kolom yang sesuai
const itemKey = data[i][0]; // Menggunakan kolom nomor sebagai kunci
if (!groupedItems[itemKey]) {
// Jika item belum ada dalam objek, tambahkan
groupedItems[itemKey] = {
commonData: {},
followers: []
};
// Simpan data umum (hanya sekali)
for (let j = 0; j < headers.length; j++) {
if (j === 0) { // Kolom Nomor
groupedItems[itemKey].commonData[headers[j]] = itemKey.toString(); // Mengonversi nomor menjadi string
} else if (j === 1 || j === 2 || j === 3 || j === 4 || j === 5 || j === 6 || j === 7 || j === 10 || j === 11 || j === 12 || j === 13 || j === 14 || j === 15 || j === 16 || j === 18 || j === 19 || j === 20 || j === 21 ) { // Simpan data Nama, NIP, Pangkat, Jabatan hanya sekali
groupedItems[itemKey].commonData[headers[j]] = data[i][j] !== undefined && data[i][j] !== null ? data[i][j] : '-';
} else if (data[i][j] instanceof Date) { // Jika data adalah tanggal
groupedItems[itemKey].commonData[headers[j]] = Utilities.formatDate(data[i][j], Session.getScriptTimeZone(), "yyyy-MM-dd"); // Ubah ke format string
}
}
}
// Tambahkan data Pengikut ke array followers
const followerData = {};
for (let j = 0; j < headers.length; j++) {
if (j >= 5) { // Ganti dengan indeks yang sesuai untuk Pengikut dan seterusnya
if (data[i][j] instanceof Date) { // Jika data adalah tanggal
followerData[headers[j]] = Utilities.formatDate(data[i][j], Session.getScriptTimeZone(), "yyyy-MM-dd"); // Ubah ke format string
} else {
followerData[headers[j]] = data[i][j] !== undefined && data[i][j] !== null ? data[i][j] : '-';
}
}
}
groupedItems[itemKey].followers.push(followerData);
}
}
// Mengonversi objek ke dalam array
const items = [];
for (const key in groupedItems) {
items.push({
commonData: groupedItems[key].commonData,
followers: groupedItems[key].followers
});
}
return items; // Mengembalikan array semua item yang sesuai
}
//Tanda Tangan
function getTandaTanganData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
const data = sheet.getDataRange().getValues();
return data.slice(1).map(row => ({
jenisTTD: row[0],
namaTTD: row[1],
nipTTD: row[2],
pangkatTTD: row[3],
jabatanTTD: row[4],
keteranganTTD1: row[5],
keteranganTTD2: row[6],
}));
}
function getDataByNomor2(nomor) {
const dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const spjSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
// Mengambil data dari kedua sheet
const data = dataSheet.getDataRange().getValues();
const spjData = spjSheet.getDataRange().getValues();
const matchedItems = {};
// Fungsi untuk mengubah format tanggal ke "1 Januari 2024"
function formatDate(date) {
if (date instanceof Date) {
const months = [
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
];
const day = date.getDate();
const month = months[date.getMonth()];
const year = date.getFullYear();
return `${day} ${month} ${year}`;
}
return date; // Kembalikan date jika bukan instance dari Date
}
// Memproses data dari sheet SPJ
for (let i = 1; i < spjData.length; i++) {
if (spjData[i][0] === nomor) { // Memeriksa jika Nomor cocok
const namaSPJ = spjData[i][1];
// Mencari kecocokan di sheet Data
for (let j = 1; j < data.length; j++) {
const nomorData = data[j][0]; // Kolom Nomor di Data
const namaData = data[j][18]; // Kolom Nama di Data (kolom R)
const pengikutData = data[j][22]; // Kolom Pengikut di Data (kolom V)
if (nomorData === nomor && (namaSPJ === namaData || namaSPJ === pengikutData)) {
// Membuat key unik berdasarkan Nomor, Nama, NIP, Pangkat, Jabatan, dan Maksud
const key = `${nomorData}-${namaSPJ}-${data[j][2]}-${data[j][3]}-${data[j][4]}-${data[j][5]}`;
if (!matchedItems[key]) { // Jika item belum ada
matchedItems[key] = {
nomor: nomorData,
nama: namaSPJ,
nomorsppd: data[j][1], // Kolom Nomor SPPD
nip: data[j][19], // Kolom NIP
pangkat: data[j][20], // Kolom Pangkat
pangkatpengikut: data[j][24], // Kolom Pangkat
jabatan: data[j][21], // Kolom Jabatan
maksud: data[j][4], // Kolom Maksud
asalberangkat: data[j][6], // Kolom Maksud
kegiatan: data[j][13], // Kolom Kegiatan
subkegiatan: data[j][14], // Kolom subkegiatan
koderekening: data[j][15], // Kolom koderekening
pangkatgol: spjData[i][3], // Kolom Hasil Kunjungan di SPJ
hasilKunjungan: spjData[i][4], // Kolom Hasil Kunjungan di SPJ
permasalahan: spjData[i][5], // Kolom Permasalahan di SPJ
penyelesaian: spjData[i][6], // Kolom Penyelesaian di SPJ
saran: spjData[i][7], // Kolom Saran di SPJ
dasarSurat: data[j][2], // Kolom Dasar Surat di Data
tujuan: data[j][7], // Kolom Tujuan di Data
lamaPerjalanan: data[j][10], // Kolom Lama Perjalanan di Data
tanggalBuat: formatDate(data[j][17]), // Kolom Tanggal Buat di Data (kolom Q)
tanggalBerangkat: formatDate(data[j][8]), // Kolom Tanggal Buat di Data (kolom Q)
tanggalPulang: formatDate(data[j][9]), // Kolom Tanggal Buat di Data (kolom Q)
rincian: {}, // Inisialisasi objek untuk menyimpan Rincian unik
totalNominal: 0, // Inisialisasi total nominal
};
}
// Membuat key unik untuk Rincian, Nominal, dan Keterangan
const rincianKey = `${spjData[i][8]}-${spjData[i][9]}-${spjData[i][10]}`; // Kolom Rincian, Nominal, Keterangan di SPJ
// Memastikan Rincian, Nominal, dan Keterangan hanya ditambahkan jika unik
if (!matchedItems[key].rincian[rincianKey]) {
matchedItems[key].rincian[rincianKey] = {
rincian: spjData[i][8], // Kolom Rincian di SPJ
nominal: spjData[i][9], // Kolom Nominal di SPJ
keterangan: spjData[i][10], // Kolom Keterangan di SPJ
};
// Tambahkan nominal ke total
matchedItems[key].totalNominal += Number(spjData[i][9]); // Kolom Nominal
}
}
}
}
}
// Mengembalikan array dari matchedItems dengan Rincian yang unik
const result = Object.values(matchedItems).map(item => {
return {
...item,
rincian: Object.values(item.rincian), // Mengambil nilai dari objek rincian
};
});
return result;
}
//Source Code by www.javabitpro.com
function getData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const data = sheet.getDataRange().getValues();
const headers = data[0];
// Mendapatkan userId dari sesi
const userId = getUserId();
const results = data.slice(1).map(row => {
let rowData = {};
headers.forEach((header, index) => {
if (header.includes("Tanggal")) {
rowData[header] = row[index] instanceof Date ? row[index].toLocaleDateString() : row[index];
} else {
rowData[header] = row[index];
}
});
return rowData;
});
// Menyaring hasil berdasarkan kolom Instansi (indeks 11)
const filteredResults = results.filter(row => row[headers[11]] === userId);
return filteredResults;
}
function deleteRow(nomor) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const data = sheet.getDataRange().getValues();
let rowsToDelete = []; // Array untuk menyimpan index baris yang akan dihapus
// Loop untuk menemukan semua baris dengan nomor yang sama
for (let i = 1; i < data.length; i++) { // Mulai dari 1 untuk melewatkan header
if (data[i][0] == nomor) { // Kolom pertama adalah nomor
rowsToDelete.push(i + 1); // Tambahkan baris yang cocok ke array, i+1 untuk mencocokkan index di spreadsheet
}
}
// Hapus baris dari bawah ke atas agar index tidak bergeser
for (let i = rowsToDelete.length - 1; i >= 0; i--) {
sheet.deleteRow(rowsToDelete[i]);
}
}
//Print
function getDataByNomor(nomor) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data'); // Ganti dengan nama sheet yang sesuai
const data = sheet.getDataRange().getValues();
const headers = data[0];
const groupedItems = {};
for (let i = 1; i < data.length; i++) {
if (data[i][0] === nomor) { // Ganti 0 dengan indeks kolom yang sesuai
const itemKey = data[i][0]; // Menggunakan kolom nomor sebagai kunci
if (!groupedItems[itemKey]) {
// Jika item belum ada dalam objek, tambahkan
groupedItems[itemKey] = {
commonData: {},
followers: []
};
// Simpan data umum (hanya sekali)
for (let j = 0; j < headers.length; j++) {
if (j === 0) { // Kolom Nomor
groupedItems[itemKey].commonData[headers[j]] = itemKey.toString(); // Mengonversi nomor menjadi string
} else if (j === 1 || j === 2 || j === 3 || j === 4 || j === 5 || j === 6 || j === 7 || j === 10 || j === 11 || j === 12 || j === 13 || j === 14 || j === 15 || j === 16 || j === 18 || j === 19 || j === 20 || j === 21 ) { // Simpan data Nama, NIP, Pangkat, Jabatan hanya sekali
groupedItems[itemKey].commonData[headers[j]] = data[i][j] !== undefined && data[i][j] !== null ? data[i][j] : '-';
} else if (data[i][j] instanceof Date) { // Jika data adalah tanggal
groupedItems[itemKey].commonData[headers[j]] = Utilities.formatDate(data[i][j], Session.getScriptTimeZone(), "yyyy-MM-dd"); // Ubah ke format string
}
}
}
// Tambahkan data Pengikut ke array followers
const followerData = {};
for (let j = 0; j < headers.length; j++) {
if (j >= 5) { // Ganti dengan indeks yang sesuai untuk Pengikut dan seterusnya
if (data[i][j] instanceof Date) { // Jika data adalah tanggal
followerData[headers[j]] = Utilities.formatDate(data[i][j], Session.getScriptTimeZone(), "yyyy-MM-dd"); // Ubah ke format string
} else {
followerData[headers[j]] = data[i][j] !== undefined && data[i][j] !== null ? data[i][j] : '-';
}
}
}
groupedItems[itemKey].followers.push(followerData);
}
}
// Mengonversi objek ke dalam array
const items = [];
for (const key in groupedItems) {
items.push({
commonData: groupedItems[key].commonData,
followers: groupedItems[key].followers
});
}
return items; // Mengembalikan array semua item yang sesuai
}
//Tanda Tangan
function getTandaTanganData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tanda Tangan');
const data = sheet.getDataRange().getValues();
return data.slice(1).map(row => ({
jenisTTD: row[0],
namaTTD: row[1],
nipTTD: row[2],
pangkatTTD: row[3],
jabatanTTD: row[4],
keteranganTTD1: row[5],
keteranganTTD2: row[6],
}));
}
function getDataByNomor2(nomor) {
const dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const spjSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
// Mengambil data dari kedua sheet
const data = dataSheet.getDataRange().getValues();
const spjData = spjSheet.getDataRange().getValues();
const matchedItems = {};
// Fungsi untuk mengubah format tanggal ke "1 Januari 2024"
function formatDate(date) {
if (date instanceof Date) {
const months = [
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
];
const day = date.getDate();
const month = months[date.getMonth()];
const year = date.getFullYear();
return `${day} ${month} ${year}`;
}
return date; // Kembalikan date jika bukan instance dari Date
}
// Memproses data dari sheet SPJ
for (let i = 1; i < spjData.length; i++) {
if (spjData[i][0] === nomor) { // Memeriksa jika Nomor cocok
const namaSPJ = spjData[i][1];
// Mencari kecocokan di sheet Data
for (let j = 1; j < data.length; j++) {
const nomorData = data[j][0]; // Kolom Nomor di Data
const namaData = data[j][18]; // Kolom Nama di Data (kolom R)
const pengikutData = data[j][22]; // Kolom Pengikut di Data (kolom V)
if (nomorData === nomor && (namaSPJ === namaData || namaSPJ === pengikutData)) {
// Membuat key unik berdasarkan Nomor, Nama, NIP, Pangkat, Jabatan, dan Maksud
const key = `${nomorData}-${namaSPJ}-${data[j][2]}-${data[j][3]}-${data[j][4]}-${data[j][5]}`;
if (!matchedItems[key]) { // Jika item belum ada
matchedItems[key] = {
nomor: nomorData,
nama: namaSPJ,
nomorsppd: data[j][1], // Kolom Nomor SPPD
nip: data[j][19], // Kolom NIP
pangkat: data[j][20], // Kolom Pangkat
pangkatpengikut: data[j][24], // Kolom Pangkat
jabatan: data[j][21], // Kolom Jabatan
maksud: data[j][4], // Kolom Maksud
asalberangkat: data[j][6], // Kolom Maksud
kegiatan: data[j][13], // Kolom Kegiatan
subkegiatan: data[j][14], // Kolom subkegiatan
koderekening: data[j][15], // Kolom koderekening
pangkatgol: spjData[i][3], // Kolom Hasil Kunjungan di SPJ
hasilKunjungan: spjData[i][4], // Kolom Hasil Kunjungan di SPJ
permasalahan: spjData[i][5], // Kolom Permasalahan di SPJ
penyelesaian: spjData[i][6], // Kolom Penyelesaian di SPJ
saran: spjData[i][7], // Kolom Saran di SPJ
dasarSurat: data[j][2], // Kolom Dasar Surat di Data
tujuan: data[j][7], // Kolom Tujuan di Data
lamaPerjalanan: data[j][10], // Kolom Lama Perjalanan di Data
tanggalBuat: formatDate(data[j][17]), // Kolom Tanggal Buat di Data (kolom Q)
tanggalBerangkat: formatDate(data[j][8]), // Kolom Tanggal Buat di Data (kolom Q)
tanggalPulang: formatDate(data[j][9]), // Kolom Tanggal Buat di Data (kolom Q)
rincian: {}, // Inisialisasi objek untuk menyimpan Rincian unik
totalNominal: 0, // Inisialisasi total nominal
};
}
// Membuat key unik untuk Rincian, Nominal, dan Keterangan
const rincianKey = `${spjData[i][8]}-${spjData[i][9]}-${spjData[i][10]}`; // Kolom Rincian, Nominal, Keterangan di SPJ
// Memastikan Rincian, Nominal, dan Keterangan hanya ditambahkan jika unik
if (!matchedItems[key].rincian[rincianKey]) {
matchedItems[key].rincian[rincianKey] = {
rincian: spjData[i][8], // Kolom Rincian di SPJ
nominal: spjData[i][9], // Kolom Nominal di SPJ
keterangan: spjData[i][10], // Kolom Keterangan di SPJ
};
// Tambahkan nominal ke total
matchedItems[key].totalNominal += Number(spjData[i][9]); // Kolom Nominal
}
}
}
}
}
// Mengembalikan array dari matchedItems dengan Rincian yang unik
const result = Object.values(matchedItems).map(item => {
return {
...item,
rincian: Object.values(item.rincian), // Mengambil nilai dari objek rincian
};
});
return result;
}
7. Copy dan pastekan script di bawah ini ke SPJ.gs
Masukkan Password Untuk Melihat Script (Password sama dengan di atas)
// Source Code by www.javabitpro.com
function getFilteredData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const data = sheet.getDataRange().getValues();
// Mendapatkan header (baris pertama)
const headers = data[0];
// Mendapatkan userId dari sesi
const userId = getUserId();
// Filter dan ekstrak data yang dibutuhkan
const filteredData = data.slice(1).map(row => {
return {
Nomor: row[0], // Indeks untuk kolom Nomor
NomorSPPD: row[1], // Indeks untuk kolom Jenis SPPD
JenisSPPD: row[12], // Indeks untuk kolom Instansi
Instansi: row[11], // Indeks untuk kolom Instansi
Tujuan: row[7], // Indeks untuk kolom Tujuan
TanggalBerangkat: row[8] ?
new Date(row[8]).toLocaleDateString('id-ID') : '', // Indeks untuk kolom Tanggal Berangkat
TanggalBuat: row[17] ?
new Date(row[17]).toLocaleDateString('id-ID') : '', // Indeks untuk kolom Tanggal Buat
Nama: row[18], // Indeks untuk kolom Nama
NIP: row[19], // Indeks untuk kolom NIP
Pangkat: row[20], // Indeks untuk kolom Pangkat
Pengikut: row[22], // Indeks untuk kolom Pengikut
NIPPengikut: row[23], // Indeks untuk kolom NIP Pengikut
PangkatPengikut: row[24], // Indeks untuk kolom NIP Pengikut
};
});
// Menyaring data berdasarkan kolom Instansi (indeks 11)
const filteredByInstansi = filteredData.filter(row => row.Instansi === userId);
// Mengelompokkan data berdasarkan Nomor
const groupedData = {};
filteredByInstansi.forEach(row => {
if (!groupedData[row.Nomor]) {
groupedData[row.Nomor] = [];
}
groupedData[row.Nomor].push(row);
});
return groupedData;
}
function saveDataToSPJ(nomor, namaPengikut, nip, pangkat, hasilKunjungan, hasilPermasalahan, hasilPenyelesaian, hasilSaran, rincianData) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
rincianData.forEach(rincian => {
// Buat array untuk menyimpan data yang akan disimpan
const rowData = [
nomor,
namaPengikut,
nip,
pangkat,
hasilKunjungan,
hasilPermasalahan,
hasilPenyelesaian,
hasilSaran,
rincian.rincian, // Rincian
rincian.nominal, // Nominal
rincian.keterangan // Keterangan
];
// Simpan data ke sheet
sheet.appendRow(rowData);
});
}
function getSPJDetails(nomor, namaPengikut) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
const data = sheet.getDataRange().getValues();
// Menyaring data sesuai Nomor dan Nama Pengikut
const spjDetails = data.filter(row => row[0] === nomor && row[1] === namaPengikut);
// Mengubah format menjadi array objek
const result = [];
const uniqueEntries = new Map(); // Untuk menyimpan entri unik
// Mengumpulkan data unik dan rincian
spjDetails.forEach(row => {
const key = `${row[0]}-${row[1]}-${row[2]}-${row[3]}-${row[4]}-${row[5]}-${row[6]}-${row[7]}`;
// Jika kombinasi unik belum ada, simpan data dasar
if (!uniqueEntries.has(key)) {
uniqueEntries.set(key, {
Nomor: row[0],
NamaPengikut: row[1],
NIP: row[2],
Pangkat: row[3],
HasilKunjungan: row[4],
HasilPermasalahan: row[5],
HasilPenyelesaian: row[6],
HasilSaran: row[7],
Rincian: [],
Nominal: [],
Keterangan: []
});
}
// Tambahkan rincian, nominal, dan keterangan ke entri yang ada
uniqueEntries.get(key).Rincian.push(row[8]);
uniqueEntries.get(key).Nominal.push(row[9]);
uniqueEntries.get(key).Keterangan.push(row[10]);
});
// Membuat hasil akhir dengan baris terpisah untuk rincian
uniqueEntries.forEach(value => {
const { Nomor, NamaPengikut, NIP, Pangkat, HasilKunjungan, HasilPermasalahan, HasilPenyelesaian, HasilSaran, Rincian, Nominal, Keterangan } = value;
// Jika ada rincian, nominal, dan keterangan
if (Rincian.length > 0) {
// Buat baris untuk kombinasi unik
result.push({
Nomor,
NamaPengikut,
NIP,
Pangkat,
HasilKunjungan,
HasilPermasalahan,
HasilPenyelesaian,
HasilSaran,
Rincian: Rincian[0], // Ambil rincian pertama untuk baris ini
Nominal: Nominal[0], // Ambil nominal pertama untuk baris ini
Keterangan: Keterangan[0] // Ambil keterangan pertama untuk baris ini
});
// Buat baris terpisah untuk setiap rincian, nominal, dan keterangan yang tersisa
for (let i = 1; i < Rincian.length; i++) {
result.push({
Nomor: '', // Kosongkan untuk kolom ini agar tidak mengulang
NamaPengikut: '',
NIP: '',
Pangkat: '',
HasilKunjungan: '',
HasilPermasalahan: '',
HasilPenyelesaian: '',
HasilSaran: '',
Rincian: Rincian[i],
Nominal: Nominal[i],
Keterangan: Keterangan[i]
});
}
}
});
return result;
}
function deleteSPJData(nomor, namaPengikut) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
const data = sheet.getDataRange().getValues();
// Loop through data to find matches and delete them
for (let i = data.length - 1; i > 0; i--) { // Start from the bottom to avoid skipping rows
if (data[i][0] === nomor && data[i][1] === namaPengikut) {
sheet.deleteRow(i + 1); // +1 because getValues() is 0-indexed and deleteRow is 1-indexed
}
}
}
function getSPJGroupedData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
const data = sheet.getDataRange().getValues();
// Ambil hanya Nomor dan Nama Pengikut dari data
return data.slice(1).map(row => ({
Nomor: row[0],
NamaPengikut: row[1]
}));
}
// Source Code by www.javabitpro.com
function getFilteredData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const data = sheet.getDataRange().getValues();
// Mendapatkan header (baris pertama)
const headers = data[0];
// Mendapatkan userId dari sesi
const userId = getUserId();
// Filter dan ekstrak data yang dibutuhkan
const filteredData = data.slice(1).map(row => {
return {
Nomor: row[0], // Indeks untuk kolom Nomor
NomorSPPD: row[1], // Indeks untuk kolom Jenis SPPD
JenisSPPD: row[12], // Indeks untuk kolom Instansi
Instansi: row[11], // Indeks untuk kolom Instansi
Tujuan: row[7], // Indeks untuk kolom Tujuan
TanggalBerangkat: row[8] ?
new Date(row[8]).toLocaleDateString('id-ID') : '', // Indeks untuk kolom Tanggal Berangkat
TanggalBuat: row[17] ?
new Date(row[17]).toLocaleDateString('id-ID') : '', // Indeks untuk kolom Tanggal Buat
Nama: row[18], // Indeks untuk kolom Nama
NIP: row[19], // Indeks untuk kolom NIP
Pangkat: row[20], // Indeks untuk kolom Pangkat
Pengikut: row[22], // Indeks untuk kolom Pengikut
NIPPengikut: row[23], // Indeks untuk kolom NIP Pengikut
PangkatPengikut: row[24], // Indeks untuk kolom NIP Pengikut
};
});
// Menyaring data berdasarkan kolom Instansi (indeks 11)
const filteredByInstansi = filteredData.filter(row => row.Instansi === userId);
// Mengelompokkan data berdasarkan Nomor
const groupedData = {};
filteredByInstansi.forEach(row => {
if (!groupedData[row.Nomor]) {
groupedData[row.Nomor] = [];
}
groupedData[row.Nomor].push(row);
});
return groupedData;
}
function saveDataToSPJ(nomor, namaPengikut, nip, pangkat, hasilKunjungan, hasilPermasalahan, hasilPenyelesaian, hasilSaran, rincianData) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
rincianData.forEach(rincian => {
// Buat array untuk menyimpan data yang akan disimpan
const rowData = [
nomor,
namaPengikut,
nip,
pangkat,
hasilKunjungan,
hasilPermasalahan,
hasilPenyelesaian,
hasilSaran,
rincian.rincian, // Rincian
rincian.nominal, // Nominal
rincian.keterangan // Keterangan
];
// Simpan data ke sheet
sheet.appendRow(rowData);
});
}
function getSPJDetails(nomor, namaPengikut) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
const data = sheet.getDataRange().getValues();
// Menyaring data sesuai Nomor dan Nama Pengikut
const spjDetails = data.filter(row => row[0] === nomor && row[1] === namaPengikut);
// Mengubah format menjadi array objek
const result = [];
const uniqueEntries = new Map(); // Untuk menyimpan entri unik
// Mengumpulkan data unik dan rincian
spjDetails.forEach(row => {
const key = `${row[0]}-${row[1]}-${row[2]}-${row[3]}-${row[4]}-${row[5]}-${row[6]}-${row[7]}`;
// Jika kombinasi unik belum ada, simpan data dasar
if (!uniqueEntries.has(key)) {
uniqueEntries.set(key, {
Nomor: row[0],
NamaPengikut: row[1],
NIP: row[2],
Pangkat: row[3],
HasilKunjungan: row[4],
HasilPermasalahan: row[5],
HasilPenyelesaian: row[6],
HasilSaran: row[7],
Rincian: [],
Nominal: [],
Keterangan: []
});
}
// Tambahkan rincian, nominal, dan keterangan ke entri yang ada
uniqueEntries.get(key).Rincian.push(row[8]);
uniqueEntries.get(key).Nominal.push(row[9]);
uniqueEntries.get(key).Keterangan.push(row[10]);
});
// Membuat hasil akhir dengan baris terpisah untuk rincian
uniqueEntries.forEach(value => {
const { Nomor, NamaPengikut, NIP, Pangkat, HasilKunjungan, HasilPermasalahan, HasilPenyelesaian, HasilSaran, Rincian, Nominal, Keterangan } = value;
// Jika ada rincian, nominal, dan keterangan
if (Rincian.length > 0) {
// Buat baris untuk kombinasi unik
result.push({
Nomor,
NamaPengikut,
NIP,
Pangkat,
HasilKunjungan,
HasilPermasalahan,
HasilPenyelesaian,
HasilSaran,
Rincian: Rincian[0], // Ambil rincian pertama untuk baris ini
Nominal: Nominal[0], // Ambil nominal pertama untuk baris ini
Keterangan: Keterangan[0] // Ambil keterangan pertama untuk baris ini
});
// Buat baris terpisah untuk setiap rincian, nominal, dan keterangan yang tersisa
for (let i = 1; i < Rincian.length; i++) {
result.push({
Nomor: '', // Kosongkan untuk kolom ini agar tidak mengulang
NamaPengikut: '',
NIP: '',
Pangkat: '',
HasilKunjungan: '',
HasilPermasalahan: '',
HasilPenyelesaian: '',
HasilSaran: '',
Rincian: Rincian[i],
Nominal: Nominal[i],
Keterangan: Keterangan[i]
});
}
}
});
return result;
}
function deleteSPJData(nomor, namaPengikut) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
const data = sheet.getDataRange().getValues();
// Loop through data to find matches and delete them
for (let i = data.length - 1; i > 0; i--) { // Start from the bottom to avoid skipping rows
if (data[i][0] === nomor && data[i][1] === namaPengikut) {
sheet.deleteRow(i + 1); // +1 because getValues() is 0-indexed and deleteRow is 1-indexed
}
}
}
function getSPJGroupedData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
const data = sheet.getDataRange().getValues();
// Ambil hanya Nomor dan Nama Pengikut dari data
return data.slice(1).map(row => ({
Nomor: row[0],
NamaPengikut: row[1]
}));
}
8. Untuk script header.html, login.html, register.html dan main.html sudah include di dalam file.
9. Copy dan pastekan script di bawah ini ke formsppd.html
Masukkan Password Untuk Melihat Script (Password sama dengan di atas)
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!=includeHeader();?>
<title>Form Input Dinamis</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
/* Mengatur margin bawah untuk tabel dan tombol */
.table {
margin-bottom: 20px; /* Memberi jarak di bawah tabel */
}
/* Mengatur jarak tombol dari bawah */
form button {
margin-bottom: 50px;
}
</style>
<script>
let pengikutCount = 0;
let pangkatData = [];
let pengikutNames = [];
function addPengikutRow() {
pengikutCount++;
const table = document.getElementById('pengikutTable').getElementsByTagName('tbody')[0];
const row = table.insertRow();
row.setAttribute('id', 'pengikutRow' + pengikutCount);
const pengikutCell = row.insertCell(0);
const pengikutDropdown = document.createElement('select');
pengikutDropdown.className = 'form-select';
pengikutDropdown.required = true;
pengikutNames.forEach(name => {
const option = document.createElement('option');
option.value = name;
option.text = name;
pengikutDropdown.appendChild(option);
});
pengikutDropdown.addEventListener('change', function() {
const selectedName = this.value;
if (selectedName) {
google.script.run.withSuccessHandler((data) => {
row.cells[1].getElementsByTagName('input')[0].value = data.nip;
row.cells[2].getElementsByTagName('input')[0].value = data.pangkat;
row.cells[3].getElementsByTagName('input')[0].value = data.jabatan;
row.cells[4].getElementsByTagName('input')[0].value = data.tanggalLahir;
}).getDataByName(selectedName);
} else {
resetRowCells(row);
}
});
pengikutCell.appendChild(pengikutDropdown);
// NIP
const nipCell = row.insertCell(1);
const nipInput = document.createElement('input');
nipInput.type = 'text';
nipInput.className = 'form-control';
nipCell.appendChild(nipInput);
// Pangkat
const pangkatCell = row.insertCell(2);
const pangkatInput = document.createElement('input');
pangkatInput.type = 'text';
pangkatInput.className = 'form-control';
pangkatCell.appendChild(pangkatInput);
// Jabatan
const jabatanCell = row.insertCell(3);
const jabatanInput = document.createElement('input');
jabatanInput.type = 'text';
jabatanInput.className = 'form-control';
jabatanCell.appendChild(jabatanInput);
// Tanggal Lahir
const tanggalLahirCell = row.insertCell(4);
const tanggalLahirInput = document.createElement('input');
tanggalLahirInput.type = 'text';
tanggalLahirInput.className = 'form-control';
tanggalLahirCell.appendChild(tanggalLahirInput);
// Delete button
const deleteCell = row.insertCell(5);
deleteCell.innerHTML = `<button type="button" class="btn btn-danger" onclick="removePengikutRow(${pengikutCount})">Delete</button>`;
}
function resetRowCells(row) {
for (let i = 1; i <= 4; i++) {
row.cells[i].getElementsByTagName('input')[0].value = ''; // Kosongkan setiap input
}
}
function removePengikutRow(rowId) {
const row = document.getElementById('pengikutRow' + rowId);
if (row) {
row.remove();
}
}
function submitForm(event) {
event.preventDefault(); // Prevent default form submission
let pengikutList = [];
const rows = document.getElementById('pengikutTable').getElementsByTagName('tbody')[0].rows;
for (let row of rows) {
const pengikut = row.cells[0].getElementsByTagName('select')[0].value;
const nippengikut = row.cells[1].getElementsByTagName('input')[0].value;
const pangkatpengikut = row.cells[2].getElementsByTagName('input')[0].value;
const jabatanpengikut = row.cells[3].getElementsByTagName('input')[0].value;
const tanggallahir = row.cells[4].getElementsByTagName('input')[0].value;
pengikutList.push({ pengikut: pengikut, nippengikut: nippengikut, pangkatpengikut: pangkatpengikut,jabatanpengikut: jabatanpengikut, tanggallahir: tanggallahir });
}
const formData = {
nomor: document.getElementById('nomor').value,
nomorsppd: document.getElementById('nomorsppd').value,
dasar: document.getElementById('dasar').value,
tingkatbiaya: document.getElementById('tingkatbiaya').value,
maksud: document.getElementById('maksud').value,
alatangkut: document.getElementById('alatangkut').value,
asalberangkat: document.getElementById('asalberangkat').value,
tujuan: document.getElementById('tujuan').value,
tanggalberangkat: document.getElementById('tanggalberangkat').value,
tanggalpulang: document.getElementById('tanggalpulang').value,
lamaperjalanan: document.getElementById('lamaperjalanan').value,
instansi: document.getElementById('instansi').value,
jenisSppdDropdown: document.getElementById('jenisSppdDropdown').value,
kegiatanDropdown: document.getElementById('kegiatanDropdown').value,
subKegiatanDropdown: document.getElementById('subKegiatanDropdown').value,
kodeRekeningDropdown: document.getElementById('kodeRekeningDropdown').value,
lainlain: document.getElementById('lainlain').value,
tanggalbuat: document.getElementById('tanggalbuat').value,
nama: document.getElementById('nama').value,
nip: document.getElementById('nip').value,
pangkat: document.getElementById('pangkat').value,
jabatan: document.getElementById('jabatan').value,
pengikut: pengikutList
};
google.script.run.withSuccessHandler(() => {
alert('Data berhasil disimpan!');
document.getElementById('form-input').reset();
document.getElementById('pengikutTable').innerHTML = ''; // Clear pengikut rows
}).saveData(formData); // Menjalankan fungsi saveData di server
}
function loadPangkatData() {
google.script.run.withSuccessHandler(populateNamaDropdown).getPangkatData();
google.script.run.withSuccessHandler(populatePengikutNames).getPengikutNames();
google.script.run.withSuccessHandler(populateRekeningDatas).getRekeningDatas();
}
function populateNamaDropdown(data) {
pangkatData = data; // Simpan data pangkat
const namaDropdown = document.getElementById('nama');
namaDropdown.innerHTML = '<option value="">Pilih Nama</option>'; // Tambah placeholder
data.forEach(row => {
const option = document.createElement('option');
option.value = row[0]; // Nama
option.text = row[0]; // Nama
namaDropdown.appendChild(option);
});
}
function onNamaChange() {
const selectedNama = document.getElementById('nama').value;
const nipDropdown = document.getElementById('nip');
const pangkatDropdown = document.getElementById('pangkat');
const jabatanDropdown = document.getElementById('jabatan');
nipDropdown.innerHTML = '<option value="">Pilih NIP</option>';
pangkatDropdown.innerHTML = '<option value="">Pilih Pangkat</option>';
jabatanDropdown.innerHTML = '<option value="">Pilih Jabatan</option>';
const selectedData = pangkatData.find(row => row[0] === selectedNama);
if (selectedData) {
// Set NIP
const nipOption = document.createElement('option');
nipOption.value = selectedData[1]; // NIP
nipOption.text = selectedData[1]; // NIP
nipDropdown.appendChild(nipOption);
// Set Pangkat
const pangkatOption = document.createElement('option');
pangkatOption.value = selectedData[2];
pangkatOption.text = selectedData[2];
pangkatDropdown.appendChild(pangkatOption);
// Set Jabatan
const jabatanOption = document.createElement('option');
jabatanOption.value = selectedData[3];
jabatanOption.text = selectedData[3];
jabatanDropdown.appendChild(jabatanOption);
}
}
function populatePengikutNames(names) {
pengikutNames = names; // Simpan nama pengikut
}
window.onload = loadPangkatData;
function loadUserId() {
google.script.run.withSuccessHandler(function(userId) {
console.log('User ID:', userId);
document.getElementById("userIdDisplay").innerHTML = userId ? userId : "Guest";
// Menggunakan value untuk input field
document.querySelector('input[name="instansi"]').value = userId ? userId : "Guest";
// Periksa apakah pengguna adalah admin
google.script.run.withSuccessHandler(function(isAdmin) {
if (isAdmin) {
document.getElementById("sppdMenu").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu1").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu2").style.display = "block"; // Tampilkan menu
}
}).isUserAdmin(); // Panggil fungsi untuk memeriksa status admin
}).getUserId();
}
// Ambil data Rekening dan isi dropdown Jenis SPPD saat halaman dimuat
function loadRekeningData() {
google.script.run.withSuccessHandler(populateJenisSppdDropdown).getRekeningData();
}
// Mengisi dropdown Jenis SPPD dengan data dari server
function populateJenisSppdDropdown(data) {
const jenisSppdDropdown = document.getElementById("jenisSppdDropdown");
const jenisSppdSet = new Set(data.map(row => row[0])); // Mengambil hanya kolom Jenis SPPD, hapus duplikat
jenisSppdSet.forEach(jenisSppd => {
const option = document.createElement("option");
option.value = jenisSppd;
option.textContent = jenisSppd;
jenisSppdDropdown.appendChild(option);
});
}
// Mengisi dropdown Kegiatan saat Jenis SPPD dipilih
function onJenisSppdChange() {
const jenisSppdDropdown = document.getElementById("jenisSppdDropdown");
const kegiatanDropdown = document.getElementById("kegiatanDropdown");
const selectedJenisSppd = jenisSppdDropdown.value;
kegiatanDropdown.innerHTML = '<option value="">Pilih Kegiatan</option>'; // Reset Kegiatan
subKegiatanDropdown.innerHTML = '<option value="">Pilih Sub Kegiatan</option>'; // Reset Sub Kegiatan
kodeRekeningDropdown.innerHTML = '<option value="">Pilih Kode Rekening</option>'; // Reset Kode Rekening
if (selectedJenisSppd) {
google.script.run.withSuccessHandler(data => {
const kegiatanSet = new Set();
data.forEach(row => {
if (row[0] === selectedJenisSppd) {
kegiatanSet.add(row[1]);
}
});
kegiatanSet.forEach(kegiatan => {
const option = document.createElement("option");
option.value = kegiatan;
option.textContent = kegiatan;
kegiatanDropdown.appendChild(option);
});
}).getRekeningData();
}
}
// Mengisi dropdown Sub Kegiatan saat Kegiatan dipilih
function onKegiatanChange() {
const jenisSppdDropdown = document.getElementById("jenisSppdDropdown");
const kegiatanDropdown = document.getElementById("kegiatanDropdown");
const subKegiatanDropdown = document.getElementById("subKegiatanDropdown");
const selectedJenisSppd = jenisSppdDropdown.value;
const selectedKegiatan = kegiatanDropdown.value;
subKegiatanDropdown.innerHTML = '<option value="">Pilih Sub Kegiatan</option>'; // Reset Sub Kegiatan
kodeRekeningDropdown.innerHTML = '<option value="">Pilih Kode Rekening</option>'; // Reset Kode Rekening
if (selectedJenisSppd && selectedKegiatan) {
google.script.run.withSuccessHandler(data => {
data.forEach(row => {
if (row[0] === selectedJenisSppd && row[1] === selectedKegiatan) {
const option = document.createElement("option");
option.value = row[2]; // Sub Kegiatan
option.textContent = row[2]; // Sub Kegiatan
subKegiatanDropdown.appendChild(option);
}
});
}).getRekeningData();
}
}
// Mengisi dropdown Kode Rekening saat Sub Kegiatan dipilih
function onSubKegiatanChange() {
const jenisSppdDropdown = document.getElementById("jenisSppdDropdown");
const kegiatanDropdown = document.getElementById("kegiatanDropdown");
const subKegiatanDropdown = document.getElementById("subKegiatanDropdown");
const kodeRekeningDropdown = document.getElementById("kodeRekeningDropdown");
const selectedJenisSppd = jenisSppdDropdown.value;
const selectedKegiatan = kegiatanDropdown.value;
const selectedSubKegiatan = subKegiatanDropdown.value;
kodeRekeningDropdown.innerHTML = '<option value="">Pilih Kode Rekening</option>'; // Reset Kode Rekening
if (selectedJenisSppd && selectedKegiatan && selectedSubKegiatan) {
google.script.run.withSuccessHandler(data => {
data.forEach(row => {
if (row[0] === selectedJenisSppd && row[1] === selectedKegiatan && row[2] === selectedSubKegiatan) {
const option = document.createElement("option");
option.value = row[3]; // Kode Rekening
option.textContent = row[3]; // Kode Rekening
kodeRekeningDropdown.appendChild(option);
}
});
}).getRekeningData();
}
}
// Panggil loadRekeningData saat halaman dimuat
document.addEventListener("DOMContentLoaded", loadRekeningData);
loadUserId();
</script>
</head>
<body>
<div class="container mt-5 mb-5" style="border: 1px solid #ddd; padding: 20px; border-radius: 5px;">
<h2 style="text-align: center;"><strong>INPUT DATA SPPD</strong></h2>
<hr>
<form id="form-input" onsubmit="submitForm(event)">
<!-- Nomor SPT dan Nomor SPPD (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="nomor" class="form-label">Nomor SPT</label>
<input type="text" class="form-control" id="nomor" placeholder="Masukkan Nomor SPT" required>
</div>
<div class="col-md-6">
<label for="nomorsppd" class="form-label">Nomor SPPD</label>
<input type="text" class="form-control" id="nomorsppd" placeholder="Masukkan Nomor SPPD" required>
</div>
</div>
<!-- Dasar Surat (1 baris full) -->
<div class="mb-3">
<label for="dasar" class="form-label">Dasar Surat</label>
<textarea class="form-control" id="dasar" rows="5" placeholder="Masukkan Dasar Surat" required></textarea>
</div>
<!-- Maksud SPPD (1 baris full) -->
<div class="mb-3">
<label for="maksud" class="form-label">Maksud SPPD</label>
<textarea class="form-control" id="maksud" rows="5" placeholder="Masukkan Maksud SPPD" required></textarea>
</div>
<hr>
<!-- Tingkat Biaya dan Alat Angkut (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="tingkatbiaya" class="form-label">Tingkat Biaya</label>
<input type="text" class="form-control" id="tingkatbiaya" placeholder="Masukkan Tingkat Biaya" required>
</div>
<div class="col-md-6">
<label for="alatangkut" class="form-label">Alat Angkut</label>
<select id="alatangkut" class="form-select" required>
<option value="">Pilih Alat Angkut</option>
<option value="Umum">Umum</option>
<option value="Kendaraan Dinas">Kendaraan Dinas</option>
<option value="Bersama Rombongan">Bersama Rombongan</option>
</select>
</div>
</div>
<!-- Asal Berangkat dan Tujuan (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="asalberangkat" class="form-label">Asal Berangkat</label>
<input type="text" class="form-control" id="asalberangkat" placeholder="Masukkan Asal Berangkat" required>
</div>
<div class="col-md-6">
<label for="tujuan" class="form-label">Tujuan</label>
<input type="text" class="form-control" id="tujuan" placeholder="Masukkan Tujuan" required>
</div>
</div>
<hr>
<!-- Tanggal Berangkat, Tanggal Pulang, dan Lama Perjalanan (1 baris 3 kolom) -->
<div class="row mb-3">
<div class="col-md-4">
<label for="tanggalberangkat" class="form-label">Tanggal Berangkat</label>
<input type="date" class="form-control" id="tanggalberangkat" name="tanggalberangkat" required>
</div>
<div class="col-md-4">
<label for="tanggalpulang" class="form-label">Tanggal Pulang</label>
<input type="date" class="form-control" id="tanggalpulang" name="tanggalpulang" required>
</div>
<div class="col-md-4">
<label for="lamaperjalanan" class="form-label">Lama Perjalanan</label>
<input type="text" class="form-control" id="lamaperjalanan" name="lamaperjalanan" readonly>
</div>
</div>
<!-- Jenis SPPD, Kegiatan, Sub Kegiatan, dan Kode Rekening (1 baris 4 kolom) -->
<div class="row mb-3">
<div class="col-md-3">
<label for="jenisSppdDropdown" class="form-label">Jenis SPPD</label>
<select id="jenisSppdDropdown" class="form-select" onchange="onJenisSppdChange()" required>
<option value="">Pilih Jenis SPPD</option>
</select>
</div>
<div class="col-md-3">
<label for="kegiatanDropdown" class="form-label">Kegiatan</label>
<select id="kegiatanDropdown" class="form-select" onchange="onKegiatanChange()" required>
<option value="">Pilih Kegiatan</option>
</select>
</div>
<div class="col-md-3">
<label for="subKegiatanDropdown" class="form-label">Sub Kegiatan</label>
<select id="subKegiatanDropdown" class="form-select" onchange="onSubKegiatanChange()" required>
<option value="">Pilih Sub Kegiatan</option>
</select>
</div>
<div class="col-md-3">
<label for="kodeRekeningDropdown" class="form-label">Kode Rekening</label>
<select id="kodeRekeningDropdown" class="form-select" required>
<option value="">Pilih Kode Rekening</option>
</select>
</div>
</div>
<hr>
<!-- Nama dan NIP (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="nama" class="form-label">Nama</label>
<select id="nama" class="form-select" onchange="onNamaChange()" required>
<option value="">Pilih Nama</option>
</select>
</div>
<div class="col-md-6">
<label for="nip" class="form-label">NIP</label>
<select id="nip" class="form-select" required>
<option value="">Pilih NIP</option>
</select>
</div>
</div>
<!-- Pangkat dan Jabatan (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="pangkat" class="form-label">Pangkat</label>
<select id="pangkat" class="form-select" required>
<option value="">Pilih Pangkat</option>
</select>
</div>
<div class="col-md-6">
<label for="jabatan" class="form-label">Jabatan</label>
<select id="jabatan" class="form-select" required>
<option value="">Pilih Jabatan</option>
</select>
</div>
</div>
<hr>
<!-- Instansi (1 baris full) -->
<div class="mb-3">
<label for="instansi" class="form-label">Instansi/Bidang</label>
<input type="text" class="form-control" id="instansi" name="instansi" readonly>
</div>
<!-- Tanggal Dibuat (1 baris full) -->
<div class="mb-3">
<label for="tanggalbuat" class="form-label">Tanggal Dibuat</label>
<input type="date" class="form-control" id="tanggalbuat" required>
</div>
<!-- Lain-Lain (1 baris full) -->
<div class="mb-3">
<label for="lainlain" class="form-label">Lain-Lain</label>
<input type="text" class="form-control" id="lainlain" placeholder="Masukkan Lain-Lain" required>
</div>
<!-- Tabel Pengikut -->
<hr>
<h3 class="mt-4" style="text-align: center;">PENGIKUT</h3>
<!-- Margin top agar ada jarak dengan elemen sebelumnya -->
<div class="table-responsive">
<!-- Table responsive untuk membuat tabel bisa scroll jika sempit -->
<table class="table table-bordered" id="pengikutTable">
<!-- Menambahkan border agar tabel terlihat lebih rapi -->
<thead class="table-light">
<!-- Background lebih terang untuk header tabel -->
<tr style="text-align: center;">
<th>Pengikut</th>
<th>NIP</th>
<th>Pangkat</th>
<th>Jabatan</th>
<th>Tanggal Lahir</th>
<th>Tanggal Lahir</th>
</tr>
</thead>
<tbody>
<!-- Baris pengikut akan ditambahkan di sini -->
</tbody>
</table>
</div>
<!-- Tombol Add Row -->
<button type="button" class="btn btn-secondary mt-3" onclick="addPengikutRow()">Tambah Pengikut</button> <!-- mt-3 untuk margin atas -->
<!-- Submit Button -->
<button type="submit" class="btn btn-primary mt-3">Submit</button> <!-- mt-3 untuk jarak antara tombol submit -->
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
//Hitung hari
document.getElementById('tanggalberangkat').addEventListener('change', hitungLamaPerjalanan);
document.getElementById('tanggalpulang').addEventListener('change', hitungLamaPerjalanan);
function hitungLamaPerjalanan() {
const tanggalBerangkat = document.getElementById('tanggalberangkat').value;
const tanggalPulang = document.getElementById('tanggalpulang').value;
if (tanggalBerangkat && tanggalPulang) {
const date1 = new Date(tanggalBerangkat);
const date2 = new Date(tanggalPulang);
const diffTime = date2 - date1;
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1;
if (diffDays >= 1) {
document.getElementById('lamaperjalanan').value = diffDays + ' Hari';
} else {
document.getElementById('lamaperjalanan').value = '';
alert('Tanggal pulang harus setelah atau sama dengan tanggal berangkat');
}
} else {
document.getElementById('lamaperjalanan').value = '';
}
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!=includeHeader();?>
<title>Form Input Dinamis</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
/* Mengatur margin bawah untuk tabel dan tombol */
.table {
margin-bottom: 20px; /* Memberi jarak di bawah tabel */
}
/* Mengatur jarak tombol dari bawah */
form button {
margin-bottom: 50px;
}
</style>
<script>
let pengikutCount = 0;
let pangkatData = [];
let pengikutNames = [];
function addPengikutRow() {
pengikutCount++;
const table = document.getElementById('pengikutTable').getElementsByTagName('tbody')[0];
const row = table.insertRow();
row.setAttribute('id', 'pengikutRow' + pengikutCount);
const pengikutCell = row.insertCell(0);
const pengikutDropdown = document.createElement('select');
pengikutDropdown.className = 'form-select';
pengikutDropdown.required = true;
pengikutNames.forEach(name => {
const option = document.createElement('option');
option.value = name;
option.text = name;
pengikutDropdown.appendChild(option);
});
pengikutDropdown.addEventListener('change', function() {
const selectedName = this.value;
if (selectedName) {
google.script.run.withSuccessHandler((data) => {
row.cells[1].getElementsByTagName('input')[0].value = data.nip;
row.cells[2].getElementsByTagName('input')[0].value = data.pangkat;
row.cells[3].getElementsByTagName('input')[0].value = data.jabatan;
row.cells[4].getElementsByTagName('input')[0].value = data.tanggalLahir;
}).getDataByName(selectedName);
} else {
resetRowCells(row);
}
});
pengikutCell.appendChild(pengikutDropdown);
// NIP
const nipCell = row.insertCell(1);
const nipInput = document.createElement('input');
nipInput.type = 'text';
nipInput.className = 'form-control';
nipCell.appendChild(nipInput);
// Pangkat
const pangkatCell = row.insertCell(2);
const pangkatInput = document.createElement('input');
pangkatInput.type = 'text';
pangkatInput.className = 'form-control';
pangkatCell.appendChild(pangkatInput);
// Jabatan
const jabatanCell = row.insertCell(3);
const jabatanInput = document.createElement('input');
jabatanInput.type = 'text';
jabatanInput.className = 'form-control';
jabatanCell.appendChild(jabatanInput);
// Tanggal Lahir
const tanggalLahirCell = row.insertCell(4);
const tanggalLahirInput = document.createElement('input');
tanggalLahirInput.type = 'text';
tanggalLahirInput.className = 'form-control';
tanggalLahirCell.appendChild(tanggalLahirInput);
// Delete button
const deleteCell = row.insertCell(5);
deleteCell.innerHTML = `<button type="button" class="btn btn-danger" onclick="removePengikutRow(${pengikutCount})">Delete</button>`;
}
function resetRowCells(row) {
for (let i = 1; i <= 4; i++) {
row.cells[i].getElementsByTagName('input')[0].value = ''; // Kosongkan setiap input
}
}
function removePengikutRow(rowId) {
const row = document.getElementById('pengikutRow' + rowId);
if (row) {
row.remove();
}
}
function submitForm(event) {
event.preventDefault(); // Prevent default form submission
let pengikutList = [];
const rows = document.getElementById('pengikutTable').getElementsByTagName('tbody')[0].rows;
for (let row of rows) {
const pengikut = row.cells[0].getElementsByTagName('select')[0].value;
const nippengikut = row.cells[1].getElementsByTagName('input')[0].value;
const pangkatpengikut = row.cells[2].getElementsByTagName('input')[0].value;
const jabatanpengikut = row.cells[3].getElementsByTagName('input')[0].value;
const tanggallahir = row.cells[4].getElementsByTagName('input')[0].value;
pengikutList.push({ pengikut: pengikut, nippengikut: nippengikut, pangkatpengikut: pangkatpengikut,jabatanpengikut: jabatanpengikut, tanggallahir: tanggallahir });
}
const formData = {
nomor: document.getElementById('nomor').value,
nomorsppd: document.getElementById('nomorsppd').value,
dasar: document.getElementById('dasar').value,
tingkatbiaya: document.getElementById('tingkatbiaya').value,
maksud: document.getElementById('maksud').value,
alatangkut: document.getElementById('alatangkut').value,
asalberangkat: document.getElementById('asalberangkat').value,
tujuan: document.getElementById('tujuan').value,
tanggalberangkat: document.getElementById('tanggalberangkat').value,
tanggalpulang: document.getElementById('tanggalpulang').value,
lamaperjalanan: document.getElementById('lamaperjalanan').value,
instansi: document.getElementById('instansi').value,
jenisSppdDropdown: document.getElementById('jenisSppdDropdown').value,
kegiatanDropdown: document.getElementById('kegiatanDropdown').value,
subKegiatanDropdown: document.getElementById('subKegiatanDropdown').value,
kodeRekeningDropdown: document.getElementById('kodeRekeningDropdown').value,
lainlain: document.getElementById('lainlain').value,
tanggalbuat: document.getElementById('tanggalbuat').value,
nama: document.getElementById('nama').value,
nip: document.getElementById('nip').value,
pangkat: document.getElementById('pangkat').value,
jabatan: document.getElementById('jabatan').value,
pengikut: pengikutList
};
google.script.run.withSuccessHandler(() => {
alert('Data berhasil disimpan!');
document.getElementById('form-input').reset();
document.getElementById('pengikutTable').innerHTML = ''; // Clear pengikut rows
}).saveData(formData); // Menjalankan fungsi saveData di server
}
function loadPangkatData() {
google.script.run.withSuccessHandler(populateNamaDropdown).getPangkatData();
google.script.run.withSuccessHandler(populatePengikutNames).getPengikutNames();
google.script.run.withSuccessHandler(populateRekeningDatas).getRekeningDatas();
}
function populateNamaDropdown(data) {
pangkatData = data; // Simpan data pangkat
const namaDropdown = document.getElementById('nama');
namaDropdown.innerHTML = '<option value="">Pilih Nama</option>'; // Tambah placeholder
data.forEach(row => {
const option = document.createElement('option');
option.value = row[0]; // Nama
option.text = row[0]; // Nama
namaDropdown.appendChild(option);
});
}
function onNamaChange() {
const selectedNama = document.getElementById('nama').value;
const nipDropdown = document.getElementById('nip');
const pangkatDropdown = document.getElementById('pangkat');
const jabatanDropdown = document.getElementById('jabatan');
nipDropdown.innerHTML = '<option value="">Pilih NIP</option>';
pangkatDropdown.innerHTML = '<option value="">Pilih Pangkat</option>';
jabatanDropdown.innerHTML = '<option value="">Pilih Jabatan</option>';
const selectedData = pangkatData.find(row => row[0] === selectedNama);
if (selectedData) {
// Set NIP
const nipOption = document.createElement('option');
nipOption.value = selectedData[1]; // NIP
nipOption.text = selectedData[1]; // NIP
nipDropdown.appendChild(nipOption);
// Set Pangkat
const pangkatOption = document.createElement('option');
pangkatOption.value = selectedData[2];
pangkatOption.text = selectedData[2];
pangkatDropdown.appendChild(pangkatOption);
// Set Jabatan
const jabatanOption = document.createElement('option');
jabatanOption.value = selectedData[3];
jabatanOption.text = selectedData[3];
jabatanDropdown.appendChild(jabatanOption);
}
}
function populatePengikutNames(names) {
pengikutNames = names; // Simpan nama pengikut
}
window.onload = loadPangkatData;
function loadUserId() {
google.script.run.withSuccessHandler(function(userId) {
console.log('User ID:', userId);
document.getElementById("userIdDisplay").innerHTML = userId ? userId : "Guest";
// Menggunakan value untuk input field
document.querySelector('input[name="instansi"]').value = userId ? userId : "Guest";
// Periksa apakah pengguna adalah admin
google.script.run.withSuccessHandler(function(isAdmin) {
if (isAdmin) {
document.getElementById("sppdMenu").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu1").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu2").style.display = "block"; // Tampilkan menu
}
}).isUserAdmin(); // Panggil fungsi untuk memeriksa status admin
}).getUserId();
}
// Ambil data Rekening dan isi dropdown Jenis SPPD saat halaman dimuat
function loadRekeningData() {
google.script.run.withSuccessHandler(populateJenisSppdDropdown).getRekeningData();
}
// Mengisi dropdown Jenis SPPD dengan data dari server
function populateJenisSppdDropdown(data) {
const jenisSppdDropdown = document.getElementById("jenisSppdDropdown");
const jenisSppdSet = new Set(data.map(row => row[0])); // Mengambil hanya kolom Jenis SPPD, hapus duplikat
jenisSppdSet.forEach(jenisSppd => {
const option = document.createElement("option");
option.value = jenisSppd;
option.textContent = jenisSppd;
jenisSppdDropdown.appendChild(option);
});
}
// Mengisi dropdown Kegiatan saat Jenis SPPD dipilih
function onJenisSppdChange() {
const jenisSppdDropdown = document.getElementById("jenisSppdDropdown");
const kegiatanDropdown = document.getElementById("kegiatanDropdown");
const selectedJenisSppd = jenisSppdDropdown.value;
kegiatanDropdown.innerHTML = '<option value="">Pilih Kegiatan</option>'; // Reset Kegiatan
subKegiatanDropdown.innerHTML = '<option value="">Pilih Sub Kegiatan</option>'; // Reset Sub Kegiatan
kodeRekeningDropdown.innerHTML = '<option value="">Pilih Kode Rekening</option>'; // Reset Kode Rekening
if (selectedJenisSppd) {
google.script.run.withSuccessHandler(data => {
const kegiatanSet = new Set();
data.forEach(row => {
if (row[0] === selectedJenisSppd) {
kegiatanSet.add(row[1]);
}
});
kegiatanSet.forEach(kegiatan => {
const option = document.createElement("option");
option.value = kegiatan;
option.textContent = kegiatan;
kegiatanDropdown.appendChild(option);
});
}).getRekeningData();
}
}
// Mengisi dropdown Sub Kegiatan saat Kegiatan dipilih
function onKegiatanChange() {
const jenisSppdDropdown = document.getElementById("jenisSppdDropdown");
const kegiatanDropdown = document.getElementById("kegiatanDropdown");
const subKegiatanDropdown = document.getElementById("subKegiatanDropdown");
const selectedJenisSppd = jenisSppdDropdown.value;
const selectedKegiatan = kegiatanDropdown.value;
subKegiatanDropdown.innerHTML = '<option value="">Pilih Sub Kegiatan</option>'; // Reset Sub Kegiatan
kodeRekeningDropdown.innerHTML = '<option value="">Pilih Kode Rekening</option>'; // Reset Kode Rekening
if (selectedJenisSppd && selectedKegiatan) {
google.script.run.withSuccessHandler(data => {
data.forEach(row => {
if (row[0] === selectedJenisSppd && row[1] === selectedKegiatan) {
const option = document.createElement("option");
option.value = row[2]; // Sub Kegiatan
option.textContent = row[2]; // Sub Kegiatan
subKegiatanDropdown.appendChild(option);
}
});
}).getRekeningData();
}
}
// Mengisi dropdown Kode Rekening saat Sub Kegiatan dipilih
function onSubKegiatanChange() {
const jenisSppdDropdown = document.getElementById("jenisSppdDropdown");
const kegiatanDropdown = document.getElementById("kegiatanDropdown");
const subKegiatanDropdown = document.getElementById("subKegiatanDropdown");
const kodeRekeningDropdown = document.getElementById("kodeRekeningDropdown");
const selectedJenisSppd = jenisSppdDropdown.value;
const selectedKegiatan = kegiatanDropdown.value;
const selectedSubKegiatan = subKegiatanDropdown.value;
kodeRekeningDropdown.innerHTML = '<option value="">Pilih Kode Rekening</option>'; // Reset Kode Rekening
if (selectedJenisSppd && selectedKegiatan && selectedSubKegiatan) {
google.script.run.withSuccessHandler(data => {
data.forEach(row => {
if (row[0] === selectedJenisSppd && row[1] === selectedKegiatan && row[2] === selectedSubKegiatan) {
const option = document.createElement("option");
option.value = row[3]; // Kode Rekening
option.textContent = row[3]; // Kode Rekening
kodeRekeningDropdown.appendChild(option);
}
});
}).getRekeningData();
}
}
// Panggil loadRekeningData saat halaman dimuat
document.addEventListener("DOMContentLoaded", loadRekeningData);
loadUserId();
</script>
</head>
<body>
<div class="container mt-5 mb-5" style="border: 1px solid #ddd; padding: 20px; border-radius: 5px;">
<h2 style="text-align: center;"><strong>INPUT DATA SPPD</strong></h2>
<hr>
<form id="form-input" onsubmit="submitForm(event)">
<!-- Nomor SPT dan Nomor SPPD (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="nomor" class="form-label">Nomor SPT</label>
<input type="text" class="form-control" id="nomor" placeholder="Masukkan Nomor SPT" required>
</div>
<div class="col-md-6">
<label for="nomorsppd" class="form-label">Nomor SPPD</label>
<input type="text" class="form-control" id="nomorsppd" placeholder="Masukkan Nomor SPPD" required>
</div>
</div>
<!-- Dasar Surat (1 baris full) -->
<div class="mb-3">
<label for="dasar" class="form-label">Dasar Surat</label>
<textarea class="form-control" id="dasar" rows="5" placeholder="Masukkan Dasar Surat" required></textarea>
</div>
<!-- Maksud SPPD (1 baris full) -->
<div class="mb-3">
<label for="maksud" class="form-label">Maksud SPPD</label>
<textarea class="form-control" id="maksud" rows="5" placeholder="Masukkan Maksud SPPD" required></textarea>
</div>
<hr>
<!-- Tingkat Biaya dan Alat Angkut (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="tingkatbiaya" class="form-label">Tingkat Biaya</label>
<input type="text" class="form-control" id="tingkatbiaya" placeholder="Masukkan Tingkat Biaya" required>
</div>
<div class="col-md-6">
<label for="alatangkut" class="form-label">Alat Angkut</label>
<select id="alatangkut" class="form-select" required>
<option value="">Pilih Alat Angkut</option>
<option value="Umum">Umum</option>
<option value="Kendaraan Dinas">Kendaraan Dinas</option>
<option value="Bersama Rombongan">Bersama Rombongan</option>
</select>
</div>
</div>
<!-- Asal Berangkat dan Tujuan (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="asalberangkat" class="form-label">Asal Berangkat</label>
<input type="text" class="form-control" id="asalberangkat" placeholder="Masukkan Asal Berangkat" required>
</div>
<div class="col-md-6">
<label for="tujuan" class="form-label">Tujuan</label>
<input type="text" class="form-control" id="tujuan" placeholder="Masukkan Tujuan" required>
</div>
</div>
<hr>
<!-- Tanggal Berangkat, Tanggal Pulang, dan Lama Perjalanan (1 baris 3 kolom) -->
<div class="row mb-3">
<div class="col-md-4">
<label for="tanggalberangkat" class="form-label">Tanggal Berangkat</label>
<input type="date" class="form-control" id="tanggalberangkat" name="tanggalberangkat" required>
</div>
<div class="col-md-4">
<label for="tanggalpulang" class="form-label">Tanggal Pulang</label>
<input type="date" class="form-control" id="tanggalpulang" name="tanggalpulang" required>
</div>
<div class="col-md-4">
<label for="lamaperjalanan" class="form-label">Lama Perjalanan</label>
<input type="text" class="form-control" id="lamaperjalanan" name="lamaperjalanan" readonly>
</div>
</div>
<!-- Jenis SPPD, Kegiatan, Sub Kegiatan, dan Kode Rekening (1 baris 4 kolom) -->
<div class="row mb-3">
<div class="col-md-3">
<label for="jenisSppdDropdown" class="form-label">Jenis SPPD</label>
<select id="jenisSppdDropdown" class="form-select" onchange="onJenisSppdChange()" required>
<option value="">Pilih Jenis SPPD</option>
</select>
</div>
<div class="col-md-3">
<label for="kegiatanDropdown" class="form-label">Kegiatan</label>
<select id="kegiatanDropdown" class="form-select" onchange="onKegiatanChange()" required>
<option value="">Pilih Kegiatan</option>
</select>
</div>
<div class="col-md-3">
<label for="subKegiatanDropdown" class="form-label">Sub Kegiatan</label>
<select id="subKegiatanDropdown" class="form-select" onchange="onSubKegiatanChange()" required>
<option value="">Pilih Sub Kegiatan</option>
</select>
</div>
<div class="col-md-3">
<label for="kodeRekeningDropdown" class="form-label">Kode Rekening</label>
<select id="kodeRekeningDropdown" class="form-select" required>
<option value="">Pilih Kode Rekening</option>
</select>
</div>
</div>
<hr>
<!-- Nama dan NIP (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="nama" class="form-label">Nama</label>
<select id="nama" class="form-select" onchange="onNamaChange()" required>
<option value="">Pilih Nama</option>
</select>
</div>
<div class="col-md-6">
<label for="nip" class="form-label">NIP</label>
<select id="nip" class="form-select" required>
<option value="">Pilih NIP</option>
</select>
</div>
</div>
<!-- Pangkat dan Jabatan (1 baris 2 kolom) -->
<div class="row mb-3">
<div class="col-md-6">
<label for="pangkat" class="form-label">Pangkat</label>
<select id="pangkat" class="form-select" required>
<option value="">Pilih Pangkat</option>
</select>
</div>
<div class="col-md-6">
<label for="jabatan" class="form-label">Jabatan</label>
<select id="jabatan" class="form-select" required>
<option value="">Pilih Jabatan</option>
</select>
</div>
</div>
<hr>
<!-- Instansi (1 baris full) -->
<div class="mb-3">
<label for="instansi" class="form-label">Instansi/Bidang</label>
<input type="text" class="form-control" id="instansi" name="instansi" readonly>
</div>
<!-- Tanggal Dibuat (1 baris full) -->
<div class="mb-3">
<label for="tanggalbuat" class="form-label">Tanggal Dibuat</label>
<input type="date" class="form-control" id="tanggalbuat" required>
</div>
<!-- Lain-Lain (1 baris full) -->
<div class="mb-3">
<label for="lainlain" class="form-label">Lain-Lain</label>
<input type="text" class="form-control" id="lainlain" placeholder="Masukkan Lain-Lain" required>
</div>
<!-- Tabel Pengikut -->
<hr>
<h3 class="mt-4" style="text-align: center;">PENGIKUT</h3>
<!-- Margin top agar ada jarak dengan elemen sebelumnya -->
<div class="table-responsive">
<!-- Table responsive untuk membuat tabel bisa scroll jika sempit -->
<table class="table table-bordered" id="pengikutTable">
<!-- Menambahkan border agar tabel terlihat lebih rapi -->
<thead class="table-light">
<!-- Background lebih terang untuk header tabel -->
<tr style="text-align: center;">
<th>Pengikut</th>
<th>NIP</th>
<th>Pangkat</th>
<th>Jabatan</th>
<th>Tanggal Lahir</th>
<th>Tanggal Lahir</th>
</tr>
</thead>
<tbody>
<!-- Baris pengikut akan ditambahkan di sini -->
</tbody>
</table>
</div>
<!-- Tombol Add Row -->
<button type="button" class="btn btn-secondary mt-3" onclick="addPengikutRow()">Tambah Pengikut</button> <!-- mt-3 untuk margin atas -->
<!-- Submit Button -->
<button type="submit" class="btn btn-primary mt-3">Submit</button> <!-- mt-3 untuk jarak antara tombol submit -->
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
//Hitung hari
document.getElementById('tanggalberangkat').addEventListener('change', hitungLamaPerjalanan);
document.getElementById('tanggalpulang').addEventListener('change', hitungLamaPerjalanan);
function hitungLamaPerjalanan() {
const tanggalBerangkat = document.getElementById('tanggalberangkat').value;
const tanggalPulang = document.getElementById('tanggalpulang').value;
if (tanggalBerangkat && tanggalPulang) {
const date1 = new Date(tanggalBerangkat);
const date2 = new Date(tanggalPulang);
const diffTime = date2 - date1;
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1;
if (diffDays >= 1) {
document.getElementById('lamaperjalanan').value = diffDays + ' Hari';
} else {
document.getElementById('lamaperjalanan').value = '';
alert('Tanggal pulang harus setelah atau sama dengan tanggal berangkat');
}
} else {
document.getElementById('lamaperjalanan').value = '';
}
}
</script>
</body>
</html>
10. Copy dan pastekan script di bawah ini ke laporan.html
Masukkan Password Untuk Melihat Script (Password sama dengan di atas)
<!DOCTYPE html>
<html lang="en">
<head>
<base target="_top">
<?!=includeHeader();?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Data Tabel</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<style>
.header {
display: flex;
align-items: center;
}
.header img {
margin-right: 10px; /* Jarak antara logo dan teks */
}
</style>
</head>
<body>
<br>
<div class="container-fluid d-flex flex-column align-items-center justify-content-start" style="height: 100vh;">
<div class="header">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo" style="width:120px;height:80px;">
<h2 class="mt-4">LAPORAN SPPD DISPARBUD</h2>
</div>
<br>
<div class="table-responsive w-100 border border-primary" style="border: 1px solid; border-radius: 10px;">
<table class="table table-bordered table-hover table-sm" >
<thead>
<tr class="bg-primary" style="text-align: center; color: white;">
<th>Nomor SPT</th>
<th>Nomor SPPD</th>
<th>Jenis SPPD</th>
<th>Nama</th>
<th>NIP</th>
<th>Pangkat</th>
<th>Jabatan</th>
<th>Bidang</th>
<th>Aksi</th>
</tr>
</thead>
<tbody id="tableBody">
<!-- Data akan dimasukkan di sini -->
</tbody>
</table>
</div>
</div>
<!-- Modal for selecting Tanda Tangan -->
<div class="modal fade" id="printModal" tabindex="-1" role="dialog" aria-labelledby="printModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="printModalLabel">Pilih Tanda Tangan</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div id="ttd1" class="form-section">
<!-- TTD1 -->
<div class="form-group">
<label for="jenisTTD">Kepala Dinas</label>
<select id="jenisTTD" class="form-control" onchange="updateTandaTangan()">
<option value="" disabled selected>Pilih Kepala Dinas</option>
</select>
<br>
<select id="namaTTD" class="form-control" onchange="updateDetailTandaTangan()">
<option value=""disabled selected>Pilih Kepala Dinas</option>
</select>
</div>
<hr>
<div class="form-group" style="display:none">
<label for="nipTTD">NIP Kepala Dinas</label>
<input type="text" id="nipTTD" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="pangkatTTD">Pangkat Kepala Dinas</label>
<input type="text" id="pangkatTTD" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="jabatanTTD">Jabatan Kepala Dinas</label>
<input type="text" id="jabatanTTD" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD1">Keterangan TTD 1 Kepala Dinas</label>
<input type="text" id="keteranganTTD1" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD2">Keterangan TTD 2 Kepala Dinas</label>
<input type="text" id="keteranganTTD2" class="form-control" readonly>
</div>
</div>
<div id="ttd2" class="form-section" style="display: none;">
<!-- TTD2 -->
<div class="form-group">
<label for="jenisTTD2">PPTK</label>
<select id="jenisTTD2" class="form-control" onchange="updateTandaTangan2()">
<option value="" disabled selected>Pilih PPTK</option>
</select>
<br>
<select id="namaTTD2" class="form-control" onchange="updateDetailTandaTangan2()">
<option value="" disabled selected>Pilih Nama PPTK</option>
</select>
</div>
<hr>
<div class="form-group" style="display:none">
<label for="nipTTD2">NIP PPTK</label>
<input type="text" id="nipTTD2" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="pangkatTTD2">Pangkat PPTK</label>
<input type="text" id="pangkatTTD2" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="jabatanTTD2">Jabatan PPTK</label>
<input type="text" id="jabatanTTD2" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD12">Keterangan TTD 1 PPTK</label>
<input type="text" id="keteranganTTD12" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD22">Keterangan TTD 2 PPTK</label>
<input type="text" id="keteranganTTD22" class="form-control" readonly>
</div>
</div>
<div id="ttd3" class="form-section" style="display: none;">
<!-- TTD3 -->
<div class="form-group">
<label for="jenisTTD3">Bendahara Pengeluaran</label>
<select id="jenisTTD3" class="form-control" onchange="updateTandaTangan3()">
<option value="" disabled selected>Pilih Bendahara Pengeluaran</option>
</select>
<br>
<select id="namaTTD3" class="form-control" onchange="updateDetailTandaTangan3()">
<option value="" disabled selected>Pilih Nama Bendahara Pengeluaran</option>
</select>
</div>
<div class="form-group" style="display:none">
<label for="nipTTD3">NIP Bendahara Pengeluaran</label>
<input type="text" id="nipTTD3" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="pangkatTTD3">Pangkat Bendahara Pengeluaran</label>
<input type="text" id="pangkatTTD3" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="jabatanTTD3">Jabatan Bendahara Pengeluaran</label>
<input type="text" id="jabatanTTD3" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD13">Keterangan TTD 1 Bendahara Pengeluaran</label>
<input type="text" id="keteranganTTD13" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD23">Keterangan TTD 2 Bendahara Pengeluaran</label>
<input type="text" id="keteranganTTD23" class="form-control" readonly>
</div>
<hr>
<div class="form-group">
<label for="Tanggalprint">Tanggal Print Rincian</label>
<input type="date" id="tanggalprint" class="form-control">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
<button type="button" class="btn btn-primary" id="btnPrint">Print</button>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script>
function fetchData() {
google.script.run.withSuccessHandler(renderData).getData();
google.script.run.withSuccessHandler(renderTandaTanganData).getTandaTanganData();
}
function renderTandaTanganData(data) {
tandaTanganData = data;
// Untuk jenisTTD pertama
const jenisTTDSelect = document.getElementById('jenisTTD');
const uniqueJenisTTD = [...new Set(data.map(item => item.jenisTTD))];
uniqueJenisTTD.forEach(jenis => {
const option = document.createElement('option');
option.value = jenis;
option.textContent = jenis;
jenisTTDSelect.appendChild(option);
});
// Untuk jenisTTD kedua (jenisTTD2)
const jenisTTDSelect2 = document.getElementById('jenisTTD2');
uniqueJenisTTD.forEach(jenis => {
const option2 = document.createElement('option');
option2.value = jenis;
option2.textContent = jenis;
jenisTTDSelect2.appendChild(option2);
});
// Untuk jenisTTD kedua (jenisTTD3)
const jenisTTDSelect3 = document.getElementById('jenisTTD3');
uniqueJenisTTD.forEach(jenis => {
const option3 = document.createElement('option');
option3.value = jenis;
option3.textContent = jenis;
jenisTTDSelect3.appendChild(option3);
});
}
function updateTandaTangan() {
const jenisTTD = document.getElementById('jenisTTD').value;
const namaTTDSelect = document.getElementById('namaTTD');
namaTTDSelect.innerHTML = '<option value="">Pilih Nama Kepala Dinas</option>'; // Reset nama TTD
const filteredData = tandaTanganData.filter(item => item.jenisTTD === jenisTTD);
filteredData.forEach(item => {
const option = document.createElement('option');
option.value = item.namaTTD;
option.textContent = item.namaTTD;
namaTTDSelect.appendChild(option);
});
}
function updateDetailTandaTangan() {
const selectedName = document.getElementById('namaTTD').value;
const selectedData = tandaTanganData.find(item => item.namaTTD === selectedName);
if (selectedData) {
document.getElementById('nipTTD').value = selectedData.nipTTD;
document.getElementById('pangkatTTD').value = selectedData.pangkatTTD;
document.getElementById('jabatanTTD').value = selectedData.jabatanTTD;
document.getElementById('keteranganTTD1').value = selectedData.keteranganTTD1;
document.getElementById('keteranganTTD2').value = selectedData.keteranganTTD2;
} else {
document.getElementById('nipTTD').value = '';
document.getElementById('pangkatTTD').value = '';
document.getElementById('jabatanTTD').value = '';
document.getElementById('keteranganTTD1').value = '';
document.getElementById('keteranganTTD2').value = '';
}
}
function updateTandaTangan2() {
const jenisTTD2 = document.getElementById('jenisTTD2').value;
const namaTTDSelect2 = document.getElementById('namaTTD2');
namaTTDSelect2.innerHTML = '<option value="">Pilih Nama PPTK</option>'; // Reset nama TTD
const filteredData2 = tandaTanganData.filter(item => item.jenisTTD === jenisTTD2);
filteredData2.forEach(item => {
const option = document.createElement('option');
option.value = item.namaTTD;
option.textContent = item.namaTTD;
namaTTDSelect2.appendChild(option);
});
}
function updateDetailTandaTangan2() {
const selectedName2 = document.getElementById('namaTTD2').value;
const selectedData2 = tandaTanganData.find(item => item.namaTTD === selectedName2);
if (selectedData2) {
document.getElementById('nipTTD2').value = selectedData2.nipTTD;
document.getElementById('pangkatTTD2').value = selectedData2.pangkatTTD;
document.getElementById('jabatanTTD2').value = selectedData2.jabatanTTD;
document.getElementById('keteranganTTD12').value = selectedData2.keteranganTTD1;
document.getElementById('keteranganTTD22').value = selectedData2.keteranganTTD2;
} else {
document.getElementById('nipTTD2').value = '';
document.getElementById('pangkatTTD2').value = '';
document.getElementById('jabatanTTD2').value = '';
document.getElementById('keteranganTTD12').value = '';
document.getElementById('keteranganTTD22').value = '';
}
}
//ttd3
function updateTandaTangan3() {
const jenisTTD3 = document.getElementById('jenisTTD3').value;
const namaTTDSelect3 = document.getElementById('namaTTD3');
namaTTDSelect3.innerHTML = '<option value="">Pilih Nama Bendahara Pengeluaran</option>'; // Reset nama TTD
const filteredData3 = tandaTanganData.filter(item => item.jenisTTD === jenisTTD3);
filteredData3.forEach(item => {
const option = document.createElement('option');
option.value = item.namaTTD;
option.textContent = item.namaTTD;
namaTTDSelect3.appendChild(option);
});
}
function updateDetailTandaTangan3() {
const selectedName3 = document.getElementById('namaTTD3').value;
const selectedData3 = tandaTanganData.find(item => item.namaTTD === selectedName3);
if (selectedData3) {
document.getElementById('nipTTD3').value = selectedData3.nipTTD;
document.getElementById('pangkatTTD3').value = selectedData3.pangkatTTD;
document.getElementById('jabatanTTD3').value = selectedData3.jabatanTTD;
document.getElementById('keteranganTTD13').value = selectedData3.keteranganTTD1;
document.getElementById('keteranganTTD23').value = selectedData3.keteranganTTD2;
} else {
document.getElementById('nipTTD3').value = '';
document.getElementById('pangkatTTD3').value = '';
document.getElementById('jabatanTTD3').value = '';
document.getElementById('keteranganTTD13').value = '';
document.getElementById('keteranganTTD23').value = '';
}
}
function renderData(data) {
let tableBody = '';
const groupedData = {};
data.forEach(item => {
const key = `${item['Nomor']}-${item['Nomor SPPD']}-${item['Dasar surat']}-${item['Tingkat Biaya Perjalanan']}-${item['Maksud']}-${item['Alat Angkut']}-${item['Asal Berangkat']}-${item['Tujuan']}-${item['Tanggal Berangkat']}-${item['Tanggal Pulang']}-${item['Lama Perjalanan']}-${item['Instansi']}-${item['Jenis SPPD']}-${item['Kegiatan']}-${item['Sub Kegiatan']}-${item['Kode Rekening']}-${item['Lain-Lain']}-${item['Tanggal Buat']}`;
if (!groupedData[key]) {
groupedData[key] = {
...item,
pengikut: []
};
}
if (item['Pengikut']) {
groupedData[key].pengikut.push({
NIP: item['NIP Pengikut'],
Pangkat: item['Pangkat Pengikut'],
Jabatan: item['Jabatan Pengikut'],
TanggalLahir: item['Tanggal Lahir Pengikut'],
Nama: item['Pengikut'],
});
}
});
const groupedArray = Object.values(groupedData);
groupedArray.forEach((item, index) => {
// Panel Utama
tableBody += `
<tr>
<td>
<button class="btn btn-link" data-toggle="collapse" data-target="#detail1-${index}" aria-expanded="false" aria-controls="detail1-${index}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0"/>
</svg>
</button>
${item['Nomor'] || '-'}
</td>
<td>${item['Nomor SPPD'] || '-'}</td>
<td>${item['Jenis SPPD'] || '-'}</td>
<td>${item['Nama'] || '-'}</td>
<td>${item['NIP'] || '-'}</td>
<td>${item['Pangkat'] || '-'}</td>
<td>${item['Jabatan'] || '-'}</td>
<td>${item['Instansi'] || '-'}</td>
<td>
<button class="btn btn-danger" onclick="deleteData('${item['Nomor']}')">Delete</button>
<button class="btn btn-info" onclick="showPrintModal('${item['Nomor']}')">Print SPT</button>
<button class="btn btn-info" onclick="showPrintModal1('${item['Nomor']}')">Print SPPD</button>
<button class="btn btn-info" onclick="showPrintModal2('${item['Nomor']}')">Print REKAP</button>
</td>
</tr>
<tr class="collapse" id="detail1-${index}">
<td colspan="8">
<table class="table table-bordered table-hover table-sm" style="border: 2px dotted; border-color: #b52468;">
<thead>
<tr style="background-color: #b52468; text-align: center; color: white;">
<th>
<button class="btn btn-link" data-toggle="collapse" data-target="#detail2-${index}" aria-expanded="false" aria-controls="detail2-${index}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-plus-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0"/>
</svg>
</button>
</th>
<th>Dasar Surat</th>
<th>Tingkat Biaya Perjalanan</th>
<th>Maksud</th>
<th>Alat Angkut</th>
<th>Asal Berangkat</th>
<th>Tujuan</th>
<th>Tanggal Berangkat</th>
<th>Tanggal Pulang</th>
<th>Lama Perjalanan</th>
<th>Instansi</th>
<th>Kegiatan</th>
<th>Sub Kegiatan</th>
<th>Kode Rekening</th>
<th>Lain-Lain</th>
<th>Tanggal Buat</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>${item['Dasar surat'] || '-'}</td>
<td>${item['Tingkat Biaya Perjalanan'] || '-'}</td>
<td>${item['Maksud'] || '-'}</td>
<td>${item['Alat Angkut'] || '-'}</td>
<td>${item['Asal Berangkat'] || '-'}</td>
<td>${item['Tujuan'] || '-'}</td>
<td>${item['Tanggal Berangkat'] || '-'}</td>
<td>${item['Tanggal Pulang'] || '-'}</td>
<td>${item['Lama Perjalanan'] || '-'}</td>
<td>${item['Instansi'] || '-'}</td>
<td>${item['Kegiatan'] || '-'}</td>
<td>${item['Sub Kegiatan'] || '-'}</td>
<td>${item['Kode Rekening'] || '-'}</td>
<td>${item['Lain-Lain'] || '-'}</td>
<td>${item['Tanggal Buat'] || '-'}</td>
</tr>
</tbody>
</table>
<div class="collapse" id="detail2-${index}">
<table class="table table-bordered table-hover table-sm" style="border: 2px dotted; border-color: #24b598;">
<thead>
<tr style="background-color: #24b598; text-align: center; color: white; vertical-align: middle;">
<th>
<button class="btn btn-link" data-toggle="collapse" data-target="#detail2-${index}" aria-expanded="false" aria-controls="detail2-${index}">
-
</button>
</th>
<th>Pengikut</th>
<th>NIP Pengikut</th>
<th>Pangkat Pengikut</th>
<th>Jabatan Pengikut</th>
<th>Tanggal Lahir Pengikut</th>
</tr>
</thead>
<tbody>
${item.pengikut.map(p => `
<tr>
<td></td>
<td>${p.Nama || '-'}</td>
<td>${p.NIP || '-'}</td>
<td>${p.Pangkat || '-'}</td>
<td>${p.Jabatan || '-'}</td>
<td>${p.TanggalLahir || '-'}</td>
</tr>
`).join('')}
</tbody>
</table>
</div>
</td>
</tr>
`;
});
document.getElementById('tableBody').innerHTML = tableBody;
}
function deleteData(nomor) {
if (confirm('Apakah Anda yakin ingin menghapus data ini?')) {
google.script.run.withSuccessHandler(() => {
fetchData(); // Muat ulang data setelah penghapusan
}).deleteRow(nomor);
}
}
function showPrintModal(nomor) {
// Reset all form sections
document.getElementById('ttd1').style.display = 'block'; // Show TTD1
document.getElementById('ttd2').style.display = 'none'; // Hide TTD2
document.getElementById('ttd3').style.display = 'none'; // Hide TTD3
// Open the modal
$('#printModal').modal('show');
document.getElementById('btnPrint').onclick = function() {
const jenisTTD = document.getElementById('jenisTTD').value;
const namaTTD = document.getElementById('namaTTD').value;
const nipTTD = document.getElementById('nipTTD').value;
const pangkatTTD = document.getElementById('pangkatTTD').value;
const jabatanTTD = document.getElementById('jabatanTTD').value;
const keteranganTTD1 = document.getElementById('keteranganTTD1').value;
const keteranganTTD2 = document.getElementById('keteranganTTD2').value;
printData(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2);
};
}
function showPrintModal1(nomor) {
// Reset all form sections
document.getElementById('ttd1').style.display = 'block'; // Show TTD1
document.getElementById('ttd2').style.display = 'none'; // Hide TTD2
document.getElementById('ttd3').style.display = 'none'; // Hide TTD3
// Open the modal
$('#printModal').modal('show');
document.getElementById('btnPrint').onclick = function() {
const jenisTTD = document.getElementById('jenisTTD').value;
const namaTTD = document.getElementById('namaTTD').value;
const nipTTD = document.getElementById('nipTTD').value;
const pangkatTTD = document.getElementById('pangkatTTD').value;
const jabatanTTD = document.getElementById('jabatanTTD').value;
const keteranganTTD1 = document.getElementById('keteranganTTD1').value;
const keteranganTTD2 = document.getElementById('keteranganTTD2').value;
printData1(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2);
};
}
function showPrintModal2(nomor) {
// Reset all form sections
document.getElementById('ttd1').style.display = 'block'; // Show TTD1
document.getElementById('ttd2').style.display = 'block'; // Show TTD2
document.getElementById('ttd3').style.display = 'block'; // Hide TTD3
// Open the modal
$('#printModal').modal('show');
document.getElementById('btnPrint').onclick = function() {
// Mengambil nilai dari set pertama
const jenisTTD = document.getElementById('jenisTTD').value;
const namaTTD = document.getElementById('namaTTD').value;
const nipTTD = document.getElementById('nipTTD').value;
const pangkatTTD = document.getElementById('pangkatTTD').value;
const jabatanTTD = document.getElementById('jabatanTTD').value;
const keteranganTTD1 = document.getElementById('keteranganTTD1').value;
const keteranganTTD2 = document.getElementById('keteranganTTD2').value;
// Mengambil nilai dari set kedua (jenisTTD2, namaTTD2, dll.)
const jenisTTD2 = document.getElementById('jenisTTD2').value;
const namaTTD2 = document.getElementById('namaTTD2').value;
const nipTTD2 = document.getElementById('nipTTD2').value;
const pangkatTTD2 = document.getElementById('pangkatTTD2').value;
const jabatanTTD2 = document.getElementById('jabatanTTD2').value;
const keteranganTTD12 = document.getElementById('keteranganTTD12').value;
const keteranganTTD22 = document.getElementById('keteranganTTD22').value;
// Mengambil nilai dari set kedua (jenisTTD3, namaTTD3, dll.)
const jenisTTD3 = document.getElementById('jenisTTD3').value;
const namaTTD3 = document.getElementById('namaTTD3').value;
const nipTTD3 = document.getElementById('nipTTD3').value;
const pangkatTTD3 = document.getElementById('pangkatTTD3').value;
const jabatanTTD3 = document.getElementById('jabatanTTD3').value;
const keteranganTTD13 = document.getElementById('keteranganTTD13').value;
const keteranganTTD23 = document.getElementById('keteranganTTD23').value;
let tanggalprint = document.getElementById('tanggalprint').value;
// Memformat tanggal menjadi dd-NamaBulan-yyyy
if (tanggalprint) {
let tanggal = new Date(tanggalprint);
let day = String(tanggal.getDate()).padStart(2, '0'); // Mengambil tanggal dan menambahkan nol jika perlu
let monthIndex = tanggal.getMonth(); // Mendapatkan index bulan (0-11)
let year = tanggal.getFullYear();
// Array nama bulan dalam bahasa Indonesia
const bulan = [
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
];
let namaBulan = bulan[monthIndex]; // Mengambil nama bulan dari array
tanggalprint = `${day} ${namaBulan} ${year}`; // Format dd-NamaBulan-yyyy
}
// Fungsi print yang baru menangani dua set data
printData2(
nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2,
jenisTTD2, namaTTD2, nipTTD2, pangkatTTD2, jabatanTTD2, keteranganTTD12, keteranganTTD22,
jenisTTD3, namaTTD3, nipTTD3, pangkatTTD3, jabatanTTD3, keteranganTTD13, keteranganTTD23, tanggalprint
);
};
}
// Fungsi untuk mereset dropdown dan field input
function resetDropdowns() {
// Mereset set pertama
document.getElementById('jenisTTD').selectedIndex = 0;
document.getElementById('namaTTD').selectedIndex = 0;
document.getElementById('nipTTD').value = '';
document.getElementById('pangkatTTD').value = '';
document.getElementById('jabatanTTD').value = '';
document.getElementById('keteranganTTD1').value = '';
document.getElementById('keteranganTTD2').value = '';
// Mereset set kedua
document.getElementById('jenisTTD2').selectedIndex = 0;
document.getElementById('namaTTD2').selectedIndex = 0;
document.getElementById('nipTTD2').value = '';
document.getElementById('pangkatTTD2').value = '';
document.getElementById('jabatanTTD2').value = '';
document.getElementById('keteranganTTD12').value = '';
document.getElementById('keteranganTTD22').value = '';
// Mereset set keTIGA
document.getElementById('jenisTTD3').selectedIndex = 0;
document.getElementById('namaTTD3').selectedIndex = 0;
document.getElementById('nipTTD3').value = '';
document.getElementById('pangkatTTD3').value = '';
document.getElementById('jabatanTTD3').value = '';
document.getElementById('keteranganTTD13').value = '';
document.getElementById('keteranganTTD23').value = '';
document.getElementById('tanggalprint').value = '';
}
function getDataByNomor(nomor) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const data = sheet.getDataRange().getValues();
const headers = data[0];
const items = [];
for (let i = 1; i < data.length; i++) {
if (data[i][0] === nomor) { // Ganti 0 dengan indeks kolom yang sesuai
let item = {};
for (let j = 0; j < headers.length; j++) {
if (data[i][j] instanceof Date) {
item[headers[j]] = Utilities.formatDate(data[i][j], Session.getScriptTimeZone(), 'dd/MM/yyyy');
} else {
item[headers[j]] = data[i][j];
}
}
items.push(item);
}
}
return items;
}
</script>
<script>
function printData(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2) {
google.script.run.withSuccessHandler(function(items) {
const printWindow = window.open('', '_blank');
const headerContent = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Surat SPPD</title>
<style>
body { font-family: Arial, sans-serif; font-size: 12px;}
h2, h4 { text-align: center; }
img { display: block; margin: 0 auto; max-width: 100px; } /* Atur gaya gambar */
table { width: 100%; border-collapse: collapse; margin: 5px 0; }
th, td { padding: 2px; }
.pengikut-header { font-weight: bold; background-color: #f2f2f2; }
.kop-surat {
display: flex;
align-items: center;
border-bottom: 2px solid black;
padding: 10px;
margin-bottom: 20px;
}
.kop-surat img {
display: block;
margin-left: auto;
margin-right: auto;
max-width: 500px;
height: 100px;
}
.kop-text {
width: 100%;
text-align: center;
}
.kop-text h1, h2 {
margin: 0;
font-size: 18px;
}
.kop-text p {
margin: 5px 0;
font-size: 14px;
}
/* Styling untuk judul surat */
.judul-surat {
text-align: center;
margin-top: 20px;
}
.judul-surat h2 {
margin: 0;
font-size: 20px;
text-transform: uppercase;
}
/* Styling untuk nomor surat agar pas di bawah judul */
.nomor-surat {
text-align: center;
margin-top: 5px;
}
.nomor-surat p {
margin: 0;
font-size: 14px;
}
.garis {
border-top: 1px solid black;
width: 300px;
margin: 5px auto 0;
}
.border-bottom {
border-bottom: 1px solid black; /* Ganti dengan warna atau ketebalan yang diinginkan */
}
</style>
</head>
<body>
<div class="kop-surat">
<!-- Logo di sebelah kiri -->
<div class="logo">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo">
</div>
<!-- Teks rata tengah -->
<div class="kop-text">
<h2>PEMERINTAH KABUPATEN JEMBER</h2>
<h1>DINAS PARIWISATA DAN KEBUDAYAAN</h1>
<p>JL.MH. Thamrin, Ajung Kulon, Ajung, Jember, Jawa Timur 68175</p>
<p>Telepon: (0331) 335244, Faksimile: (0331) 335243</p>
<p>Email: disparbud@jemberkab.go.id</p>
</div>
</div>
`;
let tablesContent = '';
items.forEach(item => {
const formatDate = (date) => {
if (!date) return '-';
const dateObj = new Date(date);
const options = { day: 'numeric', month: 'long', year: 'numeric' };
return dateObj.toLocaleDateString('id-ID', options); // Format sesuai "1 Agustus 2024"
};
tablesContent += `
<div class="judul-surat">
<h2>SURAT PERINTAH TUGAS</h2>
</div>
<div class="garis"></div>
<div class="nomor-surat">
<p>Nomor: ${item.commonData['Nomor']}</p>
</div>
<br>
<table>
<tr><th style="width: 22%; text-align: right;" >Dasar Surat</th><td style="width: 1%; text-align: center;">:</td><td style="width: 77%; text-align: left;" >${item.commonData['Dasar surat'] || '-'}</td></tr>
</table>
<h4>MEMERINTAHKAN</h4>
<table>
<tr>
<th style="width: 10%; text-align: left;">Kepada :</th><td style="width: 1%; text-align: left;">1.</td><td style="width: 10%; text-align: left;">Nama</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${item.commonData['Nama'] || '-'}</td>
</tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">Pangkat/Gol</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${item.commonData['Pangkat'] || '-'}</td>
</tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">NIP</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${item.commonData['NIP'] || '-'}</td>
</tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">Jabatan</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${item.commonData['Jabatan'] || '-'}</td>
</tr>
`;
// Tampilkan semua data pengikut sebagai baris tambahan
item.followers.forEach((follower, index) => {
tablesContent += `
<tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;">${index + 2}.</td><td style="width: 10%; text-align: left;">Nama</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${follower['Pengikut'] || '-'}</td>
</tr>
<tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">Pangkat/Gol</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${follower['Pangkat Pengikut'] || '-'}</td>
</tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">NIP</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${follower['NIP Pengikut'] || '-'}</td>
</tr>
<tr>
<tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">Jabatan</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${follower['Jabatan Pengikut'] || '-'}</td>
</tr>
`;
});
tablesContent += `
</table>
<br>
<table>
<tr>
<th style="width: 10%; text-align: left;">Maksud :</th><td style="width: 90%; text-align: left;">${item.commonData['Maksud'] || '-'}</td>
</tr>
</table>
<table>
</table>
<br>
<table>
<tr>
<th style="width: 50%; text-align: left;"></th><td style="width: 50%; text-align: left;">${keteranganTTD1}<br>${keteranganTTD2}<br><br><br><br> ${namaTTD}<br>${pangkatTTD}<br>NIP.${nipTTD}</td>
</tr>
</table>
<pagebreak /> <!-- Menambahkan pemisah halaman di antara tabel -->
`;
});
const content = headerContent + tablesContent + '</body></html>';
printWindow.document.write(content);
printWindow.document.close(); // Menghentikan penulisan ke dokumen
printWindow.print(); // Memanggil dialog print
printWindow.close(); // Menutup jendela setelah mencetak
$('#printModal').modal('hide'); // Menutup modal setelah mencetak
resetDropdowns();
}).getDataByNomor(nomor);
}
// Close modal on 'Close' or 'Cancel' button click
$('.close, .btn-secondary').on('click', function() {
$('#printModal').modal('hide');
});
function terbilang(nilai) {
const angka = ["", "Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh", "Delapan", "Sembilan", "Sepuluh", "Sebelas"];
let hasil = "";
if (nilai < 12) {
hasil = angka[nilai];
} else if (nilai < 20) {
hasil = terbilang(nilai - 10) + " Belas";
} else if (nilai < 100) {
hasil = terbilang(Math.floor(nilai / 10)) + " Puluh " + terbilang(nilai % 10);
} else if (nilai < 200) {
hasil = "Seratus " + terbilang(nilai - 100);
} else if (nilai < 1000) {
hasil = terbilang(Math.floor(nilai / 100)) + " Ratus " + terbilang(nilai % 100);
} else if (nilai < 2000) {
hasil = "Seribu " + terbilang(nilai - 1000);
} else if (nilai < 1000000) {
hasil = terbilang(Math.floor(nilai / 1000)) + " Ribu " + terbilang(nilai % 1000);
} else if (nilai < 1000000000) {
hasil = terbilang(Math.floor(nilai / 1000000)) + " Juta " + terbilang(nilai % 1000000);
} else if (nilai < 1000000000000) {
hasil = terbilang(Math.floor(nilai / 1000000000)) + " Miliar " + terbilang(nilai % 1000000000);
} else if (nilai < 1000000000000000) {
hasil = terbilang(Math.floor(nilai / 1000000000000)) + " Triliun " + terbilang(nilai % 1000000000000);
}
return hasil.trim();
}
window.onload = fetchData;
</script>
<script>
function printData1(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2) {
google.script.run.withSuccessHandler(function(items) {
const printWindow = window.open('', '_blank');
const headerContent = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Surat SPPD</title>
<style>
body { font-family: Arial, sans-serif; font-size: 12px; transform: scale(1);}
h2, h4 { text-align: center; }
img { display: block; margin: 0 auto; max-width: 100px; } /* Atur gaya gambar */
table { width: 100%; border-collapse: collapse; margin: 10px 0; }
th, td { padding: 5px; }
.pengikut-header { font-weight: bold; background-color: #f2f2f2; }
.kop-surat {
display: flex;
align-items: center;
border-bottom: 2px solid black;
padding: 10px;
margin-bottom: 20px;
}
.kop-surat img {
display: block;
margin-left: auto;
margin-right: auto;
max-width: 500px;
height: 100px;
}
.kop-text {
width: 100%;
text-align: center;
}
.kop-text h1, h2 {
margin: 0;
font-size: 18px;
}
.kop-text p {
margin: 5px 0;
font-size: 14px;
}
/* Styling untuk judul surat */
.judul-surat {
text-align: center;
margin-top: 20px;
}
.judul-surat h2 {
margin: 0;
font-size: 20px;
text-transform: uppercase;
}
/* Styling untuk nomor surat agar pas di bawah judul */
.nomor-surat {
text-align: center;
margin-top: 5px;
}
.nomor-surat p {
margin: 0;
font-size: 14px;
}
.garis {
border-top: 1px solid black;
width: 300px;
margin: 5px auto 0;
}
.border-bottom {
border-bottom: 1px solid black; /* Ganti dengan warna atau ketebalan yang diinginkan */
}
.border-right {
border-right: 1px solid black; /* Ganti dengan warna atau ketebalan yang diinginkan */
}
.border {
border: 1px solid black; /* Border untuk Kolom 2 dan Data 2 */
}
</style>
</head>
<body>
<div class="kop-surat">
<!-- Logo di sebelah kiri -->
<div class="logo">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo">
</div>
<!-- Teks rata tengah -->
<div class="kop-text">
<h2>PEMERINTAH KABUPATEN JEMBER</h2>
<h1>DINAS PARIWISATA DAN KEBUDAYAAN</h1>
<p>JL.MH. Thamrin, Ajung Kulon, Ajung, Jember, Jawa Timur 68175</p>
<p>Telepon: (0331) 335244, Faksimile: (0331) 335243</p>
<p>Email: disparbud@jemberkab.go.id</p>
</div>
</div>
`;
let tablesContent = '';
items.forEach(item => {
const formatDate = (date) => {
if (!date) return '-';
const dateObj = new Date(date);
const options = { day: 'numeric', month: 'long', year: 'numeric' };
return dateObj.toLocaleDateString('id-ID', options); // Format sesuai "1 Agustus 2024"
};
tablesContent += `
<table>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Lembar ke</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;"> </td>
</tr>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Kode No.</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;"> </td>
</tr>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Nomor</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;">${item.commonData['Nomor SPPD']} </td>
</tr>
</table>
<div class="judul-surat">
<h2>SURAT PERJALANAN DINAS (SPD)</h2>
</div>
<div class="garis"></div>
<div class="nomor-surat">
</div>
<br>
<table class="border">
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">1</th><td style="width: 45%; text-align: left;" class="border">Pejabat Pembuat Komitment</td><td style="width: 50%; text-align: left;">${namaTTD}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">2</th><td style="width: 45%; text-align: left;" class="border">Nama/NIP Pegawai yang <br> melaksanakan perjalanan dinas</td><td style="width: 50%; text-align: left;">${item.commonData['Nama'] || '-'} / ${item.commonData['NIP'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">3</th><td style="width: 46%; text-align: left;" class="border">a. Pangkat dan Golongan <br><br> b. Jabatan/Instansi <br><br> c. Tingkat Biaya Perjalanan Dinas</td><td style="width: 50%; text-align: left;">${item.commonData['Pangkat'] || '-'} <br><br> ${item.commonData['Jabatan'] || '-'} <br><br> ${item.commonData['Tingkat Biaya Perjalan'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">4</th><td style="width: 45%; text-align: left;" class="border">Maksud Perjalanan Dinas</td><td style="width: 50%; text-align: left;">${item.commonData['Maksud'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">5</th><td style="width: 45%; text-align: left;" class="border">Alat angkut yang digunakan</td><td style="width: 50%; text-align: left;">${item.commonData['Alat Angkut'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">6</th><td style="width: 45%; text-align: left;" class="border">a. Tempat Berangkat <br><br> b. Tempat Tujuan</td><td style="width: 50%; text-align: left;">a. ${item.commonData['Asal Berangkat'] || '-'}<br> <br> b. ${item.commonData['Tujuan'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">7</th><td style="width: 45%; text-align: left;" class="border">a. Lama Perjalanan Dinas <br><br> b. Tanggal Berangkat <br><br> c. Tanggal harus kembali/tiba ditempat baru*</td><td style="width: 50%; text-align: left;">a. ${item.commonData['Lama Perjalanan'] || '-'}<br> <br> b. ${formatDate(item.commonData['Tanggal Berangkat'] || '-')} <br> <br> c. ${formatDate(item.commonData['Tanggal Pulang'] || '-')}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">8</th><td style="width: 45%; text-align: left;" class="border">Pengikut : Nama</td><td style="width: 50%; text-align: left;"> Tanggal Lahir</td>
</tr>
`;
// Tampilkan semua data pengikut sebagai baris tambahan
item.followers.forEach((follower, index) => {
tablesContent += `
<tr class="border-right">
<th style="width: 5%; text-align: center;" class="border-right"></th><td style="width: 45%; text-align: left; "class="border-right">${index + 1}.${follower['Pengikut'] || '-'}</td><td style="width: 50%; text-align: left;">${follower['Tanggal Lahir Pengikut'] || '-'}</td>
</tr>
`;
});
tablesContent += `
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">9</th><td style="width: 45%; text-align: left;" class="border">Pembebanan anggaran <br>a. Instansi <br><br> b. Akun</td><td style="width: 50%; text-align: left;"> <br><br>a. Dinas Pariwisata dan Kebudayaan<br><br> b. ${item.commonData['Kode Rekening'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">10</th><td style="width: 45%; text-align: left;" class="border">Keterangan lain-lain</td><td style="width: 50%; text-align: left;">${item.commonData['Lain-Lain'] || '-'}</td>
</tr>
</table>
<table>
<tr>
<th style="width: 5%; text-align: center;"></th><td style="width: 45%; text-align: left;"></td><td style="width: 50%; text-align: left;">Dikeluarkan di Jember<br>Tanggal ${formatDate(item.commonData['Tanggal Buat'])}<br>${keteranganTTD1}<br><br><br><br>${namaTTD}<br>NIP${nipTTD}</td>
</tr>
</table>
<pagebreak /> <!-- Menambahkan pemisah halaman di antara tabel -->
`;
});
const content = headerContent + tablesContent + '</body></html>';
printWindow.document.write(content);
printWindow.document.close(); // Menghentikan penulisan ke dokumen
printWindow.print(); // Memanggil dialog print
printWindow.close(); // Menutup jendela setelah mencetak
$('#printModal').modal('hide'); // Menutup modal setelah mencetak
resetDropdowns();
}).getDataByNomor(nomor);
}
// Close modal on 'Close' or 'Cancel' button click
$('.close, .btn-secondary').on('click', function() {
$('#printModal').modal('hide');
});
</script>
<script>
function printData2(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2,
jenisTTD2, namaTTD2, nipTTD2, pangkatTTD2, jabatanTTD2, keteranganTTD12, keteranganTTD22, jenisTTD3, namaTTD3, nipTTD3, pangkatTTD3, jabatanTTD3, keteranganTTD13, keteranganTTD23, tanggalprint) {
google.script.run.withSuccessHandler(function(items) {
const printWindow = window.open('', '_blank');
const headerContent = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Surat SPPD</title>
<style>
body { font-family: Arial, sans-serif; font-size: 12px; transform: scale(1);}
h2, h4 { text-align: center; }
img { display: block; margin: 0 auto; max-width: 100px; } /* Atur gaya gambar */
table { width: 100%; border-collapse: collapse; margin: 10px 0; }
th, td { padding: 5px; }
.pengikut-header { font-weight: bold; background-color: #f2f2f2; }
.kop-surat {
display: flex;
align-items: center;
border-bottom: 2px solid black;
padding: 10px;
margin-bottom: 20px;
}
.kop-surat img {
display: block;
margin-left: auto;
margin-right: auto;
max-width: 500px;
height: 100px;
}
.kop-text {
width: 100%;
text-align: center;
}
.kop-text h1 {
margin: 0;
font-size: 18px;
text-align: center;
}
.kop-text p {
margin: 5px 0;
font-size: 14px;
}
/* Styling untuk judul surat */
.judul-surat {
text-align: center;
margin-top: 20px;
}
.judul-surat h2 {
margin: 0;
font-size: 20px;
text-transform: uppercase;
}
/* Styling untuk nomor surat agar pas di bawah judul */
.nomor-surat {
text-align: center;
margin-top: 5px;
}
.nomor-surat p {
margin: 0;
font-size: 14px;
}
.garis {
border-top: 1px solid black;
width: 300px;
margin: 5px auto 0;
}
.border-bottom {
border-bottom: 1px solid black; /* Ganti dengan warna atau ketebalan yang diinginkan */
}
</style>
</head>
<body>
`;
let tablesContent = '';
items.forEach(item => {
// Hitung total nominal
const totalNominal = item.rincian.reduce((total, r) => total + (parseFloat(r.nominal) || 0), 0);
tablesContent += `
<div class="kop-surat">
<!-- Logo di sebelah kiri -->
<div class="logo">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo">
</div>
<!-- Teks rata tengah -->
<div class="kop-text">
<h1>PEMERINTAH KABUPATEN JEMBER</h1>
<h1>DINAS PARIWISATA DAN KEBUDAYAAN</h1>
<p>JL.MH. Thamrin, Ajung Kulon, Ajung, Jember, Jawa Timur 68175</p>
<p>Telepon: (0331) 335244, Faksimile: (0331) 335243</p>
<p>Email: disparbud@jemberkab.go.id</p>
</div>
</div>
<table>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Lembar ke</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;"> I </td>
</tr>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Nomor</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;">${item.nomorsppd} </td>
</tr>
</table>
<div class="judul-surat">
<h2>RINCIAN PERJALANAN DINAS</h2>
</div>
<div class="garis"></div>
<table>
<tr><th style="width: 25%; text-align: left;">Maksud Perjalanan Dinas</th><td style="width: 1%; text-align: center;">:</td><td style="width: 74%; text-align: left;">${item.maksud || '-'}</td></tr>
<tr><th style="width: 25%; text-align: left;">Tanggal</th><td style="width: 1%; text-align: center;">:</td><td style="width: 74%; text-align: left;">${item.tanggalBerangkat || '-'}</td></tr>
</table>
<table border="1" style="width: 100%; border-collapse: collapse;">
<thead>
<tr>
<th style="text-align: center;">Rincian</th>
<th style="text-align: center;">Nominal</th>
<th style="text-align: center;">Keterangan</th>
</tr>
</thead>
<tbody>
${item.rincian.map(r => `
<tr>
<td>${r.rincian || '-'}</td>
<td style="text-align: right;">${(r.nominal || 0).toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</td>
<td>${r.keterangan || '-'}</td>
</tr>
`).join('')}
</tbody>
<tfoot>
<tr>
<td style="text-align: right;"><strong>Total:</strong></td>
<td style="text-align: right;"><strong>${totalNominal.toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</strong></td>
<td></td>
</tr>
</tfoot>
</table>
<table>
<tr><th style="width: 40%; text-align: left;"></th><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Jember, ${tanggalprint}</td></tr>
</table>
<table>
<tr><td style="width: 40%; text-align: center;">Telah dibayar sejumlah</td><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Telah Menerima Jumlah Uang Sebesar</td></tr>
<tr><th style="width: 40%; text-align: center;"><strong>${totalNominal.toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</strong></th><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;"><strong>${totalNominal.toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</strong></td></tr>
</table>
<table>
<tr><td style="width: 40%; text-align: center;">Bendahara Pengeluaran</td><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Yang Menerima</td></tr>
</table>
<br>
<br>
<table>
<tr><td style="width: 40%; text-align: center; padding: 0; margin: 0;"><u>${namaTTD3}</u></td><td style="width: 20%; text-align: center;" padding: 0; margin: 0;></td><td style="width: 40%; text-align: center; padding: 0; margin: 0;"><u>${item.nama || '-'}</u></td></tr>
<tr><td style="width: 40%; text-align: center; padding: 0; margin: 0;">NIP. ${nipTTD3}</td><td style="width: 20%; text-align: center; padding: 0; margin: 0;"></td><td style="width: 40%; text-align: center; padding: 0; margin: 0;">NIP. ${item.nip || '-'}</td></tr>
</table>
<div style="page-break-after: always;"></div>
<div class="kop-surat">
<!-- Logo di sebelah kiri -->
<div class="logo">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo">
</div>
<!-- Teks rata tengah -->
<div class="kop-text">
<h1>PEMERINTAH KABUPATEN JEMBER</h1>
<h1>DINAS PARIWISATA DAN KEBUDAYAAN</h1>
<p>JL.MH. Thamrin, Ajung Kulon, Ajung, Jember, Jawa Timur 68175</p>
<p>Telepon: (0331) 335244, Faksimile: (0331) 335243</p>
<p>Email: disparbud@jemberkab.go.id</p>
</div>
</div>
<div class="judul-surat">
<h2>LAPORAN PERJALANAN DINAS</h2>
</div>
<div class="garis"></div>
<table>
<tr><th style="width: 1%; text-align: left; vertical-align: top;">I.</th><td style="width: 25%; text-align: left; vertical-align: top;">Dasar </td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 73%; text-align: left;">Surat Perintah Melaksanakan Tugas</td></tr>
<tr><th style="width: 1%; text-align: left; vertical-align: top;"></th><td style="width: 25%; text-align: left; vertical-align: top;"></td><td style="width: 1%; text-align: left; vertical-align: top;"></td><td style="width: 73%; text-align: left;">Nomor : ${item.nomor}</td></tr>
<tr><th style="width: 1%; text-align: left; vertical-align: top;"></th><td style="width: 25%; text-align: left; vertical-align: top;"></td><td style="width: 1%; text-align: left; vertical-align: top;"></td><td style="width: 73%; text-align: left;">Tanggal : ${item.tanggalBuat || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">II.</th><td style="width: 25%; text-align: left;">Nama Petugas</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.nama || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">III.</th><td style="width: 25%; text-align: left;">Pangkat/Gol.</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.pangkatgol || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">IV.</th><td style="width: 25%; text-align: left;">Tempat/Tujuan</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.tujuan || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">V.</th><td style="width: 25%; text-align: left;">Maksud Perjalanan</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.maksud || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">VI.</th><td style="width: 25%; text-align: left;">Lama Perjalanan</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.lamaPerjalanan || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left; vertical-align: top;">VII.</th><td style="width: 25%; text-align: left; vertical-align: top;">Hasil Kunjungan </td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 73%; text-align: left;">${item.hasilKunjungan || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">VIII.</th><td style="width: 25%; text-align: left;">Permasalahan</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.permasalahan || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">IX.</th><td style="width: 25%; text-align: left;">Penyelesaian</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.penyelesaian || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">X.</th><td style="width: 25%; text-align: left;">Saran</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.saran || '-'}</td></tr>
<br>
<table>
<tr><th style="width: 40%; text-align: left;"></th><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Jember, ${tanggalprint}</td></tr>
</table>
<table>
<tr><th style="width: 40%; text-align: center;"></th><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Pelapor</td></tr>
</table>
<br>
<br>
<table>
<tr><th style="width: 40%; text-align: center; padding: 0; margin: 0;"></th><td style="width: 20%; text-align: center;" padding: 0; margin: 0;></td><td style="width: 40%; text-align: center; padding: 0; margin: 0;"><u>${item.nama || '-'}</u></td></tr>
<tr><th style="width: 40%; text-align: center; padding: 0; margin: 0;"></th><td style="width: 20%; text-align: center; padding: 0; margin: 0;"></td><td style="width: 40%; text-align: center; padding: 0; margin: 0;">NIP. ${item.nip || '-'}</td></tr>
</table>
</table>
<div style="page-break-after: always;"></div>
<table>
<tr><td style="width: 54%;"></td><td style="width: 24%;">Kode Kegiatan</td><td style="width: 1%;">:</td><td style="width: 30%;">${item.kegiatan}</td></tr>
<tr><td style="width: 54%;"></td><td style="width: 24%;">Kode Sub Kegiatan</td><td style="width: 1%;">:</td><td style="width: 30%;">${item.subkegiatan}</td></tr>
<tr><td style="width: 54%;"></td><td style="width: 24%;">Kode Rekening</td><td style="width: 1%;">:</td><td style="width: 30%;">${item.koderekening}</td></tr>
</table>
<div class="judul-surat">
<h2>BUKTI PEMBAYARAN</h2>
</div>
<div class="garis"></div>
<table>
<tr><td style="width: 29%; text-align: left; vertical-align: top;">Telah Diterima Dari</td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 70%; text-align: left;">Kepala Dinas Pariwisata dan Kebudayaan Kab Jember</td></tr>
<tr><td style="width: 29%; text-align: left; vertical-align: top;">Banyaknya Uang</td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 70%; text-align: left;border: 1px solid black; font-style: italic;">${terbilang(totalNominal || 0)} Rupiah</td></tr>
<tr><td style="width: 29%; text-align: left; vertical-align: top;">Untuk Pembayaran</td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 70%; text-align: left;">Belanja Perjalanan Dinas Untuk ${item.maksud || '-'} di ${item.tujuan || '-'} selama ${item.lamaPerjalanan || '-'} dari tanggal ${item.tanggalBerangkat || '-'} s/d ${item.tanggalPulang || '-'} </td></tr>
<table>
<tr><th style="width: 30%; font-size: 25px; text-align: center; vertical-align: top; border: 1px solid black; font-style: italic;"><strong>${totalNominal.toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</strong></th><td style="width: 70%; text-align: left;"></td></tr>
</table>
<table>
<tr><td style="width: 40%; text-align: left;"></td><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Jember, ${tanggalprint}</td></tr>
</table>
<br>
<table>
<tr><td style="width: 33%; text-align: center;"></td><td style="width: 34%; text-align: center;">Lunas di bayar<br>Tanggal ${tanggalprint}</td><td style="width: 33%; text-align: center;"></td></tr>
</table>
<table>
<tr><td style="width: 33%; text-align: center;">PPTK</td><td style="width: 34%; text-align: center;">Bendahara Pengeluaran</td><td style="width: 33%; text-align: center;">Yang Menerima</td></tr>
</table>
<br>
<table>
<tr><td style="width: 33%; text-align: center;"><u>${namaTTD2}</u><br>NIP. ${nipTTD2}</td><td style="width: 34%; text-align: center;"><u>${namaTTD3}</u><br>NIP. ${nipTTD3}</td><td style="width: 33%; text-align: center;"><u>${item.nama || '-'}</u><br>NIP. ${item.nip || '-'}</td></tr>
</table>
<table>
<tr><td style="width: 33%; text-align: center;"></td><td style="width: 34%; text-align: center;">Pengguna Anggaran Selaku<br>Pejabat Pembuat Komitmen</td><td style="width: 33%; text-align: center;"></td></tr>
</table>
<br>
<br>
<table>
<tr><td style="width: 33%; text-align: center;"></td><td style="width: 34%; text-align: center;"><u>${namaTTD}</u><br>NIP. ${nipTTD}</td><td style="width: 33%; text-align: center;"></td></tr>
</table>
</table>
<div style="page-break-after: always;"></div>
`;
});
// Close the print window with the content
printWindow.document.write(headerContent + tablesContent);
printWindow.document.close(); // Menghentikan penulisan ke dokumen
printWindow.print(); // Memanggil dialog print
printWindow.close(); // Menutup jendela setelah mencetak
$('#printModal').modal('hide'); // Menutup modal setelah mencetak
resetDropdowns();
}).getDataByNomor2(nomor);
}
// Close modal on 'Close' or 'Cancel' button click
$('.close, .btn-secondary').on('click', function() {
$('#printModal').modal('hide');
});
function loadUserId() {
google.script.run.withSuccessHandler(function(userId) {
console.log('User ID:', userId);
document.getElementById("userIdDisplay").innerHTML = userId ? userId : "Guest";
// Periksa apakah pengguna adalah admin
google.script.run.withSuccessHandler(function(isAdmin) {
if (isAdmin) {
document.getElementById("sppdMenu").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu1").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu2").style.display = "block"; // Tampilkan menu
}
}).isUserAdmin(); // Panggil fungsi untuk memeriksa status admin
}).getUserId();
}
loadUserId();
function loadData() {
google.script.run.withSuccessHandler(function(data) {
// Tangani data yang diterima dan tampilkan di HTML
console.log(data); // Atau manipulasi DOM untuk menampilkan data
}).getData();
}
loadData();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<base target="_top">
<?!=includeHeader();?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Data Tabel</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<style>
.header {
display: flex;
align-items: center;
}
.header img {
margin-right: 10px; /* Jarak antara logo dan teks */
}
</style>
</head>
<body>
<br>
<div class="container-fluid d-flex flex-column align-items-center justify-content-start" style="height: 100vh;">
<div class="header">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo" style="width:120px;height:80px;">
<h2 class="mt-4">LAPORAN SPPD DISPARBUD</h2>
</div>
<br>
<div class="table-responsive w-100 border border-primary" style="border: 1px solid; border-radius: 10px;">
<table class="table table-bordered table-hover table-sm" >
<thead>
<tr class="bg-primary" style="text-align: center; color: white;">
<th>Nomor SPT</th>
<th>Nomor SPPD</th>
<th>Jenis SPPD</th>
<th>Nama</th>
<th>NIP</th>
<th>Pangkat</th>
<th>Jabatan</th>
<th>Bidang</th>
<th>Aksi</th>
</tr>
</thead>
<tbody id="tableBody">
<!-- Data akan dimasukkan di sini -->
</tbody>
</table>
</div>
</div>
<!-- Modal for selecting Tanda Tangan -->
<div class="modal fade" id="printModal" tabindex="-1" role="dialog" aria-labelledby="printModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="printModalLabel">Pilih Tanda Tangan</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div id="ttd1" class="form-section">
<!-- TTD1 -->
<div class="form-group">
<label for="jenisTTD">Kepala Dinas</label>
<select id="jenisTTD" class="form-control" onchange="updateTandaTangan()">
<option value="" disabled selected>Pilih Kepala Dinas</option>
</select>
<br>
<select id="namaTTD" class="form-control" onchange="updateDetailTandaTangan()">
<option value=""disabled selected>Pilih Kepala Dinas</option>
</select>
</div>
<hr>
<div class="form-group" style="display:none">
<label for="nipTTD">NIP Kepala Dinas</label>
<input type="text" id="nipTTD" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="pangkatTTD">Pangkat Kepala Dinas</label>
<input type="text" id="pangkatTTD" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="jabatanTTD">Jabatan Kepala Dinas</label>
<input type="text" id="jabatanTTD" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD1">Keterangan TTD 1 Kepala Dinas</label>
<input type="text" id="keteranganTTD1" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD2">Keterangan TTD 2 Kepala Dinas</label>
<input type="text" id="keteranganTTD2" class="form-control" readonly>
</div>
</div>
<div id="ttd2" class="form-section" style="display: none;">
<!-- TTD2 -->
<div class="form-group">
<label for="jenisTTD2">PPTK</label>
<select id="jenisTTD2" class="form-control" onchange="updateTandaTangan2()">
<option value="" disabled selected>Pilih PPTK</option>
</select>
<br>
<select id="namaTTD2" class="form-control" onchange="updateDetailTandaTangan2()">
<option value="" disabled selected>Pilih Nama PPTK</option>
</select>
</div>
<hr>
<div class="form-group" style="display:none">
<label for="nipTTD2">NIP PPTK</label>
<input type="text" id="nipTTD2" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="pangkatTTD2">Pangkat PPTK</label>
<input type="text" id="pangkatTTD2" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="jabatanTTD2">Jabatan PPTK</label>
<input type="text" id="jabatanTTD2" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD12">Keterangan TTD 1 PPTK</label>
<input type="text" id="keteranganTTD12" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD22">Keterangan TTD 2 PPTK</label>
<input type="text" id="keteranganTTD22" class="form-control" readonly>
</div>
</div>
<div id="ttd3" class="form-section" style="display: none;">
<!-- TTD3 -->
<div class="form-group">
<label for="jenisTTD3">Bendahara Pengeluaran</label>
<select id="jenisTTD3" class="form-control" onchange="updateTandaTangan3()">
<option value="" disabled selected>Pilih Bendahara Pengeluaran</option>
</select>
<br>
<select id="namaTTD3" class="form-control" onchange="updateDetailTandaTangan3()">
<option value="" disabled selected>Pilih Nama Bendahara Pengeluaran</option>
</select>
</div>
<div class="form-group" style="display:none">
<label for="nipTTD3">NIP Bendahara Pengeluaran</label>
<input type="text" id="nipTTD3" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="pangkatTTD3">Pangkat Bendahara Pengeluaran</label>
<input type="text" id="pangkatTTD3" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="jabatanTTD3">Jabatan Bendahara Pengeluaran</label>
<input type="text" id="jabatanTTD3" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD13">Keterangan TTD 1 Bendahara Pengeluaran</label>
<input type="text" id="keteranganTTD13" class="form-control" readonly>
</div>
<div class="form-group" style="display:none">
<label for="keteranganTTD23">Keterangan TTD 2 Bendahara Pengeluaran</label>
<input type="text" id="keteranganTTD23" class="form-control" readonly>
</div>
<hr>
<div class="form-group">
<label for="Tanggalprint">Tanggal Print Rincian</label>
<input type="date" id="tanggalprint" class="form-control">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
<button type="button" class="btn btn-primary" id="btnPrint">Print</button>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script>
function fetchData() {
google.script.run.withSuccessHandler(renderData).getData();
google.script.run.withSuccessHandler(renderTandaTanganData).getTandaTanganData();
}
function renderTandaTanganData(data) {
tandaTanganData = data;
// Untuk jenisTTD pertama
const jenisTTDSelect = document.getElementById('jenisTTD');
const uniqueJenisTTD = [...new Set(data.map(item => item.jenisTTD))];
uniqueJenisTTD.forEach(jenis => {
const option = document.createElement('option');
option.value = jenis;
option.textContent = jenis;
jenisTTDSelect.appendChild(option);
});
// Untuk jenisTTD kedua (jenisTTD2)
const jenisTTDSelect2 = document.getElementById('jenisTTD2');
uniqueJenisTTD.forEach(jenis => {
const option2 = document.createElement('option');
option2.value = jenis;
option2.textContent = jenis;
jenisTTDSelect2.appendChild(option2);
});
// Untuk jenisTTD kedua (jenisTTD3)
const jenisTTDSelect3 = document.getElementById('jenisTTD3');
uniqueJenisTTD.forEach(jenis => {
const option3 = document.createElement('option');
option3.value = jenis;
option3.textContent = jenis;
jenisTTDSelect3.appendChild(option3);
});
}
function updateTandaTangan() {
const jenisTTD = document.getElementById('jenisTTD').value;
const namaTTDSelect = document.getElementById('namaTTD');
namaTTDSelect.innerHTML = '<option value="">Pilih Nama Kepala Dinas</option>'; // Reset nama TTD
const filteredData = tandaTanganData.filter(item => item.jenisTTD === jenisTTD);
filteredData.forEach(item => {
const option = document.createElement('option');
option.value = item.namaTTD;
option.textContent = item.namaTTD;
namaTTDSelect.appendChild(option);
});
}
function updateDetailTandaTangan() {
const selectedName = document.getElementById('namaTTD').value;
const selectedData = tandaTanganData.find(item => item.namaTTD === selectedName);
if (selectedData) {
document.getElementById('nipTTD').value = selectedData.nipTTD;
document.getElementById('pangkatTTD').value = selectedData.pangkatTTD;
document.getElementById('jabatanTTD').value = selectedData.jabatanTTD;
document.getElementById('keteranganTTD1').value = selectedData.keteranganTTD1;
document.getElementById('keteranganTTD2').value = selectedData.keteranganTTD2;
} else {
document.getElementById('nipTTD').value = '';
document.getElementById('pangkatTTD').value = '';
document.getElementById('jabatanTTD').value = '';
document.getElementById('keteranganTTD1').value = '';
document.getElementById('keteranganTTD2').value = '';
}
}
function updateTandaTangan2() {
const jenisTTD2 = document.getElementById('jenisTTD2').value;
const namaTTDSelect2 = document.getElementById('namaTTD2');
namaTTDSelect2.innerHTML = '<option value="">Pilih Nama PPTK</option>'; // Reset nama TTD
const filteredData2 = tandaTanganData.filter(item => item.jenisTTD === jenisTTD2);
filteredData2.forEach(item => {
const option = document.createElement('option');
option.value = item.namaTTD;
option.textContent = item.namaTTD;
namaTTDSelect2.appendChild(option);
});
}
function updateDetailTandaTangan2() {
const selectedName2 = document.getElementById('namaTTD2').value;
const selectedData2 = tandaTanganData.find(item => item.namaTTD === selectedName2);
if (selectedData2) {
document.getElementById('nipTTD2').value = selectedData2.nipTTD;
document.getElementById('pangkatTTD2').value = selectedData2.pangkatTTD;
document.getElementById('jabatanTTD2').value = selectedData2.jabatanTTD;
document.getElementById('keteranganTTD12').value = selectedData2.keteranganTTD1;
document.getElementById('keteranganTTD22').value = selectedData2.keteranganTTD2;
} else {
document.getElementById('nipTTD2').value = '';
document.getElementById('pangkatTTD2').value = '';
document.getElementById('jabatanTTD2').value = '';
document.getElementById('keteranganTTD12').value = '';
document.getElementById('keteranganTTD22').value = '';
}
}
//ttd3
function updateTandaTangan3() {
const jenisTTD3 = document.getElementById('jenisTTD3').value;
const namaTTDSelect3 = document.getElementById('namaTTD3');
namaTTDSelect3.innerHTML = '<option value="">Pilih Nama Bendahara Pengeluaran</option>'; // Reset nama TTD
const filteredData3 = tandaTanganData.filter(item => item.jenisTTD === jenisTTD3);
filteredData3.forEach(item => {
const option = document.createElement('option');
option.value = item.namaTTD;
option.textContent = item.namaTTD;
namaTTDSelect3.appendChild(option);
});
}
function updateDetailTandaTangan3() {
const selectedName3 = document.getElementById('namaTTD3').value;
const selectedData3 = tandaTanganData.find(item => item.namaTTD === selectedName3);
if (selectedData3) {
document.getElementById('nipTTD3').value = selectedData3.nipTTD;
document.getElementById('pangkatTTD3').value = selectedData3.pangkatTTD;
document.getElementById('jabatanTTD3').value = selectedData3.jabatanTTD;
document.getElementById('keteranganTTD13').value = selectedData3.keteranganTTD1;
document.getElementById('keteranganTTD23').value = selectedData3.keteranganTTD2;
} else {
document.getElementById('nipTTD3').value = '';
document.getElementById('pangkatTTD3').value = '';
document.getElementById('jabatanTTD3').value = '';
document.getElementById('keteranganTTD13').value = '';
document.getElementById('keteranganTTD23').value = '';
}
}
function renderData(data) {
let tableBody = '';
const groupedData = {};
data.forEach(item => {
const key = `${item['Nomor']}-${item['Nomor SPPD']}-${item['Dasar surat']}-${item['Tingkat Biaya Perjalanan']}-${item['Maksud']}-${item['Alat Angkut']}-${item['Asal Berangkat']}-${item['Tujuan']}-${item['Tanggal Berangkat']}-${item['Tanggal Pulang']}-${item['Lama Perjalanan']}-${item['Instansi']}-${item['Jenis SPPD']}-${item['Kegiatan']}-${item['Sub Kegiatan']}-${item['Kode Rekening']}-${item['Lain-Lain']}-${item['Tanggal Buat']}`;
if (!groupedData[key]) {
groupedData[key] = {
...item,
pengikut: []
};
}
if (item['Pengikut']) {
groupedData[key].pengikut.push({
NIP: item['NIP Pengikut'],
Pangkat: item['Pangkat Pengikut'],
Jabatan: item['Jabatan Pengikut'],
TanggalLahir: item['Tanggal Lahir Pengikut'],
Nama: item['Pengikut'],
});
}
});
const groupedArray = Object.values(groupedData);
groupedArray.forEach((item, index) => {
// Panel Utama
tableBody += `
<tr>
<td>
<button class="btn btn-link" data-toggle="collapse" data-target="#detail1-${index}" aria-expanded="false" aria-controls="detail1-${index}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0"/>
</svg>
</button>
${item['Nomor'] || '-'}
</td>
<td>${item['Nomor SPPD'] || '-'}</td>
<td>${item['Jenis SPPD'] || '-'}</td>
<td>${item['Nama'] || '-'}</td>
<td>${item['NIP'] || '-'}</td>
<td>${item['Pangkat'] || '-'}</td>
<td>${item['Jabatan'] || '-'}</td>
<td>${item['Instansi'] || '-'}</td>
<td>
<button class="btn btn-danger" onclick="deleteData('${item['Nomor']}')">Delete</button>
<button class="btn btn-info" onclick="showPrintModal('${item['Nomor']}')">Print SPT</button>
<button class="btn btn-info" onclick="showPrintModal1('${item['Nomor']}')">Print SPPD</button>
<button class="btn btn-info" onclick="showPrintModal2('${item['Nomor']}')">Print REKAP</button>
</td>
</tr>
<tr class="collapse" id="detail1-${index}">
<td colspan="8">
<table class="table table-bordered table-hover table-sm" style="border: 2px dotted; border-color: #b52468;">
<thead>
<tr style="background-color: #b52468; text-align: center; color: white;">
<th>
<button class="btn btn-link" data-toggle="collapse" data-target="#detail2-${index}" aria-expanded="false" aria-controls="detail2-${index}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-plus-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0"/>
</svg>
</button>
</th>
<th>Dasar Surat</th>
<th>Tingkat Biaya Perjalanan</th>
<th>Maksud</th>
<th>Alat Angkut</th>
<th>Asal Berangkat</th>
<th>Tujuan</th>
<th>Tanggal Berangkat</th>
<th>Tanggal Pulang</th>
<th>Lama Perjalanan</th>
<th>Instansi</th>
<th>Kegiatan</th>
<th>Sub Kegiatan</th>
<th>Kode Rekening</th>
<th>Lain-Lain</th>
<th>Tanggal Buat</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>${item['Dasar surat'] || '-'}</td>
<td>${item['Tingkat Biaya Perjalanan'] || '-'}</td>
<td>${item['Maksud'] || '-'}</td>
<td>${item['Alat Angkut'] || '-'}</td>
<td>${item['Asal Berangkat'] || '-'}</td>
<td>${item['Tujuan'] || '-'}</td>
<td>${item['Tanggal Berangkat'] || '-'}</td>
<td>${item['Tanggal Pulang'] || '-'}</td>
<td>${item['Lama Perjalanan'] || '-'}</td>
<td>${item['Instansi'] || '-'}</td>
<td>${item['Kegiatan'] || '-'}</td>
<td>${item['Sub Kegiatan'] || '-'}</td>
<td>${item['Kode Rekening'] || '-'}</td>
<td>${item['Lain-Lain'] || '-'}</td>
<td>${item['Tanggal Buat'] || '-'}</td>
</tr>
</tbody>
</table>
<div class="collapse" id="detail2-${index}">
<table class="table table-bordered table-hover table-sm" style="border: 2px dotted; border-color: #24b598;">
<thead>
<tr style="background-color: #24b598; text-align: center; color: white; vertical-align: middle;">
<th>
<button class="btn btn-link" data-toggle="collapse" data-target="#detail2-${index}" aria-expanded="false" aria-controls="detail2-${index}">
-
</button>
</th>
<th>Pengikut</th>
<th>NIP Pengikut</th>
<th>Pangkat Pengikut</th>
<th>Jabatan Pengikut</th>
<th>Tanggal Lahir Pengikut</th>
</tr>
</thead>
<tbody>
${item.pengikut.map(p => `
<tr>
<td></td>
<td>${p.Nama || '-'}</td>
<td>${p.NIP || '-'}</td>
<td>${p.Pangkat || '-'}</td>
<td>${p.Jabatan || '-'}</td>
<td>${p.TanggalLahir || '-'}</td>
</tr>
`).join('')}
</tbody>
</table>
</div>
</td>
</tr>
`;
});
document.getElementById('tableBody').innerHTML = tableBody;
}
function deleteData(nomor) {
if (confirm('Apakah Anda yakin ingin menghapus data ini?')) {
google.script.run.withSuccessHandler(() => {
fetchData(); // Muat ulang data setelah penghapusan
}).deleteRow(nomor);
}
}
function showPrintModal(nomor) {
// Reset all form sections
document.getElementById('ttd1').style.display = 'block'; // Show TTD1
document.getElementById('ttd2').style.display = 'none'; // Hide TTD2
document.getElementById('ttd3').style.display = 'none'; // Hide TTD3
// Open the modal
$('#printModal').modal('show');
document.getElementById('btnPrint').onclick = function() {
const jenisTTD = document.getElementById('jenisTTD').value;
const namaTTD = document.getElementById('namaTTD').value;
const nipTTD = document.getElementById('nipTTD').value;
const pangkatTTD = document.getElementById('pangkatTTD').value;
const jabatanTTD = document.getElementById('jabatanTTD').value;
const keteranganTTD1 = document.getElementById('keteranganTTD1').value;
const keteranganTTD2 = document.getElementById('keteranganTTD2').value;
printData(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2);
};
}
function showPrintModal1(nomor) {
// Reset all form sections
document.getElementById('ttd1').style.display = 'block'; // Show TTD1
document.getElementById('ttd2').style.display = 'none'; // Hide TTD2
document.getElementById('ttd3').style.display = 'none'; // Hide TTD3
// Open the modal
$('#printModal').modal('show');
document.getElementById('btnPrint').onclick = function() {
const jenisTTD = document.getElementById('jenisTTD').value;
const namaTTD = document.getElementById('namaTTD').value;
const nipTTD = document.getElementById('nipTTD').value;
const pangkatTTD = document.getElementById('pangkatTTD').value;
const jabatanTTD = document.getElementById('jabatanTTD').value;
const keteranganTTD1 = document.getElementById('keteranganTTD1').value;
const keteranganTTD2 = document.getElementById('keteranganTTD2').value;
printData1(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2);
};
}
function showPrintModal2(nomor) {
// Reset all form sections
document.getElementById('ttd1').style.display = 'block'; // Show TTD1
document.getElementById('ttd2').style.display = 'block'; // Show TTD2
document.getElementById('ttd3').style.display = 'block'; // Hide TTD3
// Open the modal
$('#printModal').modal('show');
document.getElementById('btnPrint').onclick = function() {
// Mengambil nilai dari set pertama
const jenisTTD = document.getElementById('jenisTTD').value;
const namaTTD = document.getElementById('namaTTD').value;
const nipTTD = document.getElementById('nipTTD').value;
const pangkatTTD = document.getElementById('pangkatTTD').value;
const jabatanTTD = document.getElementById('jabatanTTD').value;
const keteranganTTD1 = document.getElementById('keteranganTTD1').value;
const keteranganTTD2 = document.getElementById('keteranganTTD2').value;
// Mengambil nilai dari set kedua (jenisTTD2, namaTTD2, dll.)
const jenisTTD2 = document.getElementById('jenisTTD2').value;
const namaTTD2 = document.getElementById('namaTTD2').value;
const nipTTD2 = document.getElementById('nipTTD2').value;
const pangkatTTD2 = document.getElementById('pangkatTTD2').value;
const jabatanTTD2 = document.getElementById('jabatanTTD2').value;
const keteranganTTD12 = document.getElementById('keteranganTTD12').value;
const keteranganTTD22 = document.getElementById('keteranganTTD22').value;
// Mengambil nilai dari set kedua (jenisTTD3, namaTTD3, dll.)
const jenisTTD3 = document.getElementById('jenisTTD3').value;
const namaTTD3 = document.getElementById('namaTTD3').value;
const nipTTD3 = document.getElementById('nipTTD3').value;
const pangkatTTD3 = document.getElementById('pangkatTTD3').value;
const jabatanTTD3 = document.getElementById('jabatanTTD3').value;
const keteranganTTD13 = document.getElementById('keteranganTTD13').value;
const keteranganTTD23 = document.getElementById('keteranganTTD23').value;
let tanggalprint = document.getElementById('tanggalprint').value;
// Memformat tanggal menjadi dd-NamaBulan-yyyy
if (tanggalprint) {
let tanggal = new Date(tanggalprint);
let day = String(tanggal.getDate()).padStart(2, '0'); // Mengambil tanggal dan menambahkan nol jika perlu
let monthIndex = tanggal.getMonth(); // Mendapatkan index bulan (0-11)
let year = tanggal.getFullYear();
// Array nama bulan dalam bahasa Indonesia
const bulan = [
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
];
let namaBulan = bulan[monthIndex]; // Mengambil nama bulan dari array
tanggalprint = `${day} ${namaBulan} ${year}`; // Format dd-NamaBulan-yyyy
}
// Fungsi print yang baru menangani dua set data
printData2(
nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2,
jenisTTD2, namaTTD2, nipTTD2, pangkatTTD2, jabatanTTD2, keteranganTTD12, keteranganTTD22,
jenisTTD3, namaTTD3, nipTTD3, pangkatTTD3, jabatanTTD3, keteranganTTD13, keteranganTTD23, tanggalprint
);
};
}
// Fungsi untuk mereset dropdown dan field input
function resetDropdowns() {
// Mereset set pertama
document.getElementById('jenisTTD').selectedIndex = 0;
document.getElementById('namaTTD').selectedIndex = 0;
document.getElementById('nipTTD').value = '';
document.getElementById('pangkatTTD').value = '';
document.getElementById('jabatanTTD').value = '';
document.getElementById('keteranganTTD1').value = '';
document.getElementById('keteranganTTD2').value = '';
// Mereset set kedua
document.getElementById('jenisTTD2').selectedIndex = 0;
document.getElementById('namaTTD2').selectedIndex = 0;
document.getElementById('nipTTD2').value = '';
document.getElementById('pangkatTTD2').value = '';
document.getElementById('jabatanTTD2').value = '';
document.getElementById('keteranganTTD12').value = '';
document.getElementById('keteranganTTD22').value = '';
// Mereset set keTIGA
document.getElementById('jenisTTD3').selectedIndex = 0;
document.getElementById('namaTTD3').selectedIndex = 0;
document.getElementById('nipTTD3').value = '';
document.getElementById('pangkatTTD3').value = '';
document.getElementById('jabatanTTD3').value = '';
document.getElementById('keteranganTTD13').value = '';
document.getElementById('keteranganTTD23').value = '';
document.getElementById('tanggalprint').value = '';
}
function getDataByNomor(nomor) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
const data = sheet.getDataRange().getValues();
const headers = data[0];
const items = [];
for (let i = 1; i < data.length; i++) {
if (data[i][0] === nomor) { // Ganti 0 dengan indeks kolom yang sesuai
let item = {};
for (let j = 0; j < headers.length; j++) {
if (data[i][j] instanceof Date) {
item[headers[j]] = Utilities.formatDate(data[i][j], Session.getScriptTimeZone(), 'dd/MM/yyyy');
} else {
item[headers[j]] = data[i][j];
}
}
items.push(item);
}
}
return items;
}
</script>
<script>
function printData(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2) {
google.script.run.withSuccessHandler(function(items) {
const printWindow = window.open('', '_blank');
const headerContent = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Surat SPPD</title>
<style>
body { font-family: Arial, sans-serif; font-size: 12px;}
h2, h4 { text-align: center; }
img { display: block; margin: 0 auto; max-width: 100px; } /* Atur gaya gambar */
table { width: 100%; border-collapse: collapse; margin: 5px 0; }
th, td { padding: 2px; }
.pengikut-header { font-weight: bold; background-color: #f2f2f2; }
.kop-surat {
display: flex;
align-items: center;
border-bottom: 2px solid black;
padding: 10px;
margin-bottom: 20px;
}
.kop-surat img {
display: block;
margin-left: auto;
margin-right: auto;
max-width: 500px;
height: 100px;
}
.kop-text {
width: 100%;
text-align: center;
}
.kop-text h1, h2 {
margin: 0;
font-size: 18px;
}
.kop-text p {
margin: 5px 0;
font-size: 14px;
}
/* Styling untuk judul surat */
.judul-surat {
text-align: center;
margin-top: 20px;
}
.judul-surat h2 {
margin: 0;
font-size: 20px;
text-transform: uppercase;
}
/* Styling untuk nomor surat agar pas di bawah judul */
.nomor-surat {
text-align: center;
margin-top: 5px;
}
.nomor-surat p {
margin: 0;
font-size: 14px;
}
.garis {
border-top: 1px solid black;
width: 300px;
margin: 5px auto 0;
}
.border-bottom {
border-bottom: 1px solid black; /* Ganti dengan warna atau ketebalan yang diinginkan */
}
</style>
</head>
<body>
<div class="kop-surat">
<!-- Logo di sebelah kiri -->
<div class="logo">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo">
</div>
<!-- Teks rata tengah -->
<div class="kop-text">
<h2>PEMERINTAH KABUPATEN JEMBER</h2>
<h1>DINAS PARIWISATA DAN KEBUDAYAAN</h1>
<p>JL.MH. Thamrin, Ajung Kulon, Ajung, Jember, Jawa Timur 68175</p>
<p>Telepon: (0331) 335244, Faksimile: (0331) 335243</p>
<p>Email: disparbud@jemberkab.go.id</p>
</div>
</div>
`;
let tablesContent = '';
items.forEach(item => {
const formatDate = (date) => {
if (!date) return '-';
const dateObj = new Date(date);
const options = { day: 'numeric', month: 'long', year: 'numeric' };
return dateObj.toLocaleDateString('id-ID', options); // Format sesuai "1 Agustus 2024"
};
tablesContent += `
<div class="judul-surat">
<h2>SURAT PERINTAH TUGAS</h2>
</div>
<div class="garis"></div>
<div class="nomor-surat">
<p>Nomor: ${item.commonData['Nomor']}</p>
</div>
<br>
<table>
<tr><th style="width: 22%; text-align: right;" >Dasar Surat</th><td style="width: 1%; text-align: center;">:</td><td style="width: 77%; text-align: left;" >${item.commonData['Dasar surat'] || '-'}</td></tr>
</table>
<h4>MEMERINTAHKAN</h4>
<table>
<tr>
<th style="width: 10%; text-align: left;">Kepada :</th><td style="width: 1%; text-align: left;">1.</td><td style="width: 10%; text-align: left;">Nama</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${item.commonData['Nama'] || '-'}</td>
</tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">Pangkat/Gol</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${item.commonData['Pangkat'] || '-'}</td>
</tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">NIP</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${item.commonData['NIP'] || '-'}</td>
</tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">Jabatan</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${item.commonData['Jabatan'] || '-'}</td>
</tr>
`;
// Tampilkan semua data pengikut sebagai baris tambahan
item.followers.forEach((follower, index) => {
tablesContent += `
<tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;">${index + 2}.</td><td style="width: 10%; text-align: left;">Nama</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${follower['Pengikut'] || '-'}</td>
</tr>
<tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">Pangkat/Gol</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${follower['Pangkat Pengikut'] || '-'}</td>
</tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">NIP</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${follower['NIP Pengikut'] || '-'}</td>
</tr>
<tr>
<tr>
<th style="width: 10%; text-align: center;"></th><td style="width: 1%; text-align: left;"></td><td style="width: 10%; text-align: left;">Jabatan</td><td style="width: 1%; text-align: center;">:</td><td style="width: 78%; text-align: left;">${follower['Jabatan Pengikut'] || '-'}</td>
</tr>
`;
});
tablesContent += `
</table>
<br>
<table>
<tr>
<th style="width: 10%; text-align: left;">Maksud :</th><td style="width: 90%; text-align: left;">${item.commonData['Maksud'] || '-'}</td>
</tr>
</table>
<table>
</table>
<br>
<table>
<tr>
<th style="width: 50%; text-align: left;"></th><td style="width: 50%; text-align: left;">${keteranganTTD1}<br>${keteranganTTD2}<br><br><br><br> ${namaTTD}<br>${pangkatTTD}<br>NIP.${nipTTD}</td>
</tr>
</table>
<pagebreak /> <!-- Menambahkan pemisah halaman di antara tabel -->
`;
});
const content = headerContent + tablesContent + '</body></html>';
printWindow.document.write(content);
printWindow.document.close(); // Menghentikan penulisan ke dokumen
printWindow.print(); // Memanggil dialog print
printWindow.close(); // Menutup jendela setelah mencetak
$('#printModal').modal('hide'); // Menutup modal setelah mencetak
resetDropdowns();
}).getDataByNomor(nomor);
}
// Close modal on 'Close' or 'Cancel' button click
$('.close, .btn-secondary').on('click', function() {
$('#printModal').modal('hide');
});
function terbilang(nilai) {
const angka = ["", "Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh", "Delapan", "Sembilan", "Sepuluh", "Sebelas"];
let hasil = "";
if (nilai < 12) {
hasil = angka[nilai];
} else if (nilai < 20) {
hasil = terbilang(nilai - 10) + " Belas";
} else if (nilai < 100) {
hasil = terbilang(Math.floor(nilai / 10)) + " Puluh " + terbilang(nilai % 10);
} else if (nilai < 200) {
hasil = "Seratus " + terbilang(nilai - 100);
} else if (nilai < 1000) {
hasil = terbilang(Math.floor(nilai / 100)) + " Ratus " + terbilang(nilai % 100);
} else if (nilai < 2000) {
hasil = "Seribu " + terbilang(nilai - 1000);
} else if (nilai < 1000000) {
hasil = terbilang(Math.floor(nilai / 1000)) + " Ribu " + terbilang(nilai % 1000);
} else if (nilai < 1000000000) {
hasil = terbilang(Math.floor(nilai / 1000000)) + " Juta " + terbilang(nilai % 1000000);
} else if (nilai < 1000000000000) {
hasil = terbilang(Math.floor(nilai / 1000000000)) + " Miliar " + terbilang(nilai % 1000000000);
} else if (nilai < 1000000000000000) {
hasil = terbilang(Math.floor(nilai / 1000000000000)) + " Triliun " + terbilang(nilai % 1000000000000);
}
return hasil.trim();
}
window.onload = fetchData;
</script>
<script>
function printData1(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2) {
google.script.run.withSuccessHandler(function(items) {
const printWindow = window.open('', '_blank');
const headerContent = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Surat SPPD</title>
<style>
body { font-family: Arial, sans-serif; font-size: 12px; transform: scale(1);}
h2, h4 { text-align: center; }
img { display: block; margin: 0 auto; max-width: 100px; } /* Atur gaya gambar */
table { width: 100%; border-collapse: collapse; margin: 10px 0; }
th, td { padding: 5px; }
.pengikut-header { font-weight: bold; background-color: #f2f2f2; }
.kop-surat {
display: flex;
align-items: center;
border-bottom: 2px solid black;
padding: 10px;
margin-bottom: 20px;
}
.kop-surat img {
display: block;
margin-left: auto;
margin-right: auto;
max-width: 500px;
height: 100px;
}
.kop-text {
width: 100%;
text-align: center;
}
.kop-text h1, h2 {
margin: 0;
font-size: 18px;
}
.kop-text p {
margin: 5px 0;
font-size: 14px;
}
/* Styling untuk judul surat */
.judul-surat {
text-align: center;
margin-top: 20px;
}
.judul-surat h2 {
margin: 0;
font-size: 20px;
text-transform: uppercase;
}
/* Styling untuk nomor surat agar pas di bawah judul */
.nomor-surat {
text-align: center;
margin-top: 5px;
}
.nomor-surat p {
margin: 0;
font-size: 14px;
}
.garis {
border-top: 1px solid black;
width: 300px;
margin: 5px auto 0;
}
.border-bottom {
border-bottom: 1px solid black; /* Ganti dengan warna atau ketebalan yang diinginkan */
}
.border-right {
border-right: 1px solid black; /* Ganti dengan warna atau ketebalan yang diinginkan */
}
.border {
border: 1px solid black; /* Border untuk Kolom 2 dan Data 2 */
}
</style>
</head>
<body>
<div class="kop-surat">
<!-- Logo di sebelah kiri -->
<div class="logo">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo">
</div>
<!-- Teks rata tengah -->
<div class="kop-text">
<h2>PEMERINTAH KABUPATEN JEMBER</h2>
<h1>DINAS PARIWISATA DAN KEBUDAYAAN</h1>
<p>JL.MH. Thamrin, Ajung Kulon, Ajung, Jember, Jawa Timur 68175</p>
<p>Telepon: (0331) 335244, Faksimile: (0331) 335243</p>
<p>Email: disparbud@jemberkab.go.id</p>
</div>
</div>
`;
let tablesContent = '';
items.forEach(item => {
const formatDate = (date) => {
if (!date) return '-';
const dateObj = new Date(date);
const options = { day: 'numeric', month: 'long', year: 'numeric' };
return dateObj.toLocaleDateString('id-ID', options); // Format sesuai "1 Agustus 2024"
};
tablesContent += `
<table>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Lembar ke</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;"> </td>
</tr>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Kode No.</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;"> </td>
</tr>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Nomor</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;">${item.commonData['Nomor SPPD']} </td>
</tr>
</table>
<div class="judul-surat">
<h2>SURAT PERJALANAN DINAS (SPD)</h2>
</div>
<div class="garis"></div>
<div class="nomor-surat">
</div>
<br>
<table class="border">
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">1</th><td style="width: 45%; text-align: left;" class="border">Pejabat Pembuat Komitment</td><td style="width: 50%; text-align: left;">${namaTTD}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">2</th><td style="width: 45%; text-align: left;" class="border">Nama/NIP Pegawai yang <br> melaksanakan perjalanan dinas</td><td style="width: 50%; text-align: left;">${item.commonData['Nama'] || '-'} / ${item.commonData['NIP'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">3</th><td style="width: 46%; text-align: left;" class="border">a. Pangkat dan Golongan <br><br> b. Jabatan/Instansi <br><br> c. Tingkat Biaya Perjalanan Dinas</td><td style="width: 50%; text-align: left;">${item.commonData['Pangkat'] || '-'} <br><br> ${item.commonData['Jabatan'] || '-'} <br><br> ${item.commonData['Tingkat Biaya Perjalan'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">4</th><td style="width: 45%; text-align: left;" class="border">Maksud Perjalanan Dinas</td><td style="width: 50%; text-align: left;">${item.commonData['Maksud'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">5</th><td style="width: 45%; text-align: left;" class="border">Alat angkut yang digunakan</td><td style="width: 50%; text-align: left;">${item.commonData['Alat Angkut'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">6</th><td style="width: 45%; text-align: left;" class="border">a. Tempat Berangkat <br><br> b. Tempat Tujuan</td><td style="width: 50%; text-align: left;">a. ${item.commonData['Asal Berangkat'] || '-'}<br> <br> b. ${item.commonData['Tujuan'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">7</th><td style="width: 45%; text-align: left;" class="border">a. Lama Perjalanan Dinas <br><br> b. Tanggal Berangkat <br><br> c. Tanggal harus kembali/tiba ditempat baru*</td><td style="width: 50%; text-align: left;">a. ${item.commonData['Lama Perjalanan'] || '-'}<br> <br> b. ${formatDate(item.commonData['Tanggal Berangkat'] || '-')} <br> <br> c. ${formatDate(item.commonData['Tanggal Pulang'] || '-')}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">8</th><td style="width: 45%; text-align: left;" class="border">Pengikut : Nama</td><td style="width: 50%; text-align: left;"> Tanggal Lahir</td>
</tr>
`;
// Tampilkan semua data pengikut sebagai baris tambahan
item.followers.forEach((follower, index) => {
tablesContent += `
<tr class="border-right">
<th style="width: 5%; text-align: center;" class="border-right"></th><td style="width: 45%; text-align: left; "class="border-right">${index + 1}.${follower['Pengikut'] || '-'}</td><td style="width: 50%; text-align: left;">${follower['Tanggal Lahir Pengikut'] || '-'}</td>
</tr>
`;
});
tablesContent += `
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">9</th><td style="width: 45%; text-align: left;" class="border">Pembebanan anggaran <br>a. Instansi <br><br> b. Akun</td><td style="width: 50%; text-align: left;"> <br><br>a. Dinas Pariwisata dan Kebudayaan<br><br> b. ${item.commonData['Kode Rekening'] || '-'}</td>
</tr>
<tr class="border">
<th style="width: 5%; text-align: center;" class="border">10</th><td style="width: 45%; text-align: left;" class="border">Keterangan lain-lain</td><td style="width: 50%; text-align: left;">${item.commonData['Lain-Lain'] || '-'}</td>
</tr>
</table>
<table>
<tr>
<th style="width: 5%; text-align: center;"></th><td style="width: 45%; text-align: left;"></td><td style="width: 50%; text-align: left;">Dikeluarkan di Jember<br>Tanggal ${formatDate(item.commonData['Tanggal Buat'])}<br>${keteranganTTD1}<br><br><br><br>${namaTTD}<br>NIP${nipTTD}</td>
</tr>
</table>
<pagebreak /> <!-- Menambahkan pemisah halaman di antara tabel -->
`;
});
const content = headerContent + tablesContent + '</body></html>';
printWindow.document.write(content);
printWindow.document.close(); // Menghentikan penulisan ke dokumen
printWindow.print(); // Memanggil dialog print
printWindow.close(); // Menutup jendela setelah mencetak
$('#printModal').modal('hide'); // Menutup modal setelah mencetak
resetDropdowns();
}).getDataByNomor(nomor);
}
// Close modal on 'Close' or 'Cancel' button click
$('.close, .btn-secondary').on('click', function() {
$('#printModal').modal('hide');
});
</script>
<script>
function printData2(nomor, jenisTTD, namaTTD, nipTTD, pangkatTTD, jabatanTTD, keteranganTTD1, keteranganTTD2,
jenisTTD2, namaTTD2, nipTTD2, pangkatTTD2, jabatanTTD2, keteranganTTD12, keteranganTTD22, jenisTTD3, namaTTD3, nipTTD3, pangkatTTD3, jabatanTTD3, keteranganTTD13, keteranganTTD23, tanggalprint) {
google.script.run.withSuccessHandler(function(items) {
const printWindow = window.open('', '_blank');
const headerContent = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Surat SPPD</title>
<style>
body { font-family: Arial, sans-serif; font-size: 12px; transform: scale(1);}
h2, h4 { text-align: center; }
img { display: block; margin: 0 auto; max-width: 100px; } /* Atur gaya gambar */
table { width: 100%; border-collapse: collapse; margin: 10px 0; }
th, td { padding: 5px; }
.pengikut-header { font-weight: bold; background-color: #f2f2f2; }
.kop-surat {
display: flex;
align-items: center;
border-bottom: 2px solid black;
padding: 10px;
margin-bottom: 20px;
}
.kop-surat img {
display: block;
margin-left: auto;
margin-right: auto;
max-width: 500px;
height: 100px;
}
.kop-text {
width: 100%;
text-align: center;
}
.kop-text h1 {
margin: 0;
font-size: 18px;
text-align: center;
}
.kop-text p {
margin: 5px 0;
font-size: 14px;
}
/* Styling untuk judul surat */
.judul-surat {
text-align: center;
margin-top: 20px;
}
.judul-surat h2 {
margin: 0;
font-size: 20px;
text-transform: uppercase;
}
/* Styling untuk nomor surat agar pas di bawah judul */
.nomor-surat {
text-align: center;
margin-top: 5px;
}
.nomor-surat p {
margin: 0;
font-size: 14px;
}
.garis {
border-top: 1px solid black;
width: 300px;
margin: 5px auto 0;
}
.border-bottom {
border-bottom: 1px solid black; /* Ganti dengan warna atau ketebalan yang diinginkan */
}
</style>
</head>
<body>
`;
let tablesContent = '';
items.forEach(item => {
// Hitung total nominal
const totalNominal = item.rincian.reduce((total, r) => total + (parseFloat(r.nominal) || 0), 0);
tablesContent += `
<div class="kop-surat">
<!-- Logo di sebelah kiri -->
<div class="logo">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo">
</div>
<!-- Teks rata tengah -->
<div class="kop-text">
<h1>PEMERINTAH KABUPATEN JEMBER</h1>
<h1>DINAS PARIWISATA DAN KEBUDAYAAN</h1>
<p>JL.MH. Thamrin, Ajung Kulon, Ajung, Jember, Jawa Timur 68175</p>
<p>Telepon: (0331) 335244, Faksimile: (0331) 335243</p>
<p>Email: disparbud@jemberkab.go.id</p>
</div>
</div>
<table>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Lembar ke</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;"> I </td>
</tr>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Nomor</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;">${item.nomorsppd} </td>
</tr>
</table>
<div class="judul-surat">
<h2>RINCIAN PERJALANAN DINAS</h2>
</div>
<div class="garis"></div>
<table>
<tr><th style="width: 25%; text-align: left;">Maksud Perjalanan Dinas</th><td style="width: 1%; text-align: center;">:</td><td style="width: 74%; text-align: left;">${item.maksud || '-'}</td></tr>
<tr><th style="width: 25%; text-align: left;">Tanggal</th><td style="width: 1%; text-align: center;">:</td><td style="width: 74%; text-align: left;">${item.tanggalBerangkat || '-'}</td></tr>
</table>
<table border="1" style="width: 100%; border-collapse: collapse;">
<thead>
<tr>
<th style="text-align: center;">Rincian</th>
<th style="text-align: center;">Nominal</th>
<th style="text-align: center;">Keterangan</th>
</tr>
</thead>
<tbody>
${item.rincian.map(r => `
<tr>
<td>${r.rincian || '-'}</td>
<td style="text-align: right;">${(r.nominal || 0).toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</td>
<td>${r.keterangan || '-'}</td>
</tr>
`).join('')}
</tbody>
<tfoot>
<tr>
<td style="text-align: right;"><strong>Total:</strong></td>
<td style="text-align: right;"><strong>${totalNominal.toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</strong></td>
<td></td>
</tr>
</tfoot>
</table>
<table>
<tr><th style="width: 40%; text-align: left;"></th><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Jember, ${tanggalprint}</td></tr>
</table>
<table>
<tr><td style="width: 40%; text-align: center;">Telah dibayar sejumlah</td><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Telah Menerima Jumlah Uang Sebesar</td></tr>
<tr><th style="width: 40%; text-align: center;"><strong>${totalNominal.toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</strong></th><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;"><strong>${totalNominal.toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</strong></td></tr>
</table>
<table>
<tr><td style="width: 40%; text-align: center;">Bendahara Pengeluaran</td><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Yang Menerima</td></tr>
</table>
<br>
<br>
<table>
<tr><td style="width: 40%; text-align: center; padding: 0; margin: 0;"><u>${namaTTD3}</u></td><td style="width: 20%; text-align: center;" padding: 0; margin: 0;></td><td style="width: 40%; text-align: center; padding: 0; margin: 0;"><u>${item.nama || '-'}</u></td></tr>
<tr><td style="width: 40%; text-align: center; padding: 0; margin: 0;">NIP. ${nipTTD3}</td><td style="width: 20%; text-align: center; padding: 0; margin: 0;"></td><td style="width: 40%; text-align: center; padding: 0; margin: 0;">NIP. ${item.nip || '-'}</td></tr>
</table>
<div style="page-break-after: always;"></div>
<div class="kop-surat">
<!-- Logo di sebelah kiri -->
<div class="logo">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo">
</div>
<!-- Teks rata tengah -->
<div class="kop-text">
<h1>PEMERINTAH KABUPATEN JEMBER</h1>
<h1>DINAS PARIWISATA DAN KEBUDAYAAN</h1>
<p>JL.MH. Thamrin, Ajung Kulon, Ajung, Jember, Jawa Timur 68175</p>
<p>Telepon: (0331) 335244, Faksimile: (0331) 335243</p>
<p>Email: disparbud@jemberkab.go.id</p>
</div>
</div>
<div class="judul-surat">
<h2>LAPORAN PERJALANAN DINAS</h2>
</div>
<div class="garis"></div>
<table>
<tr><th style="width: 1%; text-align: left; vertical-align: top;">I.</th><td style="width: 25%; text-align: left; vertical-align: top;">Dasar </td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 73%; text-align: left;">Surat Perintah Melaksanakan Tugas</td></tr>
<tr><th style="width: 1%; text-align: left; vertical-align: top;"></th><td style="width: 25%; text-align: left; vertical-align: top;"></td><td style="width: 1%; text-align: left; vertical-align: top;"></td><td style="width: 73%; text-align: left;">Nomor : ${item.nomor}</td></tr>
<tr><th style="width: 1%; text-align: left; vertical-align: top;"></th><td style="width: 25%; text-align: left; vertical-align: top;"></td><td style="width: 1%; text-align: left; vertical-align: top;"></td><td style="width: 73%; text-align: left;">Tanggal : ${item.tanggalBuat || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">II.</th><td style="width: 25%; text-align: left;">Nama Petugas</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.nama || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">III.</th><td style="width: 25%; text-align: left;">Pangkat/Gol.</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.pangkatgol || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">IV.</th><td style="width: 25%; text-align: left;">Tempat/Tujuan</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.tujuan || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">V.</th><td style="width: 25%; text-align: left;">Maksud Perjalanan</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.maksud || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">VI.</th><td style="width: 25%; text-align: left;">Lama Perjalanan</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.lamaPerjalanan || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left; vertical-align: top;">VII.</th><td style="width: 25%; text-align: left; vertical-align: top;">Hasil Kunjungan </td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 73%; text-align: left;">${item.hasilKunjungan || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">VIII.</th><td style="width: 25%; text-align: left;">Permasalahan</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.permasalahan || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">IX.</th><td style="width: 25%; text-align: left;">Penyelesaian</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.penyelesaian || '-'}</td></tr>
<tr><th style="width: 1%; text-align: left;">X.</th><td style="width: 25%; text-align: left;">Saran</td><td style="width: 1%; text-align: left;">:</td><td style="width: 73%; text-align: left;">${item.saran || '-'}</td></tr>
<br>
<table>
<tr><th style="width: 40%; text-align: left;"></th><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Jember, ${tanggalprint}</td></tr>
</table>
<table>
<tr><th style="width: 40%; text-align: center;"></th><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Pelapor</td></tr>
</table>
<br>
<br>
<table>
<tr><th style="width: 40%; text-align: center; padding: 0; margin: 0;"></th><td style="width: 20%; text-align: center;" padding: 0; margin: 0;></td><td style="width: 40%; text-align: center; padding: 0; margin: 0;"><u>${item.nama || '-'}</u></td></tr>
<tr><th style="width: 40%; text-align: center; padding: 0; margin: 0;"></th><td style="width: 20%; text-align: center; padding: 0; margin: 0;"></td><td style="width: 40%; text-align: center; padding: 0; margin: 0;">NIP. ${item.nip || '-'}</td></tr>
</table>
</table>
<div style="page-break-after: always;"></div>
<table>
<tr><td style="width: 54%;"></td><td style="width: 24%;">Kode Kegiatan</td><td style="width: 1%;">:</td><td style="width: 30%;">${item.kegiatan}</td></tr>
<tr><td style="width: 54%;"></td><td style="width: 24%;">Kode Sub Kegiatan</td><td style="width: 1%;">:</td><td style="width: 30%;">${item.subkegiatan}</td></tr>
<tr><td style="width: 54%;"></td><td style="width: 24%;">Kode Rekening</td><td style="width: 1%;">:</td><td style="width: 30%;">${item.koderekening}</td></tr>
</table>
<div class="judul-surat">
<h2>BUKTI PEMBAYARAN</h2>
</div>
<div class="garis"></div>
<table>
<tr><td style="width: 29%; text-align: left; vertical-align: top;">Telah Diterima Dari</td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 70%; text-align: left;">Kepala Dinas Pariwisata dan Kebudayaan Kab Jember</td></tr>
<tr><td style="width: 29%; text-align: left; vertical-align: top;">Banyaknya Uang</td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 70%; text-align: left;border: 1px solid black; font-style: italic;">${terbilang(totalNominal || 0)} Rupiah</td></tr>
<tr><td style="width: 29%; text-align: left; vertical-align: top;">Untuk Pembayaran</td><td style="width: 1%; text-align: left; vertical-align: top;">:</td><td style="width: 70%; text-align: left;">Belanja Perjalanan Dinas Untuk ${item.maksud || '-'} di ${item.tujuan || '-'} selama ${item.lamaPerjalanan || '-'} dari tanggal ${item.tanggalBerangkat || '-'} s/d ${item.tanggalPulang || '-'} </td></tr>
<table>
<tr><th style="width: 30%; font-size: 25px; text-align: center; vertical-align: top; border: 1px solid black; font-style: italic;"><strong>${totalNominal.toLocaleString('id-ID', { style: 'currency', currency: 'IDR' })}</strong></th><td style="width: 70%; text-align: left;"></td></tr>
</table>
<table>
<tr><td style="width: 40%; text-align: left;"></td><td style="width: 20%; text-align: center;"></td><td style="width: 40%; text-align: center;">Jember, ${tanggalprint}</td></tr>
</table>
<br>
<table>
<tr><td style="width: 33%; text-align: center;"></td><td style="width: 34%; text-align: center;">Lunas di bayar<br>Tanggal ${tanggalprint}</td><td style="width: 33%; text-align: center;"></td></tr>
</table>
<table>
<tr><td style="width: 33%; text-align: center;">PPTK</td><td style="width: 34%; text-align: center;">Bendahara Pengeluaran</td><td style="width: 33%; text-align: center;">Yang Menerima</td></tr>
</table>
<br>
<table>
<tr><td style="width: 33%; text-align: center;"><u>${namaTTD2}</u><br>NIP. ${nipTTD2}</td><td style="width: 34%; text-align: center;"><u>${namaTTD3}</u><br>NIP. ${nipTTD3}</td><td style="width: 33%; text-align: center;"><u>${item.nama || '-'}</u><br>NIP. ${item.nip || '-'}</td></tr>
</table>
<table>
<tr><td style="width: 33%; text-align: center;"></td><td style="width: 34%; text-align: center;">Pengguna Anggaran Selaku<br>Pejabat Pembuat Komitmen</td><td style="width: 33%; text-align: center;"></td></tr>
</table>
<br>
<br>
<table>
<tr><td style="width: 33%; text-align: center;"></td><td style="width: 34%; text-align: center;"><u>${namaTTD}</u><br>NIP. ${nipTTD}</td><td style="width: 33%; text-align: center;"></td></tr>
</table>
</table>
<div style="page-break-after: always;"></div>
`;
});
// Close the print window with the content
printWindow.document.write(headerContent + tablesContent);
printWindow.document.close(); // Menghentikan penulisan ke dokumen
printWindow.print(); // Memanggil dialog print
printWindow.close(); // Menutup jendela setelah mencetak
$('#printModal').modal('hide'); // Menutup modal setelah mencetak
resetDropdowns();
}).getDataByNomor2(nomor);
}
// Close modal on 'Close' or 'Cancel' button click
$('.close, .btn-secondary').on('click', function() {
$('#printModal').modal('hide');
});
function loadUserId() {
google.script.run.withSuccessHandler(function(userId) {
console.log('User ID:', userId);
document.getElementById("userIdDisplay").innerHTML = userId ? userId : "Guest";
// Periksa apakah pengguna adalah admin
google.script.run.withSuccessHandler(function(isAdmin) {
if (isAdmin) {
document.getElementById("sppdMenu").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu1").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu2").style.display = "block"; // Tampilkan menu
}
}).isUserAdmin(); // Panggil fungsi untuk memeriksa status admin
}).getUserId();
}
loadUserId();
function loadData() {
google.script.run.withSuccessHandler(function(data) {
// Tangani data yang diterima dan tampilkan di HTML
console.log(data); // Atau manipulasi DOM untuk menampilkan data
}).getData();
}
loadData();
</script>
</body>
</html>
11. Copy dan pastekan script di bawah ini ke laporanspj.html
Masukkan Password Untuk Melihat Script (Password sama dengan di atas)
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!=includeHeader();?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Data Tabel</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<style>
.table th, .table td {
white-space: nowrap; /* Mencegah teks membungkus */
}
.table th:nth-child(5), .table td:nth-child(5) {
width: 200px; /* Atur lebar kolom Rincian */
}
.table th:nth-child(6), .table td:nth-child(6) {
width: 100px; /* Atur lebar kolom Nominal */
}
.table th:nth-child(7), .table td:nth-child(7) {
width: 150px; /* Atur lebar kolom Keterangan */
}
.header {
display: flex;
align-items: center;
}
.header img {
margin-right: 20px; /* Jarak antara logo dan teks */
}
</style>
</head>
<body>
<br>
<div class="container-fluid d-flex flex-column align-items-center justify-content-start" style="height: 100vh;">
<div class="header">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo" style="width:120px;height:80px;">
<h2 class="mt-4">SPJ SPPD DISPARBUD</h2>
</div>
<br>
<div class="container-fluid">
<div id="table-container"></div>
</div>
</div>
<!-- Modal untuk Lihat Rincian -->
<div class="modal fade" id="detailsModal" tabindex="-1" aria-labelledby="detailsModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<!-- Anda bisa mengganti modal-lg dengan modal-xl untuk ukuran lebih besar -->
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="detailsModalLabel">Rincian SPJ</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<!-- Rincian SPJ akan ditampilkan di sini -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>
<!-- Modal untuk Form Rincian -->
<div class="modal fade" id="rincianModal" tabindex="-1" aria-labelledby="rincianModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="rincianModalLabel">Tambah Rincian</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" id="modalFormContainer">
<!-- Field Nomor, Nama/Pengikut, NIP -->
<div class="form-group">
<label>Nomor</label>
<input type="text" class="form-control" id="modalNomor" readonly>
</div>
<div class="form-group">
<label>Nama/Pengikut</label>
<input type="text" class="form-control" id="modalNamaPengikut" readonly>
</div>
<div class="form-group">
<label>NIP</label>
<input type="text" class="form-control" id="modalNIP" readonly>
</div>
<div class="form-group">
<label>Pangkat/Gol</label>
<input type="text" class="form-control" id="modalPangkat" readonly>
</div>
<!-- Field Hasil Kunjungan -->
<div class="form-group">
<label>Hasil Kunjungan</label>
<textarea class="form-control" id="hasilKunjungan" placeholder="Masukkan hasil kunjungan"></textarea>
</div>
<!-- Field Hasil Permasalahan -->
<div class="form-group">
<label>Permasalahan</label>
<textarea class="form-control" id="hasilPermasalahan" placeholder="Masukkan Permasalahan"></textarea>
</div>
<!-- Field Hasil Penyelesaian -->
<div class="form-group">
<label>Penyelesaian</label>
<textarea class="form-control" id="hasilPenyelesaian" placeholder="Masukkan Penyelesaian"></textarea>
</div>
<!-- Field Hasil Saran -->
<div class="form-group">
<label>Saran</label>
<textarea class="form-control" id="hasilSaran" placeholder="Masukkan Saran"></textarea>
</div>
<!-- Form dinamis akan ditambahkan di sini -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Tutup</button>
<button type="button" class="btn btn-primary" onclick="addFormRow()">Tambah Form</button>
<button type="button" class="btn btn-success" onclick="saveData()">Simpan</button>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script>
function renderTable(groupedData) {
let html = '';
// Ambil data SPJ terlebih dahulu
const spjData = {}; // Untuk menyimpan data SPJ
google.script.run.withSuccessHandler(function(spjGroupedData) {
spjGroupedData.forEach(row => {
const key = row.Nomor + '|' + row.NamaPengikut; // Gabungkan Nomor dan Nama
spjData[key] = true; // Tandai sebagai ada
});
html += `
<table class="table table-bordered table-hover table-sm" >
<thead>
<tr class="bg-primary" style="text-align: center; color: white;">
<th>Nomor SPT</th>
<th>Nomor SPPD</th>
<th>Jenis SPPD</th>
<th>Bidang</th>
<th>Tujuan</th>
<th>Tanggal Berangkat</th>
<th>Tanggal Buat</th>
</tr>
</thead>
<tbody>
`;
Object.keys(groupedData).forEach((nomor, index) => {
const rows = groupedData[nomor];
// Ambil Nomor SPPD dan Tujuan dari baris pertama
const nomorSPPD = rows[0].NomorSPPD;
const jenisSPPD = rows[0].JenisSPPD;
const instansi = rows[0].Instansi;
const tujuan = rows[0].Tujuan;
const tanggalBerangkat = rows[0].TanggalBerangkat;
const tanggalBuat = rows[0].TanggalBuat;
// Menampilkan Nomor, Nomor SPPD, dan Tujuan sebagai baris tabel dengan tombol collapse
html += `
<tr>
<td>
<button class="btn btn-link" data-toggle="collapse" data-target="#detail1-${index}" aria-expanded="false" aria-controls="detail1-${index}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0"/>
</svg>
</button>
${nomor}
</td>
<td>${nomorSPPD}</td>
<td>${jenisSPPD}</td>
<td>${instansi}</td>
<td>${tujuan}</td>
<td>${tanggalBerangkat}</td>
<td>${tanggalBuat}</td>
</tr>
<tr class="collapse" id="detail1-${index}">
<td colspan="6">
<table class="table table-bordered table-hover table-sm">
<thead>
<tr style="background-color: #7023cf; text-align: center; color: white;">
<th>Nama / Pengikut</th>
<th>NIP</th>
<th>Pangkat/Gol</th>
<th>Form Rincian</th>
</tr>
</thead>
<tbody>
`;
// Menampilkan Nama dari data yang ada
const firstRow = rows[0];
html += `
<tr ${spjData[firstRow.Nomor + '|' + firstRow.Nama] ? 'style="background-color: #c9ffcb;"' : ''}>
<td>${firstRow.Nama}</td>
<td>${firstRow.NIP}</td>
<td>${firstRow.Pangkat}</td>
<td>
<button class="btn btn-sm btn-primary" onclick="openModal('${firstRow.Nomor}', '${firstRow.Nama}', '${firstRow.NIP}', '${firstRow.Pangkat}')">Tambah Rincian</button>
<button class="btn btn-sm btn-info" onclick="viewDetails('${firstRow.Nomor}', '${firstRow.Nama}')">Lihat Rincian</button>
<button class="btn btn-sm btn-danger" onclick="deleteSPJ('${firstRow.Nomor}', '${firstRow.Nama}')">Delete</button>
</td>
</tr>
`;
// Menampilkan Pengikut
rows.forEach((row) => {
if (row.Pengikut && row.NIPPengikut) {
html += `
<tr ${spjData[row.Nomor + '|' + row.Pengikut] ? 'style="background-color: #c9ffcb;"' : ''}>
<td>${row.Pengikut}</td>
<td>${row.NIPPengikut}</td>
<td>${row.PangkatPengikut}</td>
<td>
<button class="btn btn-sm btn-primary" onclick="openModal('${row.Nomor}', '${row.Pengikut}', '${row.NIPPengikut}', '${row.PangkatPengikut}')">Tambah Rincian</button>
<button class="btn btn-sm btn-info" onclick="viewDetails('${row.Nomor}', '${row.Pengikut}')">Lihat Rincian</button>
<button class="btn btn-sm btn-danger" onclick="deleteSPJ('${row.Nomor}', '${row.Pengikut}')">Delete</button>
</td>
</tr>
`;
}
});
html += `
</tbody>
</table>
</td>
</tr>
`;
});
html += `
</tbody>
</table>
`;
document.getElementById('table-container').innerHTML = html;
}).getSPJGroupedData(); // Memanggil data SPJ
}
// Tambahkan fungsi deleteSPJ
function deleteSPJ(nomor, namaPengikut) {
if (confirm("Anda yakin ingin menghapus data ini?")) {
google.script.run.withSuccessHandler(function() {
alert("Data berhasil dihapus!");
google.script.run.withSuccessHandler(renderTable).getFilteredData(); // Reload tabel setelah simpan
}).deleteSPJData(nomor, namaPengikut);
}
}
function getSPJGroupedData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
const data = sheet.getDataRange().getValues();
// Menyaring data sesuai Nomor dan Nama Pengikut
const spjDetails = data.map(row => ({
Nomor: row[0],
NamaPengikut: row[1]
}));
return spjDetails;
}
function viewDetails(nomor, namaPengikut) {
google.script.run.withSuccessHandler(function(spjDetails) {
if (spjDetails.length > 0) {
renderSPJDetails(spjDetails);
} else {
alert("Tidak ada rincian untuk Nomor: " + nomor + " dan Nama: " + namaPengikut);
}
}).getSPJDetails(nomor, namaPengikut);
}
function renderSPJDetails(spjDetails) {
let html = `
<h4>Rincian untuk Nomor: ${spjDetails[0].Nomor}</h4>
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>Nomor spt</th>
<th>Nama/Pengikut</th>
<th>NIP</th>
<th>Pangkat/Gol</th>
<th>Hasil Kunjungan</th>
<th>Permasalahan</th>
<th>Penyelesaian</th>
<th>Saran</th>
<th>Rincian</th>
<th>Nominal</th>
<th>Keterangan</th>
</tr>
</thead>
<tbody>
`;
spjDetails.forEach(row => {
html += `
<tr>
<td>${row.Nomor}</td>
<td>${row.NamaPengikut}</td>
<td>${row.NIP}</td>
<td>${row.Pangkat}</td>
<td>${row.HasilKunjungan}</td>
<td>${row.HasilPermasalahan}</td>
<td>${row.HasilPenyelesaian}</td>
<td>${row.HasilSaran}</td>
<td>${row.Rincian}</td>
<td>${row.Nominal}</td>
<td>${row.Keterangan}</td>
</tr>
`;
});
html += `
</tbody>
</table>
</div>
`;
// Tampilkan rincian dalam modal
showDetailsModal(html);
}
function showDetailsModal(content) {
const detailsModal = document.getElementById('detailsModal');
detailsModal.querySelector('.modal-body').innerHTML = content;
$('#detailsModal').modal('show');
}
function openModal(nomor, namaPengikut, nip, pangkat) {
// Set nilai ke input modal
document.getElementById('modalNomor').value = nomor;
document.getElementById('modalNamaPengikut').value = namaPengikut;
document.getElementById('modalNIP').value = nip;
document.getElementById('modalPangkat').value = pangkat;
// Tampilkan modal
$('#rincianModal').modal('show');
}
function addFormRow() {
const formHtml = `
<div class="border p-2 mt-2">
<div class="form-group">
<label>Rincian</label>
<select class="form-control" name="rincian">
<option value="" disabled selected>Pilih Rincian</option>
<option value="Uang Harian Kembali">Uang Harian Kembali</option>
<option value="Transportasi">Transportasi</option>
<option value="Akomodasi">Akomodasi</option>
<option value="BBM">BBM</option>
<option value="Lain-Lain">Lain-Lain</option>
</select>
</div>
<div class="form-group">
<label>Nominal</label>
<input type="number" class="form-control" name="nominal" placeholder="Masukkan nominal">
</div>
<div class="form-group">
<label>Keterangan</label>
<textarea class="form-control" name="keterangan" placeholder="Masukkan keterangan"></textarea>
</div>
<button class="btn btn-danger btn-sm" onclick="removeForm(this)">Hapus</button>
</div>
`;
document.getElementById('modalFormContainer').insertAdjacentHTML('beforeend', formHtml);
}
function removeForm(button) {
button.parentElement.remove();
}
function saveData() {
const nomor = document.getElementById('modalNomor').value;
const namaPengikut = document.getElementById('modalNamaPengikut').value;
const nip = document.getElementById('modalNIP').value;
const pangkat = document.getElementById('modalPangkat').value;
const hasilKunjungan = document.getElementById('hasilKunjungan').value;
const hasilPermasalahan = document.getElementById('hasilPermasalahan').value;
const hasilPenyelesaian = document.getElementById('hasilPenyelesaian').value;
const hasilSaran = document.getElementById('hasilSaran').value;
// Ambil semua rincian dari form dinamis
const forms = document.querySelectorAll('#modalFormContainer .border');
const rincianData = [];
forms.forEach(form => {
const rincian = form.querySelector('select[name="rincian"]').value;
const nominal = form.querySelector('input[name="nominal"]').value;
const keterangan = form.querySelector('textarea[name="keterangan"]').value;
rincianData.push({ rincian, nominal, keterangan });
});
// Panggil fungsi Google Apps Script untuk menyimpan data
google.script.run.withSuccessHandler(() => {
alert('Data berhasil disimpan!');
resetModalFields(); // Reset field modal setelah simpan
$('#rincianModal').modal('hide'); // Tutup modal setelah simpan
google.script.run.withSuccessHandler(renderTable).getFilteredData(); // Reload tabel setelah simpan
}).saveDataToSPJ(nomor, namaPengikut, nip, pangkat, hasilKunjungan, hasilPermasalahan, hasilPenyelesaian, hasilSaran, rincianData);
}
function resetModalFields() {
// Reset field modal
document.getElementById('hasilKunjungan').value = '';
document.getElementById('hasilPermasalahan').value = '';
document.getElementById('hasilPenyelesaian').value = '';
document.getElementById('hasilSaran').value = '';
const forms = document.querySelectorAll('#modalFormContainer .border');
forms.forEach(form => {
form.querySelector('select[name="rincian"]').value = '';
form.querySelector('input[name="nominal"]').value = '';
form.querySelector('textarea[name="keterangan"]').value = '';
});
}
// Event listener untuk menutup modal
$('#rincianModal').on('hidden.bs.modal', function () {
resetModalFields(); // Reset field modal ketika modal ditutup
});
google.script.run.withSuccessHandler(renderTable).getFilteredData();
function loadUserId() {
google.script.run.withSuccessHandler(function(userId) {
console.log('User ID:', userId);
document.getElementById("userIdDisplay").innerHTML = userId ? userId : "Guest";
// Periksa apakah pengguna adalah admin
google.script.run.withSuccessHandler(function(isAdmin) {
if (isAdmin) {
document.getElementById("sppdMenu").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu1").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu2").style.display = "block"; // Tampilkan menu
}
}).isUserAdmin(); // Panggil fungsi untuk memeriksa status admin
}).getUserId();
}
loadUserId();
function loadData() {
google.script.run.withSuccessHandler(function(data) {
// Tangani data yang diterima dan tampilkan di HTML
console.log(data); // Atau manipulasi DOM untuk menampilkan data
}).getData();
}
loadData();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!=includeHeader();?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Data Tabel</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<style>
.table th, .table td {
white-space: nowrap; /* Mencegah teks membungkus */
}
.table th:nth-child(5), .table td:nth-child(5) {
width: 200px; /* Atur lebar kolom Rincian */
}
.table th:nth-child(6), .table td:nth-child(6) {
width: 100px; /* Atur lebar kolom Nominal */
}
.table th:nth-child(7), .table td:nth-child(7) {
width: 150px; /* Atur lebar kolom Keterangan */
}
.header {
display: flex;
align-items: center;
}
.header img {
margin-right: 20px; /* Jarak antara logo dan teks */
}
</style>
</head>
<body>
<br>
<div class="container-fluid d-flex flex-column align-items-center justify-content-start" style="height: 100vh;">
<div class="header">
<img src="https://i.imgur.com/wZVRwfH.png" alt="Logo" style="width:120px;height:80px;">
<h2 class="mt-4">SPJ SPPD DISPARBUD</h2>
</div>
<br>
<div class="container-fluid">
<div id="table-container"></div>
</div>
</div>
<!-- Modal untuk Lihat Rincian -->
<div class="modal fade" id="detailsModal" tabindex="-1" aria-labelledby="detailsModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<!-- Anda bisa mengganti modal-lg dengan modal-xl untuk ukuran lebih besar -->
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="detailsModalLabel">Rincian SPJ</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<!-- Rincian SPJ akan ditampilkan di sini -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>
<!-- Modal untuk Form Rincian -->
<div class="modal fade" id="rincianModal" tabindex="-1" aria-labelledby="rincianModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="rincianModalLabel">Tambah Rincian</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" id="modalFormContainer">
<!-- Field Nomor, Nama/Pengikut, NIP -->
<div class="form-group">
<label>Nomor</label>
<input type="text" class="form-control" id="modalNomor" readonly>
</div>
<div class="form-group">
<label>Nama/Pengikut</label>
<input type="text" class="form-control" id="modalNamaPengikut" readonly>
</div>
<div class="form-group">
<label>NIP</label>
<input type="text" class="form-control" id="modalNIP" readonly>
</div>
<div class="form-group">
<label>Pangkat/Gol</label>
<input type="text" class="form-control" id="modalPangkat" readonly>
</div>
<!-- Field Hasil Kunjungan -->
<div class="form-group">
<label>Hasil Kunjungan</label>
<textarea class="form-control" id="hasilKunjungan" placeholder="Masukkan hasil kunjungan"></textarea>
</div>
<!-- Field Hasil Permasalahan -->
<div class="form-group">
<label>Permasalahan</label>
<textarea class="form-control" id="hasilPermasalahan" placeholder="Masukkan Permasalahan"></textarea>
</div>
<!-- Field Hasil Penyelesaian -->
<div class="form-group">
<label>Penyelesaian</label>
<textarea class="form-control" id="hasilPenyelesaian" placeholder="Masukkan Penyelesaian"></textarea>
</div>
<!-- Field Hasil Saran -->
<div class="form-group">
<label>Saran</label>
<textarea class="form-control" id="hasilSaran" placeholder="Masukkan Saran"></textarea>
</div>
<!-- Form dinamis akan ditambahkan di sini -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Tutup</button>
<button type="button" class="btn btn-primary" onclick="addFormRow()">Tambah Form</button>
<button type="button" class="btn btn-success" onclick="saveData()">Simpan</button>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script>
function renderTable(groupedData) {
let html = '';
// Ambil data SPJ terlebih dahulu
const spjData = {}; // Untuk menyimpan data SPJ
google.script.run.withSuccessHandler(function(spjGroupedData) {
spjGroupedData.forEach(row => {
const key = row.Nomor + '|' + row.NamaPengikut; // Gabungkan Nomor dan Nama
spjData[key] = true; // Tandai sebagai ada
});
html += `
<table class="table table-bordered table-hover table-sm" >
<thead>
<tr class="bg-primary" style="text-align: center; color: white;">
<th>Nomor SPT</th>
<th>Nomor SPPD</th>
<th>Jenis SPPD</th>
<th>Bidang</th>
<th>Tujuan</th>
<th>Tanggal Berangkat</th>
<th>Tanggal Buat</th>
</tr>
</thead>
<tbody>
`;
Object.keys(groupedData).forEach((nomor, index) => {
const rows = groupedData[nomor];
// Ambil Nomor SPPD dan Tujuan dari baris pertama
const nomorSPPD = rows[0].NomorSPPD;
const jenisSPPD = rows[0].JenisSPPD;
const instansi = rows[0].Instansi;
const tujuan = rows[0].Tujuan;
const tanggalBerangkat = rows[0].TanggalBerangkat;
const tanggalBuat = rows[0].TanggalBuat;
// Menampilkan Nomor, Nomor SPPD, dan Tujuan sebagai baris tabel dengan tombol collapse
html += `
<tr>
<td>
<button class="btn btn-link" data-toggle="collapse" data-target="#detail1-${index}" aria-expanded="false" aria-controls="detail1-${index}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0"/>
</svg>
</button>
${nomor}
</td>
<td>${nomorSPPD}</td>
<td>${jenisSPPD}</td>
<td>${instansi}</td>
<td>${tujuan}</td>
<td>${tanggalBerangkat}</td>
<td>${tanggalBuat}</td>
</tr>
<tr class="collapse" id="detail1-${index}">
<td colspan="6">
<table class="table table-bordered table-hover table-sm">
<thead>
<tr style="background-color: #7023cf; text-align: center; color: white;">
<th>Nama / Pengikut</th>
<th>NIP</th>
<th>Pangkat/Gol</th>
<th>Form Rincian</th>
</tr>
</thead>
<tbody>
`;
// Menampilkan Nama dari data yang ada
const firstRow = rows[0];
html += `
<tr ${spjData[firstRow.Nomor + '|' + firstRow.Nama] ? 'style="background-color: #c9ffcb;"' : ''}>
<td>${firstRow.Nama}</td>
<td>${firstRow.NIP}</td>
<td>${firstRow.Pangkat}</td>
<td>
<button class="btn btn-sm btn-primary" onclick="openModal('${firstRow.Nomor}', '${firstRow.Nama}', '${firstRow.NIP}', '${firstRow.Pangkat}')">Tambah Rincian</button>
<button class="btn btn-sm btn-info" onclick="viewDetails('${firstRow.Nomor}', '${firstRow.Nama}')">Lihat Rincian</button>
<button class="btn btn-sm btn-danger" onclick="deleteSPJ('${firstRow.Nomor}', '${firstRow.Nama}')">Delete</button>
</td>
</tr>
`;
// Menampilkan Pengikut
rows.forEach((row) => {
if (row.Pengikut && row.NIPPengikut) {
html += `
<tr ${spjData[row.Nomor + '|' + row.Pengikut] ? 'style="background-color: #c9ffcb;"' : ''}>
<td>${row.Pengikut}</td>
<td>${row.NIPPengikut}</td>
<td>${row.PangkatPengikut}</td>
<td>
<button class="btn btn-sm btn-primary" onclick="openModal('${row.Nomor}', '${row.Pengikut}', '${row.NIPPengikut}', '${row.PangkatPengikut}')">Tambah Rincian</button>
<button class="btn btn-sm btn-info" onclick="viewDetails('${row.Nomor}', '${row.Pengikut}')">Lihat Rincian</button>
<button class="btn btn-sm btn-danger" onclick="deleteSPJ('${row.Nomor}', '${row.Pengikut}')">Delete</button>
</td>
</tr>
`;
}
});
html += `
</tbody>
</table>
</td>
</tr>
`;
});
html += `
</tbody>
</table>
`;
document.getElementById('table-container').innerHTML = html;
}).getSPJGroupedData(); // Memanggil data SPJ
}
// Tambahkan fungsi deleteSPJ
function deleteSPJ(nomor, namaPengikut) {
if (confirm("Anda yakin ingin menghapus data ini?")) {
google.script.run.withSuccessHandler(function() {
alert("Data berhasil dihapus!");
google.script.run.withSuccessHandler(renderTable).getFilteredData(); // Reload tabel setelah simpan
}).deleteSPJData(nomor, namaPengikut);
}
}
function getSPJGroupedData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SPJ');
const data = sheet.getDataRange().getValues();
// Menyaring data sesuai Nomor dan Nama Pengikut
const spjDetails = data.map(row => ({
Nomor: row[0],
NamaPengikut: row[1]
}));
return spjDetails;
}
function viewDetails(nomor, namaPengikut) {
google.script.run.withSuccessHandler(function(spjDetails) {
if (spjDetails.length > 0) {
renderSPJDetails(spjDetails);
} else {
alert("Tidak ada rincian untuk Nomor: " + nomor + " dan Nama: " + namaPengikut);
}
}).getSPJDetails(nomor, namaPengikut);
}
function renderSPJDetails(spjDetails) {
let html = `
<h4>Rincian untuk Nomor: ${spjDetails[0].Nomor}</h4>
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>Nomor spt</th>
<th>Nama/Pengikut</th>
<th>NIP</th>
<th>Pangkat/Gol</th>
<th>Hasil Kunjungan</th>
<th>Permasalahan</th>
<th>Penyelesaian</th>
<th>Saran</th>
<th>Rincian</th>
<th>Nominal</th>
<th>Keterangan</th>
</tr>
</thead>
<tbody>
`;
spjDetails.forEach(row => {
html += `
<tr>
<td>${row.Nomor}</td>
<td>${row.NamaPengikut}</td>
<td>${row.NIP}</td>
<td>${row.Pangkat}</td>
<td>${row.HasilKunjungan}</td>
<td>${row.HasilPermasalahan}</td>
<td>${row.HasilPenyelesaian}</td>
<td>${row.HasilSaran}</td>
<td>${row.Rincian}</td>
<td>${row.Nominal}</td>
<td>${row.Keterangan}</td>
</tr>
`;
});
html += `
</tbody>
</table>
</div>
`;
// Tampilkan rincian dalam modal
showDetailsModal(html);
}
function showDetailsModal(content) {
const detailsModal = document.getElementById('detailsModal');
detailsModal.querySelector('.modal-body').innerHTML = content;
$('#detailsModal').modal('show');
}
function openModal(nomor, namaPengikut, nip, pangkat) {
// Set nilai ke input modal
document.getElementById('modalNomor').value = nomor;
document.getElementById('modalNamaPengikut').value = namaPengikut;
document.getElementById('modalNIP').value = nip;
document.getElementById('modalPangkat').value = pangkat;
// Tampilkan modal
$('#rincianModal').modal('show');
}
function addFormRow() {
const formHtml = `
<div class="border p-2 mt-2">
<div class="form-group">
<label>Rincian</label>
<select class="form-control" name="rincian">
<option value="" disabled selected>Pilih Rincian</option>
<option value="Uang Harian Kembali">Uang Harian Kembali</option>
<option value="Transportasi">Transportasi</option>
<option value="Akomodasi">Akomodasi</option>
<option value="BBM">BBM</option>
<option value="Lain-Lain">Lain-Lain</option>
</select>
</div>
<div class="form-group">
<label>Nominal</label>
<input type="number" class="form-control" name="nominal" placeholder="Masukkan nominal">
</div>
<div class="form-group">
<label>Keterangan</label>
<textarea class="form-control" name="keterangan" placeholder="Masukkan keterangan"></textarea>
</div>
<button class="btn btn-danger btn-sm" onclick="removeForm(this)">Hapus</button>
</div>
`;
document.getElementById('modalFormContainer').insertAdjacentHTML('beforeend', formHtml);
}
function removeForm(button) {
button.parentElement.remove();
}
function saveData() {
const nomor = document.getElementById('modalNomor').value;
const namaPengikut = document.getElementById('modalNamaPengikut').value;
const nip = document.getElementById('modalNIP').value;
const pangkat = document.getElementById('modalPangkat').value;
const hasilKunjungan = document.getElementById('hasilKunjungan').value;
const hasilPermasalahan = document.getElementById('hasilPermasalahan').value;
const hasilPenyelesaian = document.getElementById('hasilPenyelesaian').value;
const hasilSaran = document.getElementById('hasilSaran').value;
// Ambil semua rincian dari form dinamis
const forms = document.querySelectorAll('#modalFormContainer .border');
const rincianData = [];
forms.forEach(form => {
const rincian = form.querySelector('select[name="rincian"]').value;
const nominal = form.querySelector('input[name="nominal"]').value;
const keterangan = form.querySelector('textarea[name="keterangan"]').value;
rincianData.push({ rincian, nominal, keterangan });
});
// Panggil fungsi Google Apps Script untuk menyimpan data
google.script.run.withSuccessHandler(() => {
alert('Data berhasil disimpan!');
resetModalFields(); // Reset field modal setelah simpan
$('#rincianModal').modal('hide'); // Tutup modal setelah simpan
google.script.run.withSuccessHandler(renderTable).getFilteredData(); // Reload tabel setelah simpan
}).saveDataToSPJ(nomor, namaPengikut, nip, pangkat, hasilKunjungan, hasilPermasalahan, hasilPenyelesaian, hasilSaran, rincianData);
}
function resetModalFields() {
// Reset field modal
document.getElementById('hasilKunjungan').value = '';
document.getElementById('hasilPermasalahan').value = '';
document.getElementById('hasilPenyelesaian').value = '';
document.getElementById('hasilSaran').value = '';
const forms = document.querySelectorAll('#modalFormContainer .border');
forms.forEach(form => {
form.querySelector('select[name="rincian"]').value = '';
form.querySelector('input[name="nominal"]').value = '';
form.querySelector('textarea[name="keterangan"]').value = '';
});
}
// Event listener untuk menutup modal
$('#rincianModal').on('hidden.bs.modal', function () {
resetModalFields(); // Reset field modal ketika modal ditutup
});
google.script.run.withSuccessHandler(renderTable).getFilteredData();
function loadUserId() {
google.script.run.withSuccessHandler(function(userId) {
console.log('User ID:', userId);
document.getElementById("userIdDisplay").innerHTML = userId ? userId : "Guest";
// Periksa apakah pengguna adalah admin
google.script.run.withSuccessHandler(function(isAdmin) {
if (isAdmin) {
document.getElementById("sppdMenu").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu1").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu2").style.display = "block"; // Tampilkan menu
}
}).isUserAdmin(); // Panggil fungsi untuk memeriksa status admin
}).getUserId();
}
loadUserId();
function loadData() {
google.script.run.withSuccessHandler(function(data) {
// Tangani data yang diterima dan tampilkan di HTML
console.log(data); // Atau manipulasi DOM untuk menampilkan data
}).getData();
}
loadData();
</script>
</body>
</html>
12. Copy dan pastekan script di bawah ini ke sppdkosong.html
Masukkan Password Untuk Melihat Script (Password sama dengan di atas)
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!=includeHeader();?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
div.ex1 {
width: 800px;
margin: auto;
background-color: white;
padding: 20px;
}
@media print {
body * {
visibility: hidden;
}
#printableTable, #printableTable * {
visibility: visible;
}
#printableTable {
position: absolute;
left: 0;
top: 0;
}
.underline {
text-decoration: underline !important; /* Pastikan garis bawah muncul saat print */
}
}
::-webkit-input-placeholder {
text-align: center;
}
:-moz-placeholder {
text-align: center;
}
.print-button-container {
text-align: center;
margin-bottom: 20px; /* Jarak bawah tombol */
}
.print-button {
background-color: #007bff; /* Warna tombol */
color: white; /* Warna teks */
border: none; /* Tanpa border */
border-radius: 5px; /* Sudut melengkung */
padding: 10px 20px; /* Padding tombol */
font-size: 16px; /* Ukuran font */
cursor: pointer; /* Pointer saat hover */
transition: background-color 0.3s; /* Efek transisi */
}
.print-button:hover {
background-color: #0056b3; /* Warna tombol saat hover */
}
</style>
</head>
<body onload="loadUserId();">
<br>
<div class="print-button-container">
<button class="print-button" onclick="printTable()">Print Tabel</button>
</div>
<div class="ex1" id="printableTable">
<table>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Lembar ke</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;"> II </td>
</tr>
</table>
<table>
<tr>
<table style="width: 100%; border: 2px solid black; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px;">
<tbody>
<!--Baris1 -->
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 15%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px; text-align: center;">I.</td>
<td style="width: 15%; height: 10px; text-align: left;">Berangkat dari</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px; text-align: left;"><input type="text" id="berangkat1" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px; text-align: left;">(Tempat Kedudukan)</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; text-align: left;"><input type="text" id="kedudukan" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Ke</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="ke1" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Tanggal</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px;"><input type="date" id="tanggal1" class="form-control"></td>
</tr>
<tr style="height: 160px;">
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 26%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan1" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi1" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama1" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip1" class="form-control" placeholder="- - NIP - -"></td>
</tr>
<!--Baris2 -->
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; text-align: center;">II.</td>
<td style="width: 15%; height: 10px; text-align: left;">Tiba di</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"><input type="text" id="tiba2" class="form-control" placeholder="...."></td>
<td style="width: 5%; height: 10px; text-align: center;"></td>
<td style="width: 15%; height: 10px; text-align: left;">Berangkat dari</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="berangkat2" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada Tanggal</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"><input type="date" id="tanggal2" class="form-control"></td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px; text-align: left;">Ke</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="ke2" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada tanggal</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="date" id="tanggal3" class="form-control"></td>
</tr>
<tr style="height: 160px;">
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan2" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi2" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama2" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip2" class="form-control" placeholder="- - NIP - -"></td>
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan3" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi3" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama3" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip3" class="form-control" placeholder="- - NIP - -"></td>
</tr>
<!--Baris3 -->
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; text-align: center;">III.</td>
<td style="width: 15%; height: 10px; text-align: left;">Tiba di</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"><input type="text" id="tiba3" class="form-control" placeholder="...."></td>
<td style="width: 5%; height: 10px; text-align: center;"></td>
<td style="width: 15%; height: 10px; text-align: left;">Berangkat dari</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="berangkat3" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada Tanggal</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"><input type="date" id="tanggal4" class="form-control"></td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px; text-align: left;">Ke</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="ke3" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada tanggal</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="date" id="tanggal5" class="form-control"></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 26%; height: 10px; "> </td>
</tr>
<tr style="height: 160px;">
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan4" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi4" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama4" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip4" class="form-control" placeholder="- - NIP - -"></td>
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan5" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi5" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama5" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip5" class="form-control" placeholder="- - NIP - -"></td>
</tr>
<!--Baris4 -->
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; text-align: center;">IV.</td>
<td style="width: 15%; height: 10px; text-align: left;">Tiba di</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black; text-align: left;"><input type="text" id="tiba4" class="form-control" placeholder="...."></td>
<td style="width: 5%; height: 10px; text-align: center;" colspan="4"></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada Tanggal</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black; text-align: left;"><input type="date" id="tanggal6" class="form-control"></td>
<td style="width: 5%; height: 10px; text-align: center;" colspan="4">Telah diperiksa dengan ketentuan bahwa perjalanan</td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px; text-align: center;" colspan="4">tersebut diatas perintahnya dan semata-mata untuk</td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px; text-align: center;" colspan="4">kepentingan jabatan dalam waktu yang sesingkat-singkatnya.</td>
</tr>
<tr style="height: 160px;">
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan6" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi6" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama6" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip6" class="form-control" placeholder="- - NIP - -"></td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 26%; height: 160px; border-bottom: 2px solid black;"> </td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; "></td>
<td style="width: 15%; height: 10px; text-align: left;">Catatan Lain-Lain</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"></td>
<td style="width: 15%; height: 10px;"></td>
<td style="width: 5%; height: 10px;"></td>
<td style="width: 26%; height: 10px;"></td>
</tr>
</tbody>
</table>
</div>
<script>
// Fungsi untuk mengonversi format tanggal ke "1 Januari 2024"
function formatDate(inputDate) {
const months = [
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
];
const date = new Date(inputDate);
const day = date.getDate();
const month = months[date.getMonth()]; // Mendapatkan nama bulan
const year = date.getFullYear();
return `${day} ${month} ${year}`;
}
function printTable() {
// Ambil nilai input
var inputBerangkat = document.getElementById('berangkat1');
var inputBerangkat2 = document.getElementById('berangkat2');
var inputBerangkat3 = document.getElementById('berangkat3');
var inputKedudukan = document.getElementById('kedudukan');
var inputKe1 = document.getElementById('ke1');
var inputKe2 = document.getElementById('ke2');
var inputKe3 = document.getElementById('ke3');
var inputTiba2 = document.getElementById('tiba2');
var inputTiba3 = document.getElementById('tiba3');
var inputTiba4 = document.getElementById('tiba4');
var inputJabatan1 = document.getElementById('jabatan1');
var inputJabatan2 = document.getElementById('jabatan2');
var inputJabatan3 = document.getElementById('jabatan3');
var inputJabatan4 = document.getElementById('jabatan4');
var inputJabatan5 = document.getElementById('jabatan5');
var inputJabatan6 = document.getElementById('jabatan6');
var inputInstansi1 = document.getElementById('instansi1');
var inputInstansi2 = document.getElementById('instansi2');
var inputInstansi3 = document.getElementById('instansi3');
var inputInstansi4 = document.getElementById('instansi4');
var inputInstansi5 = document.getElementById('instansi5');
var inputInstansi6 = document.getElementById('instansi6');
var inputNama1 = document.getElementById('nama1');
var inputNama2 = document.getElementById('nama2');
var inputNama3 = document.getElementById('nama3');
var inputNama4 = document.getElementById('nama4');
var inputNama5 = document.getElementById('nama5');
var inputNama6 = document.getElementById('nama6');
var inputNip1 = document.getElementById('nip1');
var inputNip2 = document.getElementById('nip2');
var inputNip3 = document.getElementById('nip3');
var inputNip4 = document.getElementById('nip4');
var inputNip5 = document.getElementById('nip5');
var inputNip6 = document.getElementById('nip6');
var inputTanggal1 = document.getElementById('tanggal1');
var inputTanggal2 = document.getElementById('tanggal2');
var inputTanggal3 = document.getElementById('tanggal3');
var inputTanggal4 = document.getElementById('tanggal4');
var inputTanggal5 = document.getElementById('tanggal5');
var inputTanggal6 = document.getElementById('tanggal6');
var inputValueBerangkat = inputBerangkat.value;
var inputValueBerangkat2 = inputBerangkat2.value;
var inputValueBerangkat3 = inputBerangkat3.value;
var inputValueKedudukan = inputKedudukan.value;
var inputValueKe1 = inputKe1.value;
var inputValueKe2 = inputKe2.value;
var inputValueKe3 = inputKe3.value;
var inputValueTiba2 = inputTiba2.value;
var inputValueTiba3 = inputTiba3.value;
var inputValueTiba4 = inputTiba4.value;
var inputValueJabatan1 = inputJabatan1.value;
var inputValueJabatan2 = inputJabatan2.value;
var inputValueJabatan3 = inputJabatan3.value;
var inputValueJabatan4 = inputJabatan4.value;
var inputValueJabatan5 = inputJabatan5.value;
var inputValueJabatan6 = inputJabatan6.value;
var inputValueInstansi1 = inputInstansi1.value;
var inputValueInstansi2 = inputInstansi2.value;
var inputValueInstansi3 = inputInstansi3.value;
var inputValueInstansi4 = inputInstansi4.value;
var inputValueInstansi5 = inputInstansi5.value;
var inputValueInstansi6 = inputInstansi6.value;
var inputValueNama1 = inputNama1.value;
var inputValueNama2 = inputNama2.value;
var inputValueNama3 = inputNama3.value;
var inputValueNama4 = inputNama4.value;
var inputValueNama5 = inputNama5.value;
var inputValueNama6 = inputNama6.value;
var inputValueNip1 = inputNip1.value;
var inputValueNip2 = inputNip2.value;
var inputValueNip3 = inputNip3.value;
var inputValueNip4 = inputNip4.value;
var inputValueNip5 = inputNip5.value;
var inputValueNip6 = inputNip6.value;
// Simpan nilai asli HTML dari tabel
var originalContents = document.body.innerHTML;
// Ganti input dengan teks sebelum mencetak
inputBerangkat.outerHTML = `<span>${inputValueBerangkat}</span>`;
inputBerangkat2.outerHTML = `<span>${inputValueBerangkat2}</span>`;
inputBerangkat3.outerHTML = `<span>${inputValueBerangkat3}</span>`;
inputKedudukan.outerHTML = `<span>${inputValueKedudukan}</span>`;
inputKe1.outerHTML = `<span>${inputValueKe1}</span>`;
inputKe2.outerHTML = `<span>${inputValueKe2}</span>`;
inputKe3.outerHTML = `<span>${inputValueKe3}</span>`;
inputTiba2.outerHTML = `<span>${inputValueTiba2}</span>`;
inputTiba3.outerHTML = `<span>${inputValueTiba3}</span>`;
inputTiba4.outerHTML = `<span>${inputValueTiba4}</span>`;
inputJabatan1.outerHTML = `<span>${inputValueJabatan1}</span>`;
inputJabatan2.outerHTML = `<span>${inputValueJabatan2}</span>`;
inputJabatan3.outerHTML = `<span>${inputValueJabatan3}</span>`;
inputJabatan4.outerHTML = `<span>${inputValueJabatan4}</span>`;
inputJabatan5.outerHTML = `<span>${inputValueJabatan5}</span>`;
inputJabatan6.outerHTML = `<span>${inputValueJabatan6}</span>`;
inputInstansi1.outerHTML = `<span>${inputValueInstansi1}</span>`;
inputInstansi2.outerHTML = `<span>${inputValueInstansi2}</span>`;
inputInstansi3.outerHTML = `<span>${inputValueInstansi3}</span>`;
inputInstansi4.outerHTML = `<span>${inputValueInstansi4}</span>`;
inputInstansi5.outerHTML = `<span>${inputValueInstansi5}</span>`;
inputInstansi6.outerHTML = `<span>${inputValueInstansi6}</span>`;
// Tambahkan awalan "NIP" untuk Nip, hanya jika diisi
if (inputValueNip1) {
inputNip1.outerHTML = `<span>NIP. ${inputValueNip1}</span>`;
} else {
inputNip1.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip2) {
inputNip2.outerHTML = `<span>NIP. ${inputValueNip2}</span>`;
} else {
inputNip2.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip3) {
inputNip3.outerHTML = `<span>NIP. ${inputValueNip3}</span>`;
} else {
inputNip3.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip4) {
inputNip4.outerHTML = `<span>NIP. ${inputValueNip4}</span>`;
} else {
inputNip4.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip5) {
inputNip5.outerHTML = `<span>NIP. ${inputValueNip5}</span>`;
} else {
inputNip5.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip6) {
inputNip6.outerHTML = `<span>NIP. ${inputValueNip6}</span>`;
} else {
inputNip6.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
// Tambahkan garis bawah pada input "Nama"
if (inputValueNama1) {
inputNama1.outerHTML = `<span class="underline">${inputValueNama1}</span>`;
} else {
inputNama1.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama2) {
inputNama2.outerHTML = `<span class="underline">${inputValueNama2}</span>`;
} else {
inputNama2.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama3) {
inputNama3.outerHTML = `<span class="underline">${inputValueNama3}</span>`;
} else {
inputNama3.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama4) {
inputNama4.outerHTML = `<span class="underline">${inputValueNama4}</span>`;
} else {
inputNama4.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama5) {
inputNama5.outerHTML = `<span class="underline">${inputValueNama5}</span>`;
} else {
inputNama5.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama6) {
inputNama6.outerHTML = `<span class="underline">${inputValueNama6}</span>`;
} else {
inputNama6.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
// Konversi tanggal dan ganti input date dengan format "1 Januari 2024"
if (inputTanggal1.value) {
var formattedTanggal1 = formatDate(inputTanggal1.value);
inputTanggal1.outerHTML = `<span>${formattedTanggal1}</span>`;
} else {
inputTanggal1.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal2.value) {
var formattedTanggal2 = formatDate(inputTanggal2.value);
inputTanggal2.outerHTML = `<span>${formattedTanggal2}</span>`;
} else {
inputTanggal2.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal3.value) {
var formattedTanggal3 = formatDate(inputTanggal3.value);
inputTanggal3.outerHTML = `<span>${formattedTanggal3}</span>`;
} else {
inputTanggal3.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal4.value) {
var formattedTanggal4 = formatDate(inputTanggal4.value);
inputTanggal4.outerHTML = `<span>${formattedTanggal4}</span>`;
} else {
inputTanggal4.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal5.value) {
var formattedTanggal5 = formatDate(inputTanggal5.value);
inputTanggal5.outerHTML = `<span>${formattedTanggal5}</span>`;
} else {
inputTanggal5.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal6.value) {
var formattedTanggal6 = formatDate(inputTanggal6.value);
inputTanggal6.outerHTML = `<span>${formattedTanggal6}</span>`;
} else {
inputTanggal6.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
// Cetak bagian tabel
window.print();
// Kembalikan input setelah selesai mencetak
document.body.innerHTML = originalContents;
}
function loadUserId() {
google.script.run.withSuccessHandler(function(userId) {
console.log('User ID:', userId);
document.getElementById("userIdDisplay").innerHTML = userId ? userId : "Guest";
// Periksa apakah pengguna adalah admin
google.script.run.withSuccessHandler(function(isAdmin) {
if (isAdmin) {
document.getElementById("sppdMenu").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu1").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu2").style.display = "block"; // Tampilkan menu
}
}).isUserAdmin(); // Panggil fungsi untuk memeriksa status admin
}).getUserId();
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!=includeHeader();?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
div.ex1 {
width: 800px;
margin: auto;
background-color: white;
padding: 20px;
}
@media print {
body * {
visibility: hidden;
}
#printableTable, #printableTable * {
visibility: visible;
}
#printableTable {
position: absolute;
left: 0;
top: 0;
}
.underline {
text-decoration: underline !important; /* Pastikan garis bawah muncul saat print */
}
}
::-webkit-input-placeholder {
text-align: center;
}
:-moz-placeholder {
text-align: center;
}
.print-button-container {
text-align: center;
margin-bottom: 20px; /* Jarak bawah tombol */
}
.print-button {
background-color: #007bff; /* Warna tombol */
color: white; /* Warna teks */
border: none; /* Tanpa border */
border-radius: 5px; /* Sudut melengkung */
padding: 10px 20px; /* Padding tombol */
font-size: 16px; /* Ukuran font */
cursor: pointer; /* Pointer saat hover */
transition: background-color 0.3s; /* Efek transisi */
}
.print-button:hover {
background-color: #0056b3; /* Warna tombol saat hover */
}
</style>
</head>
<body onload="loadUserId();">
<br>
<div class="print-button-container">
<button class="print-button" onclick="printTable()">Print Tabel</button>
</div>
<div class="ex1" id="printableTable">
<table>
<tr>
<td style="width: 54%;"> </td>
<td style="width: 15%;"> Lembar ke</td>
<td style="width: 1%;">: </td>
<td style="width: 30%;"> II </td>
</tr>
</table>
<table>
<tr>
<table style="width: 100%; border: 2px solid black; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px;">
<tbody>
<!--Baris1 -->
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 15%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px; text-align: center;">I.</td>
<td style="width: 15%; height: 10px; text-align: left;">Berangkat dari</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px; text-align: left;"><input type="text" id="berangkat1" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px; text-align: left;">(Tempat Kedudukan)</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; text-align: left;"><input type="text" id="kedudukan" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Ke</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="ke1" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Tanggal</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px;"><input type="date" id="tanggal1" class="form-control"></td>
</tr>
<tr style="height: 160px;">
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 26%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan1" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi1" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama1" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip1" class="form-control" placeholder="- - NIP - -"></td>
</tr>
<!--Baris2 -->
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; text-align: center;">II.</td>
<td style="width: 15%; height: 10px; text-align: left;">Tiba di</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"><input type="text" id="tiba2" class="form-control" placeholder="...."></td>
<td style="width: 5%; height: 10px; text-align: center;"></td>
<td style="width: 15%; height: 10px; text-align: left;">Berangkat dari</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="berangkat2" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada Tanggal</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"><input type="date" id="tanggal2" class="form-control"></td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px; text-align: left;">Ke</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="ke2" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada tanggal</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="date" id="tanggal3" class="form-control"></td>
</tr>
<tr style="height: 160px;">
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan2" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi2" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama2" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip2" class="form-control" placeholder="- - NIP - -"></td>
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan3" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi3" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama3" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip3" class="form-control" placeholder="- - NIP - -"></td>
</tr>
<!--Baris3 -->
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; text-align: center;">III.</td>
<td style="width: 15%; height: 10px; text-align: left;">Tiba di</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"><input type="text" id="tiba3" class="form-control" placeholder="...."></td>
<td style="width: 5%; height: 10px; text-align: center;"></td>
<td style="width: 15%; height: 10px; text-align: left;">Berangkat dari</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="berangkat3" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada Tanggal</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"><input type="date" id="tanggal4" class="form-control"></td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px; text-align: left;">Ke</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px;"><input type="text" id="ke3" class="form-control" placeholder="...."></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada tanggal</td>
<td style="width: 5%; height: 10px; ">:</td>
<td style="width: 26%; height: 10px;"><input type="date" id="tanggal5" class="form-control"></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 5%; height: 10px; "> </td>
<td style="width: 26%; height: 10px; "> </td>
</tr>
<tr style="height: 160px;">
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan4" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi4" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama4" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip4" class="form-control" placeholder="- - NIP - -"></td>
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan5" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi5" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama5" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip5" class="form-control" placeholder="- - NIP - -"></td>
</tr>
<!--Baris4 -->
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; text-align: center;">IV.</td>
<td style="width: 15%; height: 10px; text-align: left;">Tiba di</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black; text-align: left;"><input type="text" id="tiba4" class="form-control" placeholder="...."></td>
<td style="width: 5%; height: 10px; text-align: center;" colspan="4"></td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px; text-align: left;">Pada Tanggal</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black; text-align: left;"><input type="date" id="tanggal6" class="form-control"></td>
<td style="width: 5%; height: 10px; text-align: center;" colspan="4">Telah diperiksa dengan ketentuan bahwa perjalanan</td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px; text-align: center;" colspan="4">tersebut diatas perintahnya dan semata-mata untuk</td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 5%; height: 10px;"> </td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px; text-align: center;" colspan="4">kepentingan jabatan dalam waktu yang sesingkat-singkatnya.</td>
</tr>
<tr style="height: 160px;">
<td style="width: 5%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black; text-align: center; vertical-align: bottom; padding-bottom: 20px;" colspan="4"><input type="text" id="jabatan6" class="form-control" placeholder="- - Jabatan - -"><br><input type="text" id="instansi6" class="form-control" placeholder="- - Instansi - -"><br><br><br><input type="text" id="nama6" class="form-control" placeholder="- - Nama - -"><br><input type="text" id="nip6" class="form-control" placeholder="- - NIP - -"></td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 5%; height: 160px; border-bottom: 2px solid black;"> </td>
<td style="width: 26%; height: 160px; border-bottom: 2px solid black;"> </td>
</tr>
<tr style="height: 10px;">
<td style="width: 5%; height: 10px; "></td>
<td style="width: 15%; height: 10px; text-align: left;">Catatan Lain-Lain</td>
<td style="width: 5%; height: 10px;">:</td>
<td style="width: 26%; height: 10px; border-right: 2px solid black;"> </td>
<td style="width: 5%; height: 10px;"></td>
<td style="width: 15%; height: 10px;"></td>
<td style="width: 5%; height: 10px;"></td>
<td style="width: 26%; height: 10px;"></td>
</tr>
</tbody>
</table>
</div>
<script>
// Fungsi untuk mengonversi format tanggal ke "1 Januari 2024"
function formatDate(inputDate) {
const months = [
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
];
const date = new Date(inputDate);
const day = date.getDate();
const month = months[date.getMonth()]; // Mendapatkan nama bulan
const year = date.getFullYear();
return `${day} ${month} ${year}`;
}
function printTable() {
// Ambil nilai input
var inputBerangkat = document.getElementById('berangkat1');
var inputBerangkat2 = document.getElementById('berangkat2');
var inputBerangkat3 = document.getElementById('berangkat3');
var inputKedudukan = document.getElementById('kedudukan');
var inputKe1 = document.getElementById('ke1');
var inputKe2 = document.getElementById('ke2');
var inputKe3 = document.getElementById('ke3');
var inputTiba2 = document.getElementById('tiba2');
var inputTiba3 = document.getElementById('tiba3');
var inputTiba4 = document.getElementById('tiba4');
var inputJabatan1 = document.getElementById('jabatan1');
var inputJabatan2 = document.getElementById('jabatan2');
var inputJabatan3 = document.getElementById('jabatan3');
var inputJabatan4 = document.getElementById('jabatan4');
var inputJabatan5 = document.getElementById('jabatan5');
var inputJabatan6 = document.getElementById('jabatan6');
var inputInstansi1 = document.getElementById('instansi1');
var inputInstansi2 = document.getElementById('instansi2');
var inputInstansi3 = document.getElementById('instansi3');
var inputInstansi4 = document.getElementById('instansi4');
var inputInstansi5 = document.getElementById('instansi5');
var inputInstansi6 = document.getElementById('instansi6');
var inputNama1 = document.getElementById('nama1');
var inputNama2 = document.getElementById('nama2');
var inputNama3 = document.getElementById('nama3');
var inputNama4 = document.getElementById('nama4');
var inputNama5 = document.getElementById('nama5');
var inputNama6 = document.getElementById('nama6');
var inputNip1 = document.getElementById('nip1');
var inputNip2 = document.getElementById('nip2');
var inputNip3 = document.getElementById('nip3');
var inputNip4 = document.getElementById('nip4');
var inputNip5 = document.getElementById('nip5');
var inputNip6 = document.getElementById('nip6');
var inputTanggal1 = document.getElementById('tanggal1');
var inputTanggal2 = document.getElementById('tanggal2');
var inputTanggal3 = document.getElementById('tanggal3');
var inputTanggal4 = document.getElementById('tanggal4');
var inputTanggal5 = document.getElementById('tanggal5');
var inputTanggal6 = document.getElementById('tanggal6');
var inputValueBerangkat = inputBerangkat.value;
var inputValueBerangkat2 = inputBerangkat2.value;
var inputValueBerangkat3 = inputBerangkat3.value;
var inputValueKedudukan = inputKedudukan.value;
var inputValueKe1 = inputKe1.value;
var inputValueKe2 = inputKe2.value;
var inputValueKe3 = inputKe3.value;
var inputValueTiba2 = inputTiba2.value;
var inputValueTiba3 = inputTiba3.value;
var inputValueTiba4 = inputTiba4.value;
var inputValueJabatan1 = inputJabatan1.value;
var inputValueJabatan2 = inputJabatan2.value;
var inputValueJabatan3 = inputJabatan3.value;
var inputValueJabatan4 = inputJabatan4.value;
var inputValueJabatan5 = inputJabatan5.value;
var inputValueJabatan6 = inputJabatan6.value;
var inputValueInstansi1 = inputInstansi1.value;
var inputValueInstansi2 = inputInstansi2.value;
var inputValueInstansi3 = inputInstansi3.value;
var inputValueInstansi4 = inputInstansi4.value;
var inputValueInstansi5 = inputInstansi5.value;
var inputValueInstansi6 = inputInstansi6.value;
var inputValueNama1 = inputNama1.value;
var inputValueNama2 = inputNama2.value;
var inputValueNama3 = inputNama3.value;
var inputValueNama4 = inputNama4.value;
var inputValueNama5 = inputNama5.value;
var inputValueNama6 = inputNama6.value;
var inputValueNip1 = inputNip1.value;
var inputValueNip2 = inputNip2.value;
var inputValueNip3 = inputNip3.value;
var inputValueNip4 = inputNip4.value;
var inputValueNip5 = inputNip5.value;
var inputValueNip6 = inputNip6.value;
// Simpan nilai asli HTML dari tabel
var originalContents = document.body.innerHTML;
// Ganti input dengan teks sebelum mencetak
inputBerangkat.outerHTML = `<span>${inputValueBerangkat}</span>`;
inputBerangkat2.outerHTML = `<span>${inputValueBerangkat2}</span>`;
inputBerangkat3.outerHTML = `<span>${inputValueBerangkat3}</span>`;
inputKedudukan.outerHTML = `<span>${inputValueKedudukan}</span>`;
inputKe1.outerHTML = `<span>${inputValueKe1}</span>`;
inputKe2.outerHTML = `<span>${inputValueKe2}</span>`;
inputKe3.outerHTML = `<span>${inputValueKe3}</span>`;
inputTiba2.outerHTML = `<span>${inputValueTiba2}</span>`;
inputTiba3.outerHTML = `<span>${inputValueTiba3}</span>`;
inputTiba4.outerHTML = `<span>${inputValueTiba4}</span>`;
inputJabatan1.outerHTML = `<span>${inputValueJabatan1}</span>`;
inputJabatan2.outerHTML = `<span>${inputValueJabatan2}</span>`;
inputJabatan3.outerHTML = `<span>${inputValueJabatan3}</span>`;
inputJabatan4.outerHTML = `<span>${inputValueJabatan4}</span>`;
inputJabatan5.outerHTML = `<span>${inputValueJabatan5}</span>`;
inputJabatan6.outerHTML = `<span>${inputValueJabatan6}</span>`;
inputInstansi1.outerHTML = `<span>${inputValueInstansi1}</span>`;
inputInstansi2.outerHTML = `<span>${inputValueInstansi2}</span>`;
inputInstansi3.outerHTML = `<span>${inputValueInstansi3}</span>`;
inputInstansi4.outerHTML = `<span>${inputValueInstansi4}</span>`;
inputInstansi5.outerHTML = `<span>${inputValueInstansi5}</span>`;
inputInstansi6.outerHTML = `<span>${inputValueInstansi6}</span>`;
// Tambahkan awalan "NIP" untuk Nip, hanya jika diisi
if (inputValueNip1) {
inputNip1.outerHTML = `<span>NIP. ${inputValueNip1}</span>`;
} else {
inputNip1.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip2) {
inputNip2.outerHTML = `<span>NIP. ${inputValueNip2}</span>`;
} else {
inputNip2.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip3) {
inputNip3.outerHTML = `<span>NIP. ${inputValueNip3}</span>`;
} else {
inputNip3.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip4) {
inputNip4.outerHTML = `<span>NIP. ${inputValueNip4}</span>`;
} else {
inputNip4.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip5) {
inputNip5.outerHTML = `<span>NIP. ${inputValueNip5}</span>`;
} else {
inputNip5.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNip6) {
inputNip6.outerHTML = `<span>NIP. ${inputValueNip6}</span>`;
} else {
inputNip6.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
// Tambahkan garis bawah pada input "Nama"
if (inputValueNama1) {
inputNama1.outerHTML = `<span class="underline">${inputValueNama1}</span>`;
} else {
inputNama1.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama2) {
inputNama2.outerHTML = `<span class="underline">${inputValueNama2}</span>`;
} else {
inputNama2.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama3) {
inputNama3.outerHTML = `<span class="underline">${inputValueNama3}</span>`;
} else {
inputNama3.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama4) {
inputNama4.outerHTML = `<span class="underline">${inputValueNama4}</span>`;
} else {
inputNama4.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama5) {
inputNama5.outerHTML = `<span class="underline">${inputValueNama5}</span>`;
} else {
inputNama5.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputValueNama6) {
inputNama6.outerHTML = `<span class="underline">${inputValueNama6}</span>`;
} else {
inputNama6.outerHTML = `<span class="underline"></span>`; // Ganti dengan tanda hubung jika tidak diisi
}
// Konversi tanggal dan ganti input date dengan format "1 Januari 2024"
if (inputTanggal1.value) {
var formattedTanggal1 = formatDate(inputTanggal1.value);
inputTanggal1.outerHTML = `<span>${formattedTanggal1}</span>`;
} else {
inputTanggal1.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal2.value) {
var formattedTanggal2 = formatDate(inputTanggal2.value);
inputTanggal2.outerHTML = `<span>${formattedTanggal2}</span>`;
} else {
inputTanggal2.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal3.value) {
var formattedTanggal3 = formatDate(inputTanggal3.value);
inputTanggal3.outerHTML = `<span>${formattedTanggal3}</span>`;
} else {
inputTanggal3.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal4.value) {
var formattedTanggal4 = formatDate(inputTanggal4.value);
inputTanggal4.outerHTML = `<span>${formattedTanggal4}</span>`;
} else {
inputTanggal4.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal5.value) {
var formattedTanggal5 = formatDate(inputTanggal5.value);
inputTanggal5.outerHTML = `<span>${formattedTanggal5}</span>`;
} else {
inputTanggal5.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
if (inputTanggal6.value) {
var formattedTanggal6 = formatDate(inputTanggal6.value);
inputTanggal6.outerHTML = `<span>${formattedTanggal6}</span>`;
} else {
inputTanggal6.outerHTML = `<span> </span>`; // Ganti dengan tanda hubung jika tidak diisi
}
// Cetak bagian tabel
window.print();
// Kembalikan input setelah selesai mencetak
document.body.innerHTML = originalContents;
}
function loadUserId() {
google.script.run.withSuccessHandler(function(userId) {
console.log('User ID:', userId);
document.getElementById("userIdDisplay").innerHTML = userId ? userId : "Guest";
// Periksa apakah pengguna adalah admin
google.script.run.withSuccessHandler(function(isAdmin) {
if (isAdmin) {
document.getElementById("sppdMenu").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu1").style.display = "block"; // Tampilkan menu
document.getElementById("sppdMenu2").style.display = "block"; // Tampilkan menu
}
}).isUserAdmin(); // Panggil fungsi untuk memeriksa status admin
}).getUserId();
}
</script>
</body>
</html>
13. Untuk script datapegawai.html, tandatangan.html, rekeningbelanja.html dan visit.html sudah include juga di dalam file.
14. Klik ikon Save.
15. Klik tombol Terapkan/Deploy lalu pilih Deployment baru/New deployment.
16. Pastikan jenisnya adalah Aplikasi web, hak aksesnya adalah Siapa saja/Anyone lalu pilih Terapkan/Deploy.
17. Apabila membutuh otorisasai/perijinan akses tutorial ada di dalam video.
18. Silahkan klik URL atau salin URL yang sudah di deploy.
Selesai!!!