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
Post a Comment