ujian

// ========================================== // GOOGLE APPS SCRIPT - UJIAN PAS // ========================================== const NAMA_SEKOLAH = "SMA NEGERI CONTOH"; const MATA_PELAJARAN = "Matematika"; const DURASI_UJIAN = 60; // menit const ADMIN_USERNAME = "admin"; const ADMIN_PASSWORD = "admin123"; function doGet() { return HtmlService.createTemplateFromFile('Index') .evaluate() .setTitle('Ujian Penilaian Akhir Semester') .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL) .addMetaTag('viewport', 'width=device-width, initial-scale=1'); } function include(filename) { return HtmlService.createHtmlOutputFromFile(filename).getContent(); } // ==================== AUTH ==================== function login(username, password) { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); // Cek admin if (username === ADMIN_USERNAME && password === ADMIN_PASSWORD) { return { success: true, role: 'admin', message: 'Login berhasil!' }; } // Cek siswa const siswaSheet = ss.getSheetByName('SISWA'); const dataSiswa = siswaSheet.getDataRange().getValues(); for (let i = 1; i < dataSiswa.length; i++) { if (dataSiswa[i][0] == username && dataSiswa[i][3] == password) { return { success: true, role: 'siswa', nama: dataSiswa[i][1], kelas: dataSiswa[i][2], message: 'Login berhasil!' }; } } return { success: false, message: 'NIS atau password salah!' }; } catch (e) { return { success: false, message: 'Terjadi kesalahan: ' + e.message }; } } // ==================== SISWA ==================== function getDataUjian(nis) { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); const soalSheet = ss.getSheetByName('SOAL'); const dataSoal = soalSheet.getDataRange().getValues(); const soalList = []; for (let i = 1; i < dataSoal.length; i++) { soalList.push({ nomor: dataSoal[i][2], pilihan: { A: dataSoal[i][3], B: dataSoal[i][4], C: dataSoal[i][5], D: dataSoal[i][6] }, kunci: dataSoal[i][7], bobot: dataSoal[i][8] }); } // Cek status ujian const statusSheet = ss.getSheetByName('STATUS'); const dataStatus = statusSheet.getDataRange().getValues(); for (let i = 1; i < dataStatus.length; i++) { if (dataStatus[i][0] == nis && dataStatus[i][2] == 'sedang ujian') { return { success: true, sudahMulai: true, waktuMulai: dataStatus[i][3], waktuSelesai: dataStatus[i][4], soal: soalList }; } } return { success: true, sudahMulai: false, soal: soalList }; } catch (e) { return { success: false, message: 'Terjadi kesalahan: ' + e.message }; } } function mulaiUjian(nis, nama) { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); const statusSheet = ss.getSheetByName('STATUS'); const now = new Date(); // Update status const dataStatus = statusSheet.getDataRange().getValues(); let found = false; for (let i = 1; i < dataStatus.length; i++) { if (dataStatus[i][0] == nis) { statusSheet.getRange(i + 1, 2, 1, 5).setValues([[nama, 'sedang ujian', now, '']]); found = true; break; } } if (!found) { statusSheet.appendRow([nis, nama, 'sedang ujian', now, '']); } return { success: true, message: 'Ujian dimulai! Waktu: ' + DURASI_UJIAN + ' menit' }; } catch (e) { return { success: false, message: 'Terjadi kesalahan: ' + e.message }; } } function simpanJawaban(nis, jawaban) { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); const now = new Date(); // Hitung nilai let nilai = 0; let totalBobot = 0; for (let i = 0; i < jawaban.length; i++) { if (jawaban[i].kunci == jawaban[i].jawaban) { nilai += jawaban[i].bobot; } totalBobot += jawaban[i].bobot; } // Simpan hasil const hasilSheet = ss.getSheetByName('HASIL'); hasilSheet.appendRow([ nis, jawaban[0].nama, MATA_PELAJARAN, nilai, jawaban[0].waktuMulai, now, 'selesai' ]); // Update status const statusSheet = ss.getSheetByName('STATUS'); const dataStatus = statusSheet.getDataRange().getValues(); for (let i = 1; i < dataStatus.length; i++) { if (dataStatus[i][0] == nis && dataStatus[i][2] == 'sedang ujian') { statusSheet.getRange(i + 1, 3, 1, 2).setValues([['selesai', now]]); break; } } return { success: true, nilai: nilai, totalBobot: totalBobot, message: 'Jawaban tersimpan! Nilai Anda: ' + nilai }; } catch (e) { return { success: false, message: 'Terjadi kesalahan: ' + e.message }; } } // ==================== ADMIN ==================== function getDataSiswa() { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); const siswaSheet = ss.getSheetByName('SISWA'); return siswaSheet.getDataRange().getValues(); } catch (e) { return { success: false, message: 'Terjadi kesalahan: ' + e.message }; } } function getDataStatus() { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); const statusSheet = ss.getSheetByName('STATUS'); return statusSheet.getDataRange().getValues(); } catch (e) { return { success: false, message: 'Terjadi kesalahan: ' + e.message }; } } function getDataHasil() { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); const hasilSheet = ss.getSheetByName('HASIL'); return hasilSheet.getDataRange().getValues(); } catch (e) { return { success: false, message: 'Terjadi kesalahan: ' + e.message }; } } function getStatistik() { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); const hasilSheet = ss.getSheetByName('HASIL'); const data = hasilSheet.getDataRange().getValues(); let totalSiswa = 0; let nilaiTertinggi = 0; let nilaiTerendah = 100; let totalNilai = 0; for (let i = 1; i < data.length; i++) { totalSiswa++; const nilai = data[i][3]; if (nilai > nilaiTertinggi) nilaiTertinggi = nilai; if (nilai < nilaiTerendah) nilaiTerendah = nilai; totalNilai += nilai; } return { totalSiswa: totalSiswa, nilaiTertinggi: nilaiTertinggi, nilaiTerendah: nilaiTerendah, rataRata: totalSiswa > 0 ? (totalNilai / totalSiswa).toFixed(2) : 0 }; } catch (e) { return { success: false, message: 'Terjadi kesalahan: ' + e.message }; } }

Comments

Popular posts from this blog