Lompat ke konten Lompat ke sidebar Lompat ke footer

Source Code untuk Kode GS Aplikasi Guru BK

Berikut Kode GS untuk Aplikasi Guru BK:

/* BACKEND - SIP BK SMPN 3 KERINCI (FINAL UPDATE) */

function doGet() {
  return HtmlService.createTemplateFromFile('Index')
    .evaluate()
    .setTitle('SIP-BK SMPN 3 Kerinci')
    .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL)
    .addMetaTag('viewport', 'width=device-width, initial-scale=1');
}

/* --- API UTAMA --- */

function getInitialData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  setupDatabase(ss);
  return {
    students: getSheetData(ss, "Data_Siswa"),
    violations: getSheetData(ss, "Data_Pelanggaran"),
    counselings: getSheetData(ss, "Data_Konseling"),
    achievements: getSheetData(ss, "Data_Prestasi"),
    homeVisits: getSheetData(ss, "Data_HomeVisit")
  };
}

/* Single Insert */
function addDataToSheet(sheetName, dataObj) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(sheetName);
  const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
 
  const rowData = headers.map(header => {
    if (header === 'id') return Date.now();
    let val = dataObj[header];
    return (val === undefined || val === null) ? "" : val;
  });
 
  sheet.appendRow(rowData);
  return getSheetData(ss, sheetName);
}

/* BULK INSERT (Untuk Import Excel) */
function importBulkStudents(dataArray) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Data_Siswa");
 
  if (!dataArray || dataArray.length === 0) return getSheetData(ss, "Data_Siswa");

  // Format data sesuai urutan kolom: id, name, class, nis, status, points
  // Kita generate ID unik untuk setiap baris
  const rows = dataArray.map((row, index) => {
    return [
      Date.now() + index, // ID Unik
      row.name || "",
      row.class || "",
      row.nis || "",
      "Aktif", // Default Status
      0        // Default Poin
    ];
  });

  // Tulis ke sheet (mulai dari baris terakhir + 1)
  const lastRow = sheet.getLastRow();
  sheet.getRange(lastRow + 1, 1, rows.length, rows[0].length).setValues(rows);
 
  return getSheetData(ss, "Data_Siswa");
}

function deleteDataFromSheet(sheetName, id) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(sheetName);
  const data = sheet.getDataRange().getValues();
  const idIndex = data[0].indexOf('id');
 
  if (idIndex === -1) return;

  for (let i = 1; i < data.length; i++) {
    // Pakai '==' biar aman bandingkan string/number
    if (data[i][idIndex] == id) {
      sheet.deleteRow(i + 1);
      break;
    }
  }
  return getSheetData(ss, sheetName);
}

/* HELPER */
function getSheetData(ss, sheetName) {
  const sheet = ss.getSheetByName(sheetName);
  if (!sheet || sheet.getLastRow() < 2) return [];
 
  const rawData = sheet.getDataRange().getValues();
  const headers = rawData.shift();
 
  return rawData.map(row => {
    let obj = {};
    headers.forEach((header, index) => {
      let value = row[index];
      if (Object.prototype.toString.call(value) === '[object Date]') {
        value = Utilities.formatDate(value, Session.getScriptTimeZone(), "yyyy-MM-dd");
      }
      obj[header] = value;
    });
    return obj;
  });
}

function setupDatabase(ss) {
  const schema = {
    "Data_Siswa": ["id", "name", "class", "nis", "status", "points"],
    "Data_Pelanggaran": ["id", "studentId", "studentName", "date", "type", "points", "note"],
    "Data_Konseling": ["id", "studentId", "studentName", "date", "time", "status", "topic"],
    "Data_Prestasi": ["id", "studentId", "studentName", "date", "title", "level", "note"],
    "Data_HomeVisit": ["id", "studentId", "studentName", "date", "parentName", "result", "petugas"]
  };

  for (let sheetName in schema) {
    if (!ss.getSheetByName(sheetName)) {
      let s = ss.insertSheet(sheetName);
      s.appendRow(schema[sheetName]);
    }
  }
}