Aktivitas mencurigakan terdeteksi!
Pelanggaran: 1 / 5
5 pelanggaran = ujian otomatis dikumpulkan
MATERI BAB
Silakan pilih peran Anda untuk melanjutkan
Kelola pengaturan ujian di sini
MATERI BAB
๐ Token: 2027
โ ๏ธ Jika "Jumlah Soal" kurang dari total bank soal, sistem akan mengacak dan mengambil subset soal tersebut (Bank Soal Acak).
Format: Kolom A=Pertanyaan, B-F=Opsi A-E, G=Jawaban Benar (A/B/C/D/E)
๐ Total soal dalam bank: 1
โข Acak Soal: Mengacak urutan soal.
โข Acak Opsi: Mengacak posisi A/B/C/D/E per soal.
โข Status Reset: AKTIF jika buat latihan soal (siswa bisa reset sendiri di halaman awal), NONAKTIF jika buat UJIAN resmi.
Atur skala nilai maksimal, standar kelulusan (KKM), dan tampilan hasil nilai untuk siswa.
Tentukan jumlah maksimal pelanggaran sebelum ujian otomatis dikumpulkan.
Cetak atau ekspor soal ujian ke berbagai format file (PDF, Word, Excel) dengan pengaturan format sesuai kebutuhan.
1. Teknologi informasi dan komunikasi dapat diartikan sebagai segala kegiatan yang berkaitan dengan pemrosesan, manipulasi, pengolahan, pemindahan, dan penyampaian informasi menggunakan suatu media. Pernyataan ini merujuk pada definisi...
| 1. A |
Masukkan URL Web App dari Google Apps Script untuk menerima hasil ujian siswa secara otomatis ke Google Spreadsheet.
function doPost(e) {
var lock = LockService.getScriptLock();
try {
lock.waitLock(10000); // Tunggu antrean maksimal 10 detik agar tidak ada bentrok antar pengiriman
var ss = SpreadsheetApp.getActiveSpreadsheet();
var data = JSON.parse(e.postData.contents);
// 1. Jika sinkronisasi otomatis dari Dashboard Guru
if (data.type === 'dashboard_sync') {
var sheetGuru = ss.getSheetByName("Pengaturan_Guru");
if (!sheetGuru) {
sheetGuru = ss.insertSheet("Pengaturan_Guru");
}
if (sheetGuru.getLastRow() == 0) {
sheetGuru.appendRow(["ID Sync", "Waktu Sync", "Judul Ujian", "Subjudul", "Token", "Durasi (Menit)", "Jumlah Soal", "Acak Soal", "Acak Opsi", "Batas Pelanggaran", "Nilai Max", "KKM", "Total Bank Soal", "Data Lengkap (JSON)"]);
}
var syncId = String(data.submissionId || data.timestamp || "");
if (syncId && sheetGuru.getLastRow() > 1) {
var existingSyncIds = sheetGuru.getRange(2, 1, sheetGuru.getLastRow() - 1, 1).getValues();
for (var s = 0; s < existingSyncIds.length; s++) {
if (String(existingSyncIds[s][0]) === syncId) {
return ContentService.createTextOutput(JSON.stringify({result: "already_exists", type: "dashboard_sync"})).setMimeType(ContentService.MimeType.JSON);
}
}
}
sheetGuru.appendRow([
syncId,
data.waktuSync || new Date().toLocaleString(),
data.judul || "",
data.subJudul || "",
data.token || "",
data.durasi || 0,
data.jumlahSoal || 0,
data.acak ? "Ya" : "Tidak",
data.acakOpsi ? "Ya" : "Tidak",
data.maxPelanggaran || 0,
data.nilaiMaksimal || 100,
data.kkm || 75,
data.totalBankSoal || 0,
JSON.stringify(data)
]);
SpreadsheetApp.flush();
return ContentService.createTextOutput(JSON.stringify({result: "success", type: "dashboard_sync"})).setMimeType(ContentService.MimeType.JSON);
}
// 2. Pengiriman nilai ujian siswa (DENGAN PROTEKSI ANTI-DUPLIKAT)
var sheetSiswa = ss.getSheetByName("Hasil_Ujian") || ss.getActiveSheet();
if (sheetSiswa.getLastRow() == 0) {
sheetSiswa.appendRow(["ID Pengiriman", "Timestamp", "Nama", "Nomor Absen", "Kelas", "Nilai", "Benar", "Total Soal", "Pelanggaran", "Auto Submit", "Waktu Selesai"]);
}
// Periksa apakah ID Pengiriman sudah ada untuk mencegah data dobel
var subId = String(data.submissionId || "");
if (subId && sheetSiswa.getLastRow() > 1) {
var existingIds = sheetSiswa.getRange(2, 1, sheetSiswa.getLastRow() - 1, 1).getValues();
for (var i = 0; i < existingIds.length; i++) {
if (String(existingIds[i][0]) === subId) {
return ContentService.createTextOutput(JSON.stringify({result: "already_exists", type: "hasil_ujian"})).setMimeType(ContentService.MimeType.JSON);
}
}
}
sheetSiswa.appendRow([
subId,
data.waktuSelesai || new Date(),
data.nama || "",
data.nomor || "",
data.kelas || "",
data.nilai || 0,
data.benar || 0,
data.totalSoal || 0,
data.pelanggaran || 0,
data.autoSubmit ? "Ya" : "Tidak",
data.waktuSelesai || ""
]);
SpreadsheetApp.flush();
return ContentService.createTextOutput(JSON.stringify({result: "success", type: "hasil_ujian"})).setMimeType(ContentService.MimeType.JSON);
} catch(error) {
return ContentService.createTextOutput(JSON.stringify({result: "error", error: error.toString()})).setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}
Hapus semua data siswa yang sedang/sudah ujian agar file HTML yang dibagikan benar-benar bersih tanpa bekas data.
Gunakan tombol di bawah untuk menyimpan seluruh perubahan pengaturan yang sudah dilakukan (Judul, Token, Password, Durasi, Jumlah Soal, Excel Soal, Pengacakan, Status Reset, Score/KKM, Batas Pelanggaran, dan Google Sheet URL) agar tidak hilang, atau langsung mendownload file HTML versi terbaru.
Masukkan password guru:
Masukkan password guru untuk mereset sesi ini: