Struktur Kolom Google Spreadsheet (Mendukung 4 atau 5 Opsi Jawaban: A s.d. E)
Pastikan Sheet utama Anda memiliki header baris pertama: Paket | Tipe | Pertanyaan | Opsi_A | Opsi_B | Opsi_C | Opsi_D | Opsi_E | Kunci | Pembahasan (Mendukung otomatis tabel 9 kolom A–D maupun 10 kolom A–E).
URL Web App Anda tertanam di variabel const GAS_WEB_APP_URL pada bagian atas script kode HTML ini.
Kode Lengkap Google Apps Script (Mendukung 5 Pilihan Opsi A–E & Unggah Paket)
function doGet(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var rows = sheet.getDataRange().getValues();
if (rows.length < 2) {
return ContentService.createTextOutput(JSON.stringify({ status: "success", questions: [] }))
.setMimeType(ContentService.MimeType.JSON);
}
var headers = rows[0].map(function(h) { return String(h || "").trim().toLowerCase(); });
var hasOpsiE = headers.indexOf("opsi_e") !== -1 || headers.indexOf("opsie") !== -1 || rows[0].length >= 10;
var data = [];
for (var i = 1; i < rows.length; i++) {
var row = rows[i];
if (!row[0] || !row[2]) continue;
var options = [
String(row[3] || "").trim(),
String(row[4] || "").trim(),
String(row[5] || "").trim(),
String(row[6] || "").trim()
];
var kunci = "";
var explanation = "";
if (hasOpsiE) {
options.push(String(row[7] || "").trim());
kunci = String(row[8] || "").trim().toUpperCase();
explanation = String(row[9] || "").trim();
} else {
kunci = String(row[7] || "").trim().toUpperCase();
explanation = String(row[8] || "").trim();
}
data.push({
paket: String(row[0]).trim(),
tipe: String(row[1]).trim().toUpperCase(), // BS, PG, atau PGK
q: String(row[2]).trim(),
options: options,
kunci: kunci,
explanation: explanation
});
}
return ContentService.createTextOutput(JSON.stringify({
status: "success",
questions: data
})).setMimeType(ContentService.MimeType.JSON);
}
// Menyimpan paket soal baru yang diunggah pengguna dari aplikasi web ke Spreadsheet
function doPost(e) {
try {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var payload = JSON.parse(e.postData.contents);
var items = payload.questions || [];
items.forEach(function(item) {
var opts = item.options || ["", "", "", "", ""];
sheet.appendRow([
item.paket || "Paket Baru",
item.tipe || "PG",
item.q || "",
opts[0] || "",
opts[1] || "",
opts[2] || "",
opts[3] || "",
opts[4] || "",
item.kunci || "A",
item.explanation || ""
]);
});
return ContentService.createTextOutput(JSON.stringify({
status: "success",
added: items.length
})).setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({
status: "error",
message: err.toString()
})).setMimeType(ContentService.MimeType.JSON);
}
}