#JP98 Website SPPD Online Menggunakan Apps Script

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
}


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;
}


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]
    }));
}


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>


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">&times;</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%;">&nbsp;</td>
         <td style="width: 15%;">&nbsp;Lembar ke</td>
         <td style="width: 1%;">:&nbsp;</td>
         <td style="width: 30%;">&nbsp;</td>
         </tr>
         <tr>
         <td style="width: 54%;">&nbsp;</td>
         <td style="width: 15%;">&nbsp;Kode No.</td>
         <td style="width: 1%;">:&nbsp;</td>
         <td style="width: 30%;">&nbsp;</td>
         </tr>
         <tr>
         <td style="width: 54%;">&nbsp;</td>
         <td style="width: 15%;">&nbsp;Nomor</td>
         <td style="width: 1%;">:&nbsp;</td>
         <td style="width: 30%;">${item.commonData['Nomor SPPD']}&nbsp;</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%;">&nbsp;</td>
         <td style="width: 15%;">&nbsp;Lembar ke</td>
         <td style="width: 1%;">:&nbsp;</td>
         <td style="width: 30%;"> I&nbsp;</td>
         </tr>
         <tr>
         <td style="width: 54%;">&nbsp;</td>
         <td style="width: 15%;">&nbsp;Nomor</td>
         <td style="width: 1%;">:&nbsp;</td>
         <td style="width: 30%;">${item.nomorsppd}&nbsp;</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">&times;</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">&times;</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%;">&nbsp;</td>
               <td style="width: 15%;">&nbsp;Lembar ke</td>
               <td style="width: 1%;">:&nbsp;</td>
               <td style="width: 30%;"> II&nbsp;</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;">&nbsp;</td>
                     <td style="width: 15%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 26%; height: 10px; border-right: 2px solid black;">&nbsp;</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; ">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 26%; height: 10px; border-right: 2px solid black;">&nbsp;</td>
                     <td style="width: 5%; height: 10px; ">&nbsp;</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;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 26%; height: 10px; border-right: 2px solid black;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</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;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 26%; height: 10px; border-right: 2px solid black;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</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;">&nbsp;</td>
                     <td style="width: 5%; height: 160px; border-bottom: 2px solid black;">&nbsp;</td>
                     <td style="width: 5%; height: 160px; border-bottom: 2px solid black;">&nbsp;</td>
                     <td style="width: 26%; height: 160px; border-right: 2px solid black; border-bottom: 2px solid black;">&nbsp;</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;">&nbsp;</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; ">&nbsp;</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;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 26%; height: 10px; border-right: 2px solid black;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</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;">&nbsp;</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; ">&nbsp;</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;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 26%; height: 10px; border-right: 2px solid black;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</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;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 26%; height: 10px; border-right: 2px solid black;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px; ">&nbsp;</td>
                     <td style="width: 5%; height: 10px; ">&nbsp;</td>
                     <td style="width: 26%; height: 10px; ">&nbsp;</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;">&nbsp;</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;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 26%; height: 10px; border-right: 2px solid black;">&nbsp;</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;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 5%; height: 10px;">&nbsp;</td>
                     <td style="width: 26%; height: 10px; border-right: 2px solid black;">&nbsp;</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;">&nbsp;</td>
                     <td style="width: 5%; height: 160px; border-bottom: 2px solid black;">&nbsp;</td>
                     <td style="width: 5%; height: 160px; border-bottom: 2px solid black;">&nbsp;</td>
                     <td style="width: 26%; height: 160px; border-bottom: 2px solid black;">&nbsp;</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;">&nbsp;</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!!!








Previous Post Next Post

Promo