eRapor Informatika
Sistem Penilaian Mapel Informatika Berbasis Cloud Sheets
Nama Pengguna
Role
Status Koneksi Database
Sedang mencoba menyambungkan ke Google Sheets Anda secara otomatis...
Selamat Datang
Silakan masuk menggunakan NISM & Password Anda
Nama Siswa
Rincian Capaian Nilai Informatika
Tugas 1
0
Berpikir Komputasional
Tugas 2
0
Teknologi Infor & Kom
Tugas 3
0
Sistem Komputer
Tugas 4
0
Jaringan Komputer
Tugas 5
0
Analisis Data & Coding
PAT (Teori)
0
Evaluasi Akhir Tahun
Rata-Rata Akhir
Predikat Kelulusan
C
Capaian Kompetensi (Deskripsi Otomatis)
Kelebihan Utama:
Siswa menunjukkan capaian yang sangat baik dalam materi...
Saran Perkembangan:
Perlu ditingkatkan lagi pada penguasaan kompetensi...
Kelola Nilai Informatika
Anda memiliki hak akses penuh untuk mengubah, menghapus, dan menambahkan nilai siswa.
| Identitas Siswa | T1 | T2 | T3 | T4 | T5 | PAT | Rata-Rata | Aksi |
|---|
Koneksi Database Live Google Sheets
Sambungkan aplikasi ini ke Spreadsheet online milik Anda dengan memasukkan URL hasil Deploy Apps Script.
Panduan Koneksi Google Sheets + Apps Script
Langkah praktis menyambungkan UI web ini dengan database Google Drive Anda secara real-time.
1 Konfigurasi Google Sheets
Gunakan Spreadsheet yang sudah ada dengan ID Spreadsheet: 1k6W-6C5nH5vtujbWKdVBmmdRkP4k3tNYjDn2qBsHtYU. Pastikan terdapat dua lembar tab/sheet di dalamnya dengan struktur kolom persis seperti di bawah ini (huruf kecil semua):
Tab 1: `user`
nism | nama | lp | kelas | password | role
Tab 2: `nilai`
nism | tugas1 | tugas2 | tugas3 | tugas4 | tugas5 | pat
2 Tempel Script Backend di Google Apps Script
Buka spreadsheet Anda, masuk ke menu Ekstensi > Apps Script. Hapus semua kode default dan ganti dengan kode berikut yang telah disesuaikan dengan ID Spreadsheet Anda:
// ID SPREADSHEET SESUAI CONFIG
const SPREADSHEET_ID = "1k6W-6C5nH5vtujbWKdVBmmdRkP4k3tNYjDn2qBsHtYU";
function doGet(e) {
// Penanganan request API eksternal (CORS Bypass)
if (e && e.parameter && e.parameter.action) {
return handleGetApiRequests(e);
}
// Default: Serve Webpage inside Google domain
return HtmlService.createTemplateFromFile('Index')
.evaluate()
.setTitle('eRapor Informatika')
.addMetaTag('viewport', 'width=device-width, initial-scale=1');
}
// Handler request GET dari luar (mendukung fetch dari Canvas)
function handleGetApiRequests(e) {
var action = e.parameter.action;
var ss = SpreadsheetApp.openById(SPREADSHEET_ID);
var userSheet = ss.getSheetByName("user");
var nilaiSheet = ss.getSheetByName("nilai");
var responseData = {};
try {
if (action === "readAll") {
var users = userSheet.getDataRange().getValues();
var nilai = nilaiSheet.getDataRange().getValues();
var result = [];
// Lewati header (indeks 0)
for (var i = 1; i < users.length; i++) {
var nism = users[i][0].toString();
var dataNilai = { tugas1: 0, tugas2: 0, tugas3: 0, tugas4: 0, tugas5: 0, pat: 0 };
for (var j = 1; j < nilai.length; j++) {
if (nilai[j][0].toString() === nism) {
dataNilai = {
tugas1: Number(nilai[j][1]) || 0,
tugas2: Number(nilai[j][2]) || 0,
tugas3: Number(nilai[j][3]) || 0,
tugas4: Number(nilai[j][4]) || 0,
tugas5: Number(nilai[j][5]) || 0,
pat: Number(nilai[j][6]) || 0
};
break;
}
}
result.push({
nism: nism,
nama: users[i][1],
lp: users[i][2],
kelas: users[i][3],
password: users[i][4].toString(),
role: users[i][5],
...dataNilai
});
}
responseData = { status: "success", data: result };
} else if (action === "updateGrade") {
var nism = e.parameter.nism;
var data = nilaiSheet.getDataRange().getValues();
var found = false;
var newGrades = [
Number(e.parameter.tugas1) || 0,
Number(e.parameter.tugas2) || 0,
Number(e.parameter.tugas3) || 0,
Number(e.parameter.tugas4) || 0,
Number(e.parameter.tugas5) || 0,
Number(e.parameter.pat) || 0
];
for (var i = 1; i < data.length; i++) {
if (data[i][0].toString() === nism) {
nilaiSheet.getRange(i + 1, 2, 1, 6).setValues([newGrades]);
found = true;
break;
}
}
if (!found) {
nilaiSheet.appendRow([nism, ...newGrades]);
}
responseData = { status: "success", message: "Nilai berhasil diperbarui" };
} else if (action === "addStudent") {
var nism = e.parameter.nism;
var nama = e.parameter.nama;
var lp = e.parameter.lp;
var kelas = e.parameter.kelas;
var password = e.parameter.password;
// Cari apakah sudah terdaftar
var users = userSheet.getDataRange().getValues();
var exists = false;
for (var i = 1; i < users.length; i++) {
if (users[i][0].toString() === nism) {
exists = true; break;
}
}
if (exists) {
responseData = { status: "error", message: "NISM sudah terdaftar!" };
} else {
userSheet.appendRow([nism, nama, lp, kelas, password, "siswa"]);
nilaiSheet.appendRow([nism, 0, 0, 0, 0, 0, 0]);
responseData = { status: "success", message: "Siswa berhasil didaftarkan" };
}
} else if (action === "deleteGrades") {
var nism = e.parameter.nism;
var data = nilaiSheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0].toString() === nism) {
nilaiSheet.getRange(i + 1, 2, 1, 6).setValues([[0, 0, 0, 0, 0, 0]]);
break;
}
}
responseData = { status: "success", message: "Nilai berhasil dikosongkan" };
}
} catch (err) {
responseData = { status: "error", message: err.toString() };
}
return ContentService.createTextOutput(JSON.stringify(responseData))
.setMimeType(ContentService.MimeType.JSON);
}
