#JP100 Website Membuat Pengantar SPM SIPD-RI Otomatis Menggunakan Google Apps Script (CRUD, Print PDF)

Website Pengantar SPM SIPD-RI Otomatis Menggunakan Google Apps Script mekanisme Create, Read, Update Delete (CRUD) dan Print PDF



1. Copy Spreadsheet (Klik Disini)


2. Copy Template

(Template ini yang akan terisi data dari website dan menjadi PDF untuk di print, silahkan edit/sesuaikan dengan kebutuhan)



3. Pada Google Drive buatlah beberapa folder untuk menyimpan masing-masing berkas.
  • Folder Berkas LS REKANAN
  • Folder Berkas LS GAJI
  • Folder Berkas LS SPPD
  • Folder Berkas LSHONOR
  • Folder Berkas GU SPPD
  • Folder Berkas GU BERJAS
  • Folder Berkas UP


4. Kembali ke Spreadsheet, pada Spreadsheet ini terdapat beberapa sheet yang sebagai database agar menampung data dari website Pengantar SPM SIPD-RI.

  • Sheet login
  • Sheet LS REKANAN
  • Sheet LS GAJI
  • Sheet LS SPPD
  • Sheet LS HONOR
  • Sheet GU SPPD
  • Sheet GU BARJAS
  • Sheet KAS TUNAI
  • Sheet LAPORAN
  • dan lain-lain


5. Buatlah lembar kerja Apps Script dengan cara menu Ekstensi/Extensions lalu pilih Apps Script.


6. Pada lembar kerja Apps Script terdapat beberapa file default diantaranya:
  • Code.gs
  • CodeLSREKANAN.gs
  • CodeLSGAJI.gs
  • CodeLSSPPD.gs
  • CodeLSHONOR.gs
  • CodeGUSPPD.gs
  • CodeGUBARJAS.gs
  • dan lain-lain

7. Copy 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
    setSession(sess);
    return 'success';
  } else {
    return 'failure';
  }
}

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, REGISTER


8. Copy dan pastekan script di bawah ini ke CodeLSREKANAN.gs

Masukkan Password Untuk Melihat Script (Password sama dengan di atas)

const slideTemplateIdrekanan = 'GANTI_ID_TEMPLATE_LS_REKANAN'; // Ganti dengan ID Google Slides Anda
const folderIdrekanan = 'GANTI_ID_FOLDER_LS_REKANAN'; // Ganti dengan ID Folder tujuan di Google Drive

//Source Code by www.javabitpro.com

function formatDateToIndonesian(date) {
  const bulanIndonesia = [
    'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
    'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
  ];
  
  const tanggal = date.getDate();
  const bulan = bulanIndonesia[date.getMonth()]; // Ambil nama bulan sesuai indeks
  const tahun = date.getFullYear();
  
  return `${tanggal} ${bulan} ${tahun}`; // Format "dd mmmm yyyy"
}

function getJenisData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getKategoriData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getRekananData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Rekanan');
  const data = sheet.getRange('A1:G' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getPeraturanData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Peraturan');
  const data = sheet.getRange('A1:B' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getNamaData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Bidang');
  const data = sheet.getRange('A2:A' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getAtasanInfo(jenis) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === jenis); // Mencocokkan jenis
  return result;
}

function getKategoriInfo(kategori) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === kategori); // Mencocokkan jenis
  return result;
}

function getRekananInfo(rekanan) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Rekanan');
  const data = sheet.getRange('A1:G' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === rekanan); // Mencocokkan jenis
  return result;
}

function getPeraturanInfo(peraturan) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Peraturan');
  const data = sheet.getRange('A1:B' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === peraturan); // Mencocokkan jenis
  return result;
}


function saveDataAndGeneratePDF(data) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS REKANAN');
  
  // Simpan data ke spreadsheet dengan Nomor sebagai teks (tambahkan tanda kutip)
  const nomor = "'" + data.Nomor; // Menyimpan sebagai teks
  sheet.appendRow([nomor, data.Nama, data.Alamat, data.TanggalSpm, data.Tahun, data.Jenis, data.NamaAtasan, data.NIPAtasan, data.GolonganAtasan, data.Currency, data.Huruf, data.Kategori, data.NamaKategori, data.NipKategori, data.GolonganKategori, data.Rekanan, data.NamaRekanan, data.BankRekanan, data.RekeningRekanan, data.NpwpRekanan, data.TelpRekanan, data.AlamatRekanan, data.Peraturan, data.NamaDPA, data.KodeKegiatan, data.Adendum, data.TanggalAdendum, data.PerihalAdendum, data.Pembayaran, data.Kualifikasi, data.SuratPerjanjian, data.Angsuran, data.Spmk, data.BatasAkhir, data.PenyerahanFisik, data.Denda]);

  // Format tanggal spm menjadi "dd mmmm yyyy" dalam bahasa Indonesia
  const tanggalSpm = new Date(data.TanggalSpm);
  const tanggalSpmFormatted = formatDateToIndonesian(tanggalSpm);
  
  // Load template Google Slides
  const slideTemplate = DriveApp.getFileById(slideTemplateIdrekanan);
  const folder = DriveApp.getFolderById(folderIdrekanan);

// Salin template dan isi data
const slideCopy = slideTemplate.makeCopy(`Generated - ${data.Nomor}`, folder);
const slide = SlidesApp.openById(slideCopy.getId());
const slides = slide.getSlides(); // Mendapatkan semua slide

// Iterasi melalui semua slide
slides.forEach(slideBody => {
  slideBody.replaceAllText('{Nomor SPM}', data.Nomor);
  slideBody.replaceAllText('{Nama}', data.Nama);
  slideBody.replaceAllText('{Alamat}', data.Alamat);
  slideBody.replaceAllText('{Tanggal Spm}', tanggalSpmFormatted); // Gunakan format baru
  slideBody.replaceAllText('{Tahun}', data.Tahun);
  slideBody.replaceAllText('{Jenis}', data.Jenis);
  slideBody.replaceAllText('{Nama Atasan}', data.NamaAtasan);
  slideBody.replaceAllText('{NIP Atasan}', data.NIPAtasan);
  slideBody.replaceAllText('{Golongan Atasan}', data.GolonganAtasan);
  slideBody.replaceAllText('{Currency}', data.Currency);
  slideBody.replaceAllText('{Huruf}', data.Huruf);
  slideBody.replaceAllText('{Kategori}', data.Kategori);
  slideBody.replaceAllText('{Nama Kategori}', data.NamaKategori);
  slideBody.replaceAllText('{Nip Kategori}', data.NipKategori);
  slideBody.replaceAllText('{Golongan Kategori}', data.GolonganKategori);
  slideBody.replaceAllText('{Rekanan}', data.Rekanan);
  slideBody.replaceAllText('{Nama Rekanan}', data.NamaRekanan);
  slideBody.replaceAllText('{Bank Rekanan}', data.BankRekanan);
  slideBody.replaceAllText('{Rekening Rekanan}', data.RekeningRekanan);
  slideBody.replaceAllText('{Npwp Rekanan}', data.NpwpRekanan);
  slideBody.replaceAllText('{Telp Rekanan}', data.TelpRekanan);
  slideBody.replaceAllText('{Alamat Rekanan}', data.AlamatRekanan);
  slideBody.replaceAllText('{Peraturan}', data.Peraturan);
  slideBody.replaceAllText('{Nama DPA}', data.NamaDPA);
  slideBody.replaceAllText('{KodeKegiatan}', data.KodeKegiatan);
  slideBody.replaceAllText('{Adendum}', data.Adendum);
  slideBody.replaceAllText('{TanggalAdendum}', data.TanggalAdendum);
  slideBody.replaceAllText('{PerihalAdendum}', data.PerihalAdendum);
  slideBody.replaceAllText('{Pembayaran}', data.Pembayaran);
  slideBody.replaceAllText('{Kualifikasi}', data.Kualifikasi);
  slideBody.replaceAllText('{SuratPerjanjian}', data.SuratPerjanjian);
  slideBody.replaceAllText('{Angsuran}', data.Angsuran);
  slideBody.replaceAllText('{Spmk}', data.Spmk);
  slideBody.replaceAllText('{BatasAkhir}', data.BatasAkhir);
  slideBody.replaceAllText('{PenyerahanFisik}', data.PenyerahanFisik);
  slideBody.replaceAllText('{Denda}', data.Denda);
});

slide.saveAndClose();

  // Export ke PDF
  const pdfFile = DriveApp.getFileById(slideCopy.getId()).getAs('application/pdf');
  const pdf = folder.createFile(pdfFile).setName(`PDF-${data.Nomor}.pdf`);

  // Hapus salinan Slide setelah PDF dibuat
  slideCopy.setTrashed(true);

  return pdf.getUrl();
}


function getLSData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS REKANAN');
  const data = sheet.getDataRange().getValues(); // Ambil semua data
  const headers = data.shift(); // Buang header

  // Format tanggal menjadi string jika bertipe Date
  const formatDateToString = (value) => {
    if (value instanceof Date) {
      const bulanIndonesia = [
        'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
        'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
      ];
      const tanggal = value.getDate();
      const bulan = bulanIndonesia[value.getMonth()];
      const tahun = value.getFullYear();
      return `${tanggal} ${bulan} ${tahun}`;
    }
    return value; // Jika bukan Date, kembalikan nilai asli
  };

  // Ambil semua file PDF di folder
  const folder = DriveApp.getFolderById(folderIdrekanan);
  const files = folder.getFiles();
  const pdfLinks = {};

  // Buat mapping Nomor ke URL PDF
  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName(); // Contoh nama file: "PDF-1234.pdf"
    const nomorMatch = fileName.match(/PDF-(\d+)\.pdf/); // Ekstrak Nomor
    if (nomorMatch) {
      pdfLinks[nomorMatch[1]] = file.getUrl(); // Simpan URL berdasarkan Nomor
    }
  }

  // Tambahkan link PDF ke setiap baris data
  const result = data.map(row => {
    const formattedRow = row.map(cell => formatDateToString(cell)); // Format setiap kolom
    const nomor = formattedRow[0]; // Asumsikan kolom Nomor ada di indeks 0
    const pdfUrl = pdfLinks[nomor] || ''; // Cari URL berdasarkan Nomor
    return [...formattedRow, pdfUrl]; // Tambahkan URL ke data
  });

  return result;
}

function deleteLSData(nomor) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS REKANAN');
  const data = sheet.getDataRange().getValues();
  
  // Temukan baris berdasarkan Nomor
  const rowIndex = data.findIndex(row => row[0] === nomor);
  if (rowIndex > -1) {
    sheet.deleteRow(rowIndex + 1); // Tambahkan 1 karena indeks data 0-based, sedangkan Spreadsheet 1-based
  }

  // Hapus file PDF terkait dari folder
  const folder = DriveApp.getFolderById(folderIdrekanan);
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName();
    if (fileName === `PDF-${nomor}.pdf`) {
      file.setTrashed(true); // Hapus file
      break;
    }
  }

  return `Data dengan Nomor ${nomor} berhasil dihapus.`;
}



9. Copy dan pastekan script di bawah ini ke CodeLSGAJI.gs


Masukkan Password Untuk Melihat Script (Password sama dengan di atas)

const slideTemplateIdgaji = 'GANTI_ID_TEMPLATE_LS_GAJI'; // Ganti dengan ID Google Slides Anda
const folderIdgaji = 'GANTI_ID_FOLDER_LS_REKANAN'; // Ganti dengan ID Folder tujuan di Google Drive

//Source Code by www.javabitpro.com

function formatDateToIndonesiangaji(date) {
  const bulanIndonesia = [
    'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
    'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
  ];
  
  const tanggal = date.getDate();
  const bulan = bulanIndonesia[date.getMonth()]; // Ambil nama bulan sesuai indeks
  const tahun = date.getFullYear();
  
  return `${tanggal} ${bulan} ${tahun}`; // Format "dd mmmm yyyy"
}
function getJenisDatagaji() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getKategoriDatagaji() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}
function getAtasanInfogaji(jenis) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === jenis); // Mencocokkan jenis
  return result;
}

function getKategoriInfogaji(kategori) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === kategori); // Mencocokkan jenis
  return result;
}



function saveDataAndGeneratePDFgaji(data) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS GAJI');
  
  // Simpan data ke spreadsheet dengan Nomor sebagai teks (tambahkan tanda kutip)
  const nomor = "'" + data.Nomor; // Menyimpan sebagai teks
  sheet.appendRow([nomor, data.Nama, data.Alamat, data.TanggalSpm, data.Tahun, data.Jenis, data.NamaAtasan, data.NIPAtasan, data.GolonganAtasan, data.Currency, data.Huruf, data.Kategori, data.NamaKategori, data.NipKategori, data.GolonganKategori, data.Rekanan, data.NamaRekanan, data.BankRekanan, data.RekeningRekanan, data.NpwpRekanan, data.TelpRekanan, data.AlamatRekanan, data.Peraturan, data.NamaDPA, data.Pembayaran]);

  // Format tanggal spm menjadi "dd mmmm yyyy" dalam bahasa Indonesia
  const tanggalSpm = new Date(data.TanggalSpm);
  const tanggalSpmFormatted = formatDateToIndonesian(tanggalSpm);
  
  // Load template Google Slides
  const slideTemplate = DriveApp.getFileById(slideTemplateIdgaji);
  const folder = DriveApp.getFolderById(folderIdgaji);

// Salin template dan isi data
const slideCopy = slideTemplate.makeCopy(`Generated - ${data.Nomor}`, folder);
const slide = SlidesApp.openById(slideCopy.getId());
const slides = slide.getSlides(); // Mendapatkan semua slide

// Iterasi melalui semua slide
slides.forEach(slideBody => {
  slideBody.replaceAllText('{Nomor SPM}', data.Nomor);
  slideBody.replaceAllText('{Nama}', data.Nama);
  slideBody.replaceAllText('{Alamat}', data.Alamat);
  slideBody.replaceAllText('{Tanggal Spm}', tanggalSpmFormatted); // Gunakan format baru
  slideBody.replaceAllText('{Tahun}', data.Tahun);
  slideBody.replaceAllText('{Jenis}', data.Jenis);
  slideBody.replaceAllText('{Nama Atasan}', data.NamaAtasan);
  slideBody.replaceAllText('{NIP Atasan}', data.NIPAtasan);
  slideBody.replaceAllText('{Golongan Atasan}', data.GolonganAtasan);
  slideBody.replaceAllText('{Currency}', data.Currency);
  slideBody.replaceAllText('{Huruf}', data.Huruf);
  slideBody.replaceAllText('{Kategori}', data.Kategori);
  slideBody.replaceAllText('{Nama Kategori}', data.NamaKategori);
  slideBody.replaceAllText('{Nip Kategori}', data.NipKategori);
  slideBody.replaceAllText('{Golongan Kategori}', data.GolonganKategori);
  slideBody.replaceAllText('{Rekanan}', data.Rekanan);
  slideBody.replaceAllText('{Nama Rekanan}', data.NamaRekanan);
  slideBody.replaceAllText('{Bank Rekanan}', data.BankRekanan);
  slideBody.replaceAllText('{Rekening Rekanan}', data.RekeningRekanan);
  slideBody.replaceAllText('{Npwp Rekanan}', data.NpwpRekanan);
  slideBody.replaceAllText('{Telp Rekanan}', data.TelpRekanan);
  slideBody.replaceAllText('{Alamat Rekanan}', data.AlamatRekanan);
  slideBody.replaceAllText('{Peraturan}', data.Peraturan);
  slideBody.replaceAllText('{Nama DPA}', data.NamaDPA);
});

slide.saveAndClose();

  // Export ke PDF
  const pdfFile = DriveApp.getFileById(slideCopy.getId()).getAs('application/pdf');
  const pdf = folder.createFile(pdfFile).setName(`PDF-${data.Nomor}.pdf`);

  // Hapus salinan Slide setelah PDF dibuat
  slideCopy.setTrashed(true);

  return pdf.getUrl();
}


function getLSDatagaji() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS GAJI');
  const data = sheet.getDataRange().getValues(); // Ambil semua data
  const headers = data.shift(); // Buang header

  // Format tanggal menjadi string jika bertipe Date
  const formatDateToString = (value) => {
    if (value instanceof Date) {
      const bulanIndonesia = [
        'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
        'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
      ];
      const tanggal = value.getDate();
      const bulan = bulanIndonesia[value.getMonth()];
      const tahun = value.getFullYear();
      return `${tanggal} ${bulan} ${tahun}`;
    }
    return value; // Jika bukan Date, kembalikan nilai asli
  };

  // Ambil semua file PDF di folder
  const folder = DriveApp.getFolderById(folderIdgaji);
  const files = folder.getFiles();
  const pdfLinks = {};

  // Buat mapping Nomor ke URL PDF
  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName(); // Contoh nama file: "PDF-1234.pdf"
    const nomorMatch = fileName.match(/PDF-(\d+)\.pdf/); // Ekstrak Nomor
    if (nomorMatch) {
      pdfLinks[nomorMatch[1]] = file.getUrl(); // Simpan URL berdasarkan Nomor
    }
  }

  // Tambahkan link PDF ke setiap baris data
  const result = data.map(row => {
    const formattedRow = row.map(cell => formatDateToString(cell)); // Format setiap kolom
    const nomor = formattedRow[0]; // Asumsikan kolom Nomor ada di indeks 0
    const pdfUrl = pdfLinks[nomor] || ''; // Cari URL berdasarkan Nomor
    return [...formattedRow, pdfUrl]; // Tambahkan URL ke data
  });

  return result;
}

function deleteLSDatagaji(nomor) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS GAJI');
  const data = sheet.getDataRange().getValues();
  
  // Temukan baris berdasarkan Nomor
  const rowIndex = data.findIndex(row => row[0] === nomor);
  if (rowIndex > -1) {
    sheet.deleteRow(rowIndex + 1); // Tambahkan 1 karena indeks data 0-based, sedangkan Spreadsheet 1-based
  }

  // Hapus file PDF terkait dari folder
  const folder = DriveApp.getFolderById(folderIdgaji);
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName();
    if (fileName === `PDF-${nomor}.pdf`) {
      file.setTrashed(true); // Hapus file
      break;
    }
  }

  return `Data dengan Nomor ${nomor} berhasil dihapus.`;
}



10. Copy dan pastekan script di bawah ini ke CodeLSSPPD.gs

Masukkan Password Untuk Melihat Script (Password sama dengan di atas)

const slideTemplateIdsppd = 'GANTI_ID_TEMPLATE_LS_SPPD'; // Ganti dengan ID Google Slides Anda
const folderIdsppd = 'GANTI_ID_FOLDER_LS_SPPD'; // Ganti dengan ID Folder tujuan di Google Drive

//Source Code by www.javabitpro.com

function formatDateToIndonesiansppd(date) {
  const bulanIndonesia = [
    'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
    'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
  ];
  
  const tanggal = date.getDate();
  const bulan = bulanIndonesia[date.getMonth()]; // Ambil nama bulan sesuai indeks
  const tahun = date.getFullYear();
  
  return `${tanggal} ${bulan} ${tahun}`; // Format "dd mmmm yyyy"
}
function getJenisDatasppd() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getKategoriDatasppd() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}
function getAtasanInfosppd(jenis) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === jenis); // Mencocokkan jenis
  return result;
}

function getKategoriInfosppd(kategori) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === kategori); // Mencocokkan jenis
  return result;
}




function saveDataAndGeneratePDFsppd(data) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS SPPD');
  
  // Simpan data ke spreadsheet dengan Nomor sebagai teks (tambahkan tanda kutip)
  const nomor = "'" + data.Nomor; // Menyimpan sebagai teks
  sheet.appendRow([nomor, data.Nama, data.Alamat, data.TanggalSpm, data.Tahun, data.Jenis, data.NamaAtasan, data.NIPAtasan, data.GolonganAtasan, data.Currency, data.Huruf, data.Kategori, data.NamaKategori, data.NipKategori, data.GolonganKategori, data.Rekanan, data.NamaRekanan, data.BankRekanan, data.RekeningRekanan, data.NpwpRekanan, data.TelpRekanan, data.AlamatRekanan, data.Peraturan, data.NamaDPA, data.Pembayaran]);

  // Format tanggal spm menjadi "dd mmmm yyyy" dalam bahasa Indonesia
  const tanggalSpm = new Date(data.TanggalSpm);
  const tanggalSpmFormatted = formatDateToIndonesian(tanggalSpm);
  
  // Load template Google Slides
  const slideTemplate = DriveApp.getFileById(slideTemplateIdsppd);
  const folder = DriveApp.getFolderById(folderIdsppd);

// Salin template dan isi data
const slideCopy = slideTemplate.makeCopy(`Generated - ${data.Nomor}`, folder);
const slide = SlidesApp.openById(slideCopy.getId());
const slides = slide.getSlides(); // Mendapatkan semua slide

// Iterasi melalui semua slide
slides.forEach(slideBody => {
  slideBody.replaceAllText('{Nomor SPM}', data.Nomor);
  slideBody.replaceAllText('{Nama}', data.Nama);
  slideBody.replaceAllText('{Alamat}', data.Alamat);
  slideBody.replaceAllText('{Tanggal Spm}', tanggalSpmFormatted); // Gunakan format baru
  slideBody.replaceAllText('{Tahun}', data.Tahun);
  slideBody.replaceAllText('{Jenis}', data.Jenis);
  slideBody.replaceAllText('{Nama Atasan}', data.NamaAtasan);
  slideBody.replaceAllText('{NIP Atasan}', data.NIPAtasan);
  slideBody.replaceAllText('{Golongan Atasan}', data.GolonganAtasan);
  slideBody.replaceAllText('{Currency}', data.Currency);
  slideBody.replaceAllText('{Huruf}', data.Huruf);
  slideBody.replaceAllText('{Kategori}', data.Kategori);
  slideBody.replaceAllText('{Nama Kategori}', data.NamaKategori);
  slideBody.replaceAllText('{Nip Kategori}', data.NipKategori);
  slideBody.replaceAllText('{Golongan Kategori}', data.GolonganKategori);
  slideBody.replaceAllText('{Rekanan}', data.Rekanan);
  slideBody.replaceAllText('{Nama Rekanan}', data.NamaRekanan);
  slideBody.replaceAllText('{Bank Rekanan}', data.BankRekanan);
  slideBody.replaceAllText('{Rekening Rekanan}', data.RekeningRekanan);
  slideBody.replaceAllText('{Npwp Rekanan}', data.NpwpRekanan);
  slideBody.replaceAllText('{Telp Rekanan}', data.TelpRekanan);
  slideBody.replaceAllText('{Alamat Rekanan}', data.AlamatRekanan);
  slideBody.replaceAllText('{Peraturan}', data.Peraturan);
  slideBody.replaceAllText('{Nama DPA}', data.NamaDPA);
});

slide.saveAndClose();

  // Export ke PDF
  const pdfFile = DriveApp.getFileById(slideCopy.getId()).getAs('application/pdf');
  const pdf = folder.createFile(pdfFile).setName(`PDF-${data.Nomor}.pdf`);

  // Hapus salinan Slide setelah PDF dibuat
  slideCopy.setTrashed(true);

  return pdf.getUrl();
}


function getLSDatasppd() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS SPPD');
  const data = sheet.getDataRange().getValues(); // Ambil semua data
  const headers = data.shift(); // Buang header

  // Format tanggal menjadi string jika bertipe Date
  const formatDateToString = (value) => {
    if (value instanceof Date) {
      const bulanIndonesia = [
        'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
        'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
      ];
      const tanggal = value.getDate();
      const bulan = bulanIndonesia[value.getMonth()];
      const tahun = value.getFullYear();
      return `${tanggal} ${bulan} ${tahun}`;
    }
    return value; // Jika bukan Date, kembalikan nilai asli
  };

  // Ambil semua file PDF di folder
  const folder = DriveApp.getFolderById(folderIdsppd);
  const files = folder.getFiles();
  const pdfLinks = {};

  // Buat mapping Nomor ke URL PDF
  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName(); // Contoh nama file: "PDF-1234.pdf"
    const nomorMatch = fileName.match(/PDF-(\d+)\.pdf/); // Ekstrak Nomor
    if (nomorMatch) {
      pdfLinks[nomorMatch[1]] = file.getUrl(); // Simpan URL berdasarkan Nomor
    }
  }

  // Tambahkan link PDF ke setiap baris data
  const result = data.map(row => {
    const formattedRow = row.map(cell => formatDateToString(cell)); // Format setiap kolom
    const nomor = formattedRow[0]; // Asumsikan kolom Nomor ada di indeks 0
    const pdfUrl = pdfLinks[nomor] || ''; // Cari URL berdasarkan Nomor
    return [...formattedRow, pdfUrl]; // Tambahkan URL ke data
  });

  return result;
}

function deleteLSDatasppd(nomor) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS SPPD');
  const data = sheet.getDataRange().getValues();
  
  // Temukan baris berdasarkan Nomor
  const rowIndex = data.findIndex(row => row[0] === nomor);
  if (rowIndex > -1) {
    sheet.deleteRow(rowIndex + 1); // Tambahkan 1 karena indeks data 0-based, sedangkan Spreadsheet 1-based
  }

  // Hapus file PDF terkait dari folder
  const folder = DriveApp.getFolderById(folderIdsppd);
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName();
    if (fileName === `PDF-${nomor}.pdf`) {
      file.setTrashed(true); // Hapus file
      break;
    }
  }

  return `Data dengan Nomor ${nomor} berhasil dihapus.`;
}




11. Copy dan pastekan script di bawah ini ke CodeLSHONOR.gs

Masukkan Password Untuk Melihat Script (Password sama dengan di atas)

const slideTemplateIdhonor = 'GANTI_ID_TEMPLATE_LS_HONOR'; // Ganti dengan ID Google Slides Anda
const folderIdhonor = 'GANTI_ID_FOLDER_LS_HONOR'; // Ganti dengan ID Folder tujuan di Google Drive

//Source Code by www.javabitpro.com

function formatDateToIndonesianhonor(date) {
  const bulanIndonesia = [
    'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
    'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
  ];
  
  const tanggal = date.getDate();
  const bulan = bulanIndonesia[date.getMonth()]; // Ambil nama bulan sesuai indeks
  const tahun = date.getFullYear();
  
  return `${tanggal} ${bulan} ${tahun}`; // Format "dd mmmm yyyy"
}
function getJenisDatahonor() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getKategoriDatahonor() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}
function getAtasanInfohonor(jenis) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === jenis); // Mencocokkan jenis
  return result;
}

function getKategoriInfohonor(kategori) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === kategori); // Mencocokkan jenis
  return result;
}




function saveDataAndGeneratePDFhonor(data) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS HONOR');
  
  // Simpan data ke spreadsheet dengan Nomor sebagai teks (tambahkan tanda kutip)
  const nomor = "'" + data.Nomor; // Menyimpan sebagai teks
  sheet.appendRow([nomor, data.Nama, data.Alamat, data.TanggalSpm, data.Tahun, data.Jenis, data.NamaAtasan, data.NIPAtasan, data.GolonganAtasan, data.Currency, data.Huruf, data.Kategori, data.NamaKategori, data.NipKategori, data.GolonganKategori, data.Rekanan, data.NamaRekanan, data.BankRekanan, data.RekeningRekanan, data.NpwpRekanan, data.TelpRekanan, data.AlamatRekanan, data.Peraturan, data.NamaDPA, data.Pembayaran]);

  // Format tanggal spm menjadi "dd mmmm yyyy" dalam bahasa Indonesia
  const tanggalSpm = new Date(data.TanggalSpm);
  const tanggalSpmFormatted = formatDateToIndonesian(tanggalSpm);
  
  // Load template Google Slides
  const slideTemplate = DriveApp.getFileById(slideTemplateIdhonor);
  const folder = DriveApp.getFolderById(folderIdhonor);

// Salin template dan isi data
const slideCopy = slideTemplate.makeCopy(`Generated - ${data.Nomor}`, folder);
const slide = SlidesApp.openById(slideCopy.getId());
const slides = slide.getSlides(); // Mendapatkan semua slide

// Iterasi melalui semua slide
slides.forEach(slideBody => {
  slideBody.replaceAllText('{Nomor SPM}', data.Nomor);
  slideBody.replaceAllText('{Nama}', data.Nama);
  slideBody.replaceAllText('{Alamat}', data.Alamat);
  slideBody.replaceAllText('{Tanggal Spm}', tanggalSpmFormatted); // Gunakan format baru
  slideBody.replaceAllText('{Tahun}', data.Tahun);
  slideBody.replaceAllText('{Jenis}', data.Jenis);
  slideBody.replaceAllText('{Nama Atasan}', data.NamaAtasan);
  slideBody.replaceAllText('{NIP Atasan}', data.NIPAtasan);
  slideBody.replaceAllText('{Golongan Atasan}', data.GolonganAtasan);
  slideBody.replaceAllText('{Currency}', data.Currency);
  slideBody.replaceAllText('{Huruf}', data.Huruf);
  slideBody.replaceAllText('{Kategori}', data.Kategori);
  slideBody.replaceAllText('{Nama Kategori}', data.NamaKategori);
  slideBody.replaceAllText('{Nip Kategori}', data.NipKategori);
  slideBody.replaceAllText('{Golongan Kategori}', data.GolonganKategori);
  slideBody.replaceAllText('{Rekanan}', data.Rekanan);
  slideBody.replaceAllText('{Nama Rekanan}', data.NamaRekanan);
  slideBody.replaceAllText('{Bank Rekanan}', data.BankRekanan);
  slideBody.replaceAllText('{Rekening Rekanan}', data.RekeningRekanan);
  slideBody.replaceAllText('{Npwp Rekanan}', data.NpwpRekanan);
  slideBody.replaceAllText('{Telp Rekanan}', data.TelpRekanan);
  slideBody.replaceAllText('{Alamat Rekanan}', data.AlamatRekanan);
  slideBody.replaceAllText('{Peraturan}', data.Peraturan);
  slideBody.replaceAllText('{Nama DPA}', data.NamaDPA);
});

slide.saveAndClose();

  // Export ke PDF
  const pdfFile = DriveApp.getFileById(slideCopy.getId()).getAs('application/pdf');
  const pdf = folder.createFile(pdfFile).setName(`PDF-${data.Nomor}.pdf`);

  // Hapus salinan Slide setelah PDF dibuat
  slideCopy.setTrashed(true);

  return pdf.getUrl();
}


function getLSDatahonor() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS HONOR');
  const data = sheet.getDataRange().getValues(); // Ambil semua data
  const headers = data.shift(); // Buang header

  // Format tanggal menjadi string jika bertipe Date
  const formatDateToString = (value) => {
    if (value instanceof Date) {
      const bulanIndonesia = [
        'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
        'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
      ];
      const tanggal = value.getDate();
      const bulan = bulanIndonesia[value.getMonth()];
      const tahun = value.getFullYear();
      return `${tanggal} ${bulan} ${tahun}`;
    }
    return value; // Jika bukan Date, kembalikan nilai asli
  };

  // Ambil semua file PDF di folder
  const folder = DriveApp.getFolderById(folderIdhonor);
  const files = folder.getFiles();
  const pdfLinks = {};

  // Buat mapping Nomor ke URL PDF
  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName(); // Contoh nama file: "PDF-1234.pdf"
    const nomorMatch = fileName.match(/PDF-(\d+)\.pdf/); // Ekstrak Nomor
    if (nomorMatch) {
      pdfLinks[nomorMatch[1]] = file.getUrl(); // Simpan URL berdasarkan Nomor
    }
  }

  // Tambahkan link PDF ke setiap baris data
  const result = data.map(row => {
    const formattedRow = row.map(cell => formatDateToString(cell)); // Format setiap kolom
    const nomor = formattedRow[0]; // Asumsikan kolom Nomor ada di indeks 0
    const pdfUrl = pdfLinks[nomor] || ''; // Cari URL berdasarkan Nomor
    return [...formattedRow, pdfUrl]; // Tambahkan URL ke data
  });

  return result;
}

function deleteLSDatahonor(nomor) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('LS HONOR');
  const data = sheet.getDataRange().getValues();
  
  // Temukan baris berdasarkan Nomor
  const rowIndex = data.findIndex(row => row[0] === nomor);
  if (rowIndex > -1) {
    sheet.deleteRow(rowIndex + 1); // Tambahkan 1 karena indeks data 0-based, sedangkan Spreadsheet 1-based
  }

  // Hapus file PDF terkait dari folder
  const folder = DriveApp.getFolderById(folderIdhonor);
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName();
    if (fileName === `PDF-${nomor}.pdf`) {
      file.setTrashed(true); // Hapus file
      break;
    }
  }

  return `Data dengan Nomor ${nomor} berhasil dihapus.`;
}




12. Copy dan pastekan script ini ke CodeGUSPPD.gs

Masukkan Password Untuk Melihat Script (Password sama dengan di atas)

const slideTemplateIdgusppd = 'GANTI_ID_TEMPLATE_GU_SPPD'; // Ganti dengan ID Google Slides Anda
const folderIdgusppd = 'GANTI_ID_FOLDER_GU_SPPD'; // Ganti dengan ID Folder tujuan di Google Drive

//Source Code by www.javabitpro.com

function formatDateToIndonesiangusppd(date) {
  const bulanIndonesia = [
    'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
    'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
  ];
  
  const tanggal = date.getDate();
  const bulan = bulanIndonesia[date.getMonth()]; // Ambil nama bulan sesuai indeks
  const tahun = date.getFullYear();
  
  return `${tanggal} ${bulan} ${tahun}`; // Format "dd mmmm yyyy"
}
function getJenisDatagusppd() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getKategoriDatagusppd() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}
function getAtasanInfogusppd(jenis) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === jenis); // Mencocokkan jenis
  return result;
}



function getKategoriInfogusppd(kategori) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === kategori); // Mencocokkan jenis
  return result;
}


function saveDataAndGeneratePDFgusppd(data) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('GU SPPD');
  
  // Simpan data ke spreadsheet dengan Nomor sebagai teks (tambahkan tanda kutip)
  const nomor = "'" + data.Nomor; // Menyimpan sebagai teks
  sheet.appendRow([nomor, data.Nama, data.Alamat, data.TanggalSpm, data.Tahun, data.Jenis, data.NamaAtasan, data.NIPAtasan, data.GolonganAtasan, data.Currency, data.Huruf, data.Kategori, data.NamaKategori, data.NipKategori, data.GolonganKategori, data.Rekanan, data.NamaRekanan, data.BankRekanan, data.RekeningRekanan, data.NpwpRekanan, data.TelpRekanan, data.AlamatRekanan, data.Peraturan, data.NamaDPA, data.Pembayaran]);

  // Format tanggal spm menjadi "dd mmmm yyyy" dalam bahasa Indonesia
  const tanggalSpm = new Date(data.TanggalSpm);
  const tanggalSpmFormatted = formatDateToIndonesian(tanggalSpm);
  
  // Load template Google Slides
  const slideTemplate = DriveApp.getFileById(slideTemplateIdgusppd);
  const folder = DriveApp.getFolderById(folderIdgusppd);

// Salin template dan isi data
const slideCopy = slideTemplate.makeCopy(`Generated - ${data.Nomor}`, folder);
const slide = SlidesApp.openById(slideCopy.getId());
const slides = slide.getSlides(); // Mendapatkan semua slide

// Iterasi melalui semua slide
slides.forEach(slideBody => {
  slideBody.replaceAllText('{Nomor SPM}', data.Nomor);
  slideBody.replaceAllText('{Nama}', data.Nama);
  slideBody.replaceAllText('{Alamat}', data.Alamat);
  slideBody.replaceAllText('{Tanggal Spm}', tanggalSpmFormatted); // Gunakan format baru
  slideBody.replaceAllText('{Tahun}', data.Tahun);
  slideBody.replaceAllText('{Jenis}', data.Jenis);
  slideBody.replaceAllText('{Nama Atasan}', data.NamaAtasan);
  slideBody.replaceAllText('{NIP Atasan}', data.NIPAtasan);
  slideBody.replaceAllText('{Golongan Atasan}', data.GolonganAtasan);
  slideBody.replaceAllText('{Currency}', data.Currency);
  slideBody.replaceAllText('{Huruf}', data.Huruf);
  slideBody.replaceAllText('{Kategori}', data.Kategori);
  slideBody.replaceAllText('{Nama Kategori}', data.NamaKategori);
  slideBody.replaceAllText('{Nip Kategori}', data.NipKategori);
  slideBody.replaceAllText('{Golongan Kategori}', data.GolonganKategori);
  slideBody.replaceAllText('{Rekanan}', data.Rekanan);
  slideBody.replaceAllText('{Nama Rekanan}', data.NamaRekanan);
  slideBody.replaceAllText('{Bank Rekanan}', data.BankRekanan);
  slideBody.replaceAllText('{Rekening Rekanan}', data.RekeningRekanan);
  slideBody.replaceAllText('{Npwp Rekanan}', data.NpwpRekanan);
  slideBody.replaceAllText('{Telp Rekanan}', data.TelpRekanan);
  slideBody.replaceAllText('{Alamat Rekanan}', data.AlamatRekanan);
  slideBody.replaceAllText('{Peraturan}', data.Peraturan);
  slideBody.replaceAllText('{Nama DPA}', data.NamaDPA);
});

slide.saveAndClose();

  // Export ke PDF
  const pdfFile = DriveApp.getFileById(slideCopy.getId()).getAs('application/pdf');
  const pdf = folder.createFile(pdfFile).setName(`PDF-${data.Nomor}.pdf`);

  // Hapus salinan Slide setelah PDF dibuat
  slideCopy.setTrashed(true);

  return pdf.getUrl();
}


function getLSDatagusppd() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('GU SPPD');
  const data = sheet.getDataRange().getValues(); // Ambil semua data
  const headers = data.shift(); // Buang header

  // Format tanggal menjadi string jika bertipe Date
  const formatDateToString = (value) => {
    if (value instanceof Date) {
      const bulanIndonesia = [
        'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
        'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
      ];
      const tanggal = value.getDate();
      const bulan = bulanIndonesia[value.getMonth()];
      const tahun = value.getFullYear();
      return `${tanggal} ${bulan} ${tahun}`;
    }
    return value; // Jika bukan Date, kembalikan nilai asli
  };

  // Ambil semua file PDF di folder
  const folder = DriveApp.getFolderById(folderIdgusppd);
  const files = folder.getFiles();
  const pdfLinks = {};

  // Buat mapping Nomor ke URL PDF
  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName(); // Contoh nama file: "PDF-1234.pdf"
    const nomorMatch = fileName.match(/PDF-(\d+)\.pdf/); // Ekstrak Nomor
    if (nomorMatch) {
      pdfLinks[nomorMatch[1]] = file.getUrl(); // Simpan URL berdasarkan Nomor
    }
  }

  // Tambahkan link PDF ke setiap baris data
  const result = data.map(row => {
    const formattedRow = row.map(cell => formatDateToString(cell)); // Format setiap kolom
    const nomor = formattedRow[0]; // Asumsikan kolom Nomor ada di indeks 0
    const pdfUrl = pdfLinks[nomor] || ''; // Cari URL berdasarkan Nomor
    return [...formattedRow, pdfUrl]; // Tambahkan URL ke data
  });

  return result;
}

function deleteLSDatagusppd(nomor) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('GU SPPD');
  const data = sheet.getDataRange().getValues();
  
  // Temukan baris berdasarkan Nomor
  const rowIndex = data.findIndex(row => row[0] === nomor);
  if (rowIndex > -1) {
    sheet.deleteRow(rowIndex + 1); // Tambahkan 1 karena indeks data 0-based, sedangkan Spreadsheet 1-based
  }

  // Hapus file PDF terkait dari folder
  const folder = DriveApp.getFolderById(folderIdgusppd);
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName();
    if (fileName === `PDF-${nomor}.pdf`) {
      file.setTrashed(true); // Hapus file
      break;
    }
  }

  return `Data dengan Nomor ${nomor} berhasil dihapus.`;
}




13. Copy dan pastekan script di bawah ini ke CodeGUBARJAS.gs

Masukkan Password Untuk Melihat Script (Password sama dengan di atas)

const slideTemplateIdgubarjas = 'GANTI_ID_TEMPLATE_GU_BARJAS'; // Ganti dengan ID Google Slides Anda
const folderIdgubarjas = 'GANTI_ID_FOLDER_GU_BARJAS'; // Ganti dengan ID Folder tujuan di Google Drive

//Source Code by www.javabitpro.com

function formatDateToIndonesiangubarjas(date) {
  const bulanIndonesia = [
    'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
    'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
  ];
  
  const tanggal = date.getDate();
  const bulan = bulanIndonesia[date.getMonth()]; // Ambil nama bulan sesuai indeks
  const tahun = date.getFullYear();
  
  return `${tanggal} ${bulan} ${tahun}`; // Format "dd mmmm yyyy"
}
function getJenisDatagubarjas() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getKategoriDatagubarjas() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}
function getAtasanInfogubarjas(jenis) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === jenis); // Mencocokkan jenis
  return result;
}

function getKategoriInfogubarjas(kategori) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === kategori); // Mencocokkan jenis
  return result;
}


function saveDataAndGeneratePDFgubarjas(data) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('GU BARJAS');
  
  // Simpan data ke spreadsheet dengan Nomor sebagai teks (tambahkan tanda kutip)
  const nomor = "'" + data.Nomor; // Menyimpan sebagai teks
  sheet.appendRow([nomor, data.Nama, data.Alamat, data.TanggalSpm, data.Tahun, data.Jenis, data.NamaAtasan, data.NIPAtasan, data.GolonganAtasan, data.Currency, data.Huruf, data.Kategori, data.NamaKategori, data.NipKategori, data.GolonganKategori, data.Rekanan, data.NamaRekanan, data.BankRekanan, data.RekeningRekanan, data.NpwpRekanan, data.TelpRekanan, data.AlamatRekanan, data.Peraturan, data.NamaDPA, data.Pembayaran]);

  // Format tanggal spm menjadi "dd mmmm yyyy" dalam bahasa Indonesia
  const tanggalSpm = new Date(data.TanggalSpm);
  const tanggalSpmFormatted = formatDateToIndonesian(tanggalSpm);
  
  // Load template Google Slides
  const slideTemplate = DriveApp.getFileById(slideTemplateIdgubarjas);
  const folder = DriveApp.getFolderById(folderIdgubarjas);

// Salin template dan isi data
const slideCopy = slideTemplate.makeCopy(`Generated - ${data.Nomor}`, folder);
const slide = SlidesApp.openById(slideCopy.getId());
const slides = slide.getSlides(); // Mendapatkan semua slide

// Iterasi melalui semua slide
slides.forEach(slideBody => {
  slideBody.replaceAllText('{Nomor SPM}', data.Nomor);
  slideBody.replaceAllText('{Nama}', data.Nama);
  slideBody.replaceAllText('{Alamat}', data.Alamat);
  slideBody.replaceAllText('{Tanggal Spm}', tanggalSpmFormatted); // Gunakan format baru
  slideBody.replaceAllText('{Tahun}', data.Tahun);
  slideBody.replaceAllText('{Jenis}', data.Jenis);
  slideBody.replaceAllText('{Nama Atasan}', data.NamaAtasan);
  slideBody.replaceAllText('{NIP Atasan}', data.NIPAtasan);
  slideBody.replaceAllText('{Golongan Atasan}', data.GolonganAtasan);
  slideBody.replaceAllText('{Currency}', data.Currency);
  slideBody.replaceAllText('{Huruf}', data.Huruf);
  slideBody.replaceAllText('{Kategori}', data.Kategori);
  slideBody.replaceAllText('{Nama Kategori}', data.NamaKategori);
  slideBody.replaceAllText('{Nip Kategori}', data.NipKategori);
  slideBody.replaceAllText('{Golongan Kategori}', data.GolonganKategori);
  slideBody.replaceAllText('{Rekanan}', data.Rekanan);
  slideBody.replaceAllText('{Nama Rekanan}', data.NamaRekanan);
  slideBody.replaceAllText('{Bank Rekanan}', data.BankRekanan);
  slideBody.replaceAllText('{Rekening Rekanan}', data.RekeningRekanan);
  slideBody.replaceAllText('{Npwp Rekanan}', data.NpwpRekanan);
  slideBody.replaceAllText('{Telp Rekanan}', data.TelpRekanan);
  slideBody.replaceAllText('{Alamat Rekanan}', data.AlamatRekanan);
  slideBody.replaceAllText('{Peraturan}', data.Peraturan);
  slideBody.replaceAllText('{Nama DPA}', data.NamaDPA);
});

slide.saveAndClose();

  // Export ke PDF
  const pdfFile = DriveApp.getFileById(slideCopy.getId()).getAs('application/pdf');
  const pdf = folder.createFile(pdfFile).setName(`PDF-${data.Nomor}.pdf`);

  // Hapus salinan Slide setelah PDF dibuat
  slideCopy.setTrashed(true);

  return pdf.getUrl();
}


function getLSDatagubarjas() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('GU BARJAS');
  const data = sheet.getDataRange().getValues(); // Ambil semua data
  const headers = data.shift(); // Buang header

  // Format tanggal menjadi string jika bertipe Date
  const formatDateToString = (value) => {
    if (value instanceof Date) {
      const bulanIndonesia = [
        'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
        'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
      ];
      const tanggal = value.getDate();
      const bulan = bulanIndonesia[value.getMonth()];
      const tahun = value.getFullYear();
      return `${tanggal} ${bulan} ${tahun}`;
    }
    return value; // Jika bukan Date, kembalikan nilai asli
  };

  // Ambil semua file PDF di folder
  const folder = DriveApp.getFolderById(folderIdgubarjas);
  const files = folder.getFiles();
  const pdfLinks = {};

  // Buat mapping Nomor ke URL PDF
  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName(); // Contoh nama file: "PDF-1234.pdf"
    const nomorMatch = fileName.match(/PDF-(\d+)\.pdf/); // Ekstrak Nomor
    if (nomorMatch) {
      pdfLinks[nomorMatch[1]] = file.getUrl(); // Simpan URL berdasarkan Nomor
    }
  }

  // Tambahkan link PDF ke setiap baris data
  const result = data.map(row => {
    const formattedRow = row.map(cell => formatDateToString(cell)); // Format setiap kolom
    const nomor = formattedRow[0]; // Asumsikan kolom Nomor ada di indeks 0
    const pdfUrl = pdfLinks[nomor] || ''; // Cari URL berdasarkan Nomor
    return [...formattedRow, pdfUrl]; // Tambahkan URL ke data
  });

  return result;
}

function deleteLSDatagubarjas(nomor) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('GU BARJAS');
  const data = sheet.getDataRange().getValues();
  
  // Temukan baris berdasarkan Nomor
  const rowIndex = data.findIndex(row => row[0] === nomor);
  if (rowIndex > -1) {
    sheet.deleteRow(rowIndex + 1); // Tambahkan 1 karena indeks data 0-based, sedangkan Spreadsheet 1-based
  }

  // Hapus file PDF terkait dari folder
  const folder = DriveApp.getFolderById(folderIdgubarjas);
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName();
    if (fileName === `PDF-${nomor}.pdf`) {
      file.setTrashed(true); // Hapus file
      break;
    }
  }

  return `Data dengan Nomor ${nomor} berhasil dihapus.`;
}




14. Copy dan pastekan script di CodeUP.gs

Masukkan Password Untuk Melihat Script (Password sama dengan di atas)

const slideTemplateIdup = 'GANTI_ID_TEMPLATE_UP'; // Ganti dengan ID Google Slides Anda
const folderIdup = 'GANTI_ID_FOLDER_UP'; // Ganti dengan ID Folder tujuan di Google Drive

//Source Code by www.javabitpro.com

function formatDateToIndonesianup(date) {
  const bulanIndonesia = [
    'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
    'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
  ];
  
  const tanggal = date.getDate();
  const bulan = bulanIndonesia[date.getMonth()]; // Ambil nama bulan sesuai indeks
  const tahun = date.getFullYear();
  
  return `${tanggal} ${bulan} ${tahun}`; // Format "dd mmmm yyyy"
}
function getJenisDataup() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}

function getKategoriDataup() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues(); // Asumsi data ada di kolom A sampai D
  return data; // Mengembalikan data Jenis dan informasi terkait
}
function getAtasanInfoup(jenis) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === jenis); // Mencocokkan jenis
  return result;
}

function getKategoriInfoup(kategori) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Atasan');
  const data = sheet.getRange('A1:D' + sheet.getLastRow()).getValues();
  
  // Mencari data berdasarkan Jenis
  const result = data.filter(row => row[0] === kategori); // Mencocokkan jenis
  return result;
}


function saveDataAndGeneratePDFup(data) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('UP');
  
  // Simpan data ke spreadsheet dengan Nomor sebagai teks (tambahkan tanda kutip)
  const nomor = "'" + data.Nomor; // Menyimpan sebagai teks
  sheet.appendRow([nomor, data.Nama, data.Alamat, data.TanggalUp, data.Tahun, data.Currency, data.Huruf]);

  // Format tanggal lahir menjadi "dd mmmm yyyy" dalam bahasa Indonesia
  const tanggalUp = new Date(data.TanggalUp);
  const tanggalUpFormatted = formatDateToIndonesian(tanggalUp);
  
  // Load template Google Slides
  const slideTemplate = DriveApp.getFileById(slideTemplateIdup);
  const folder = DriveApp.getFolderById(folderIdup);

// Salin template dan isi data
const slideCopy = slideTemplate.makeCopy(`Generated - ${data.Nomor}`, folder);
const slide = SlidesApp.openById(slideCopy.getId());
const slides = slide.getSlides(); // Mendapatkan semua slide

// Iterasi melalui semua slide
slides.forEach(slideBody => {
  slideBody.replaceAllText('{Nomor SPM}', data.Nomor);
  slideBody.replaceAllText('{Nama}', data.Nama);
  slideBody.replaceAllText('{Alamat}', data.Alamat);
  slideBody.replaceAllText('{Tanggal Up}', tanggalUpFormatted); // Gunakan format baru
  slideBody.replaceAllText('{Tahun}', data.Tahun);
  slideBody.replaceAllText('{Currency}', data.Currency);
  slideBody.replaceAllText('{Huruf}', data.Huruf);
});

slide.saveAndClose();

  // Export ke PDF
  const pdfFile = DriveApp.getFileById(slideCopy.getId()).getAs('application/pdf');
  const pdf = folder.createFile(pdfFile).setName(`PDF-${data.Nomor}.pdf`);

  // Hapus salinan Slide setelah PDF dibuat
  slideCopy.setTrashed(true);

  return pdf.getUrl();
}


function getLSDataup() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('UP');
  const data = sheet.getDataRange().getValues(); // Ambil semua data
  const headers = data.shift(); // Buang header

  // Format tanggal menjadi string jika bertipe Date
  const formatDateToString = (value) => {
    if (value instanceof Date) {
      const bulanIndonesia = [
        'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
        'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
      ];
      const tanggal = value.getDate();
      const bulan = bulanIndonesia[value.getMonth()];
      const tahun = value.getFullYear();
      return `${tanggal} ${bulan} ${tahun}`;
    }
    return value; // Jika bukan Date, kembalikan nilai asli
  };

  // Ambil semua file PDF di folder
  const folder = DriveApp.getFolderById(folderIdup);
  const files = folder.getFiles();
  const pdfLinks = {};

  // Buat mapping Nomor ke URL PDF
  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName(); // Contoh nama file: "PDF-1234.pdf"
    const nomorMatch = fileName.match(/PDF-([\w\d]+)\.pdf/); // Ekstrak Nomor
    if (nomorMatch) {
      pdfLinks[nomorMatch[1]] = file.getUrl(); // Simpan URL berdasarkan Nomor
    }
  }

  // Tambahkan link PDF ke setiap baris data
  const result = data.map(row => {
    const formattedRow = row.map(cell => formatDateToString(cell)); // Format setiap kolom
    const nomor = formattedRow[0]; // Asumsikan kolom Nomor ada di indeks 0
    const pdfUrl = pdfLinks[nomor] || ''; // Cari URL berdasarkan Nomor
    return [...formattedRow, pdfUrl]; // Tambahkan URL ke data
  });

  return result;
}

function deleteLSDataup(nomor) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('UP');
  const data = sheet.getDataRange().getValues();
  
  // Temukan baris berdasarkan Nomor
  const rowIndex = data.findIndex(row => row[0] === nomor);
  if (rowIndex > -1) {
    sheet.deleteRow(rowIndex + 1); // Tambahkan 1 karena indeks data 0-based, sedangkan Spreadsheet 1-based
  }

  // Hapus file PDF terkait dari folder
  const folder = DriveApp.getFolderById(folderIdup);
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName();
    if (fileName === `PDF-${nomor}.pdf`) {
      file.setTrashed(true); // Hapus file
      break;
    }
  }

  return `Data dengan Nomor ${nomor} berhasil dihapus.`;
}



15. Untuk script yang lainnya sudah include di dalam file masing-masing project

16. Klik ikon Save.

17. Klik tombol Terapkan/Deploy lalu pilih Deployment baru/New deployment.


18. Pastikan jenisnya adalah Aplikasi web/Web app , hak aksesnya Siapa saja/Anyone lalu pilih Terapkan/Deploy.


19. Izinkan hak akses jika di perlukan (Tutorial ada di dalam video)


20. Klik URL yang sudah di Deploy. Website sudah bisa digunakan.


Note. Saat menjalankan website pastikan Browser (Chrome, Mozilla, Opera dan sebagainya) sudah login akun Google.

SELESAI !!!





Previous Post Next Post