Jumlah Pensyarah
{{ totalLecturers }} orang
Sesi {{ selectedSemester }}
Selesai Semua (100%)
{{ totalLengkap }} orang
Semua folder lengkap
Sedang Proses
{{ totalProgres }} orang
Hantar sebahagian folder
Belum Hantar Langsung
{{ totalBelum }} orang
Kosong (0% progres)
{{ editingLecturer ? 'Kemaskini Fail Kursus Pensyarah' : 'Masukkan Rekod Fail Kursus Baru' }}
1. Analisis Kualiti Fail Mengikut Fakulti ({{ selectedSemester }})
| No. | Nama Fakulti / Pusat Pengajian | Jum. Pensyarah | Lengkap Semua | Sedang Proses | Belum Hantar Langsung | Kadar Kelulusan (%) | Tindakan |
|---|---|---|---|---|---|---|---|
| {{ idx + 1 }} | {{ row.fakulti }} ({{ row.singkatan }}) | {{ row.pensyarah }} | {{ row.lengkap }} | {{ row.tidakLengkap }} | {{ row.belum }} |
{{ getCompleteRate(row) }}%
|
|
2. Rekod Semakan Fail Kursus Staf Akademik
Senarai nama pensyarah berserta progres pemfailan bagi kesemua kursus yang diajar.
| Bil. | Pensyarah & Fakulti | Pecahan Progres Fail Kursus | Status Keseluruhan | Tindakan |
|---|---|---|---|---|
| {{ index + 1 }} |
{{ lecturer.nama }}
{{ lecturer.fakulti }}
{{ lecturer.jawatan }}
|
đ KURSUS: {{ kursus.kodKursus }}
Progres: {{ getCourseProgress(kursus) }}%
{{ f.label.replace('F', '') }}
Ulasan: {{ kursus.catatan }}
|
BELUM HANTAR
SELESAI KESEMUA
SEDANG PROSES
({{ countCompletedCourses(lecturer) }}/{{ lecturer.senaraiKursus.length }} Selesai)
|
|
| Tiada rekod saringan dijumpai dalam pangkalan data. | ||||
đ Import Laporan CSV Fail Kursus
Anda boleh mengemas kini senarai pensyarah dan subjek serentak menggunakan CSV atau tampal terus dari Excel.
Muat Naik Fail Laporan (.csv)
Muat Turun Templat Data
Muat turun templat CSV untuk memasukkan senarai pensyarah dan subjek secara berkelompok.
Tampal Terus Sel Dari Excel:
âī¸ Integrasi Pangkalan Data Awan
Konfigurasi API
Kod Google Apps Script
// Kod Apps Script Google Sheets Backend KIAS (Lengkap doGet dan doPost)
function doGet(e) {
var action = e.parameter.action;
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (action === "loadAll") {
var sessionSheet = ss.getSheetByName("SESI_AKADEMIK") || createSessionSheet(ss);
var sessionRows = sessionSheet.getDataRange().getValues();
var sessions = [];
for (var i = 1; i < sessionRows.length; i++) {
if (sessionRows[i][0]) sessions.push(sessionRows[i][0].toString().trim());
}
var jsonSheet = ss.getSheetByName("DATABASE_JSON") || ss.insertSheet("DATABASE_JSON");
var jsonRows = jsonSheet.getDataRange().getValues();
var payloadMap = {};
for (var j = 1; j < jsonRows.length; j++) {
if (jsonRows[j][0]) {
payloadMap[jsonRows[j][0]] = JSON.parse(jsonRows[j][1]);
}
}
var responseData = {
academicSessions: sessions,
payloadMap: payloadMap
};
return ContentService.createTextOutput(JSON.stringify({status: "success", data: responseData}))
.setMimeType(ContentService.MimeType.JSON);
}
return ContentService.createTextOutput(JSON.stringify({status: "error", message: "Action tidak sah."}))
.setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
try {
var postData = JSON.parse(e.postData.contents);
var action = postData.action;
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (action === "saveAll") {
// Simpan Sesi Akademik
var sessionSheet = ss.getSheetByName("SESI_AKADEMIK") || createSessionSheet(ss);
sessionSheet.clear();
sessionSheet.appendRow(["Sesi Akademik"]);
var sessions = postData.academicSessions || [];
sessions.forEach(function(s) {
if (s) sessionSheet.appendRow([s]);
});
// Simpan Draf Payload JSON (Termasuk pautan Google Drive)
var jsonSheet = ss.getSheetByName("DATABASE_JSON") || ss.insertSheet("DATABASE_JSON");
jsonSheet.clear();
jsonSheet.appendRow(["Sesi_Akademik", "Payload_JSON"]);
var payloadMap = postData.payloadMap || {};
Object.keys(payloadMap).forEach(function(sessionKey) {
jsonSheet.appendRow([sessionKey, JSON.stringify(payloadMap[sessionKey])]);
});
return ContentService.createTextOutput(JSON.stringify({status: "success", message: "Data berjaya disimpan!"}))
.setMimeType(ContentService.MimeType.JSON);
}
return ContentService.createTextOutput(JSON.stringify({status: "error", message: "Action tidak disokong."}))
.setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({status: "error", message: err.toString()}))
.setMimeType(ContentService.MimeType.JSON);
}
}
function createSessionSheet(ss) {
var sheet = ss.insertSheet("SESI_AKADEMIK");
sheet.appendRow(["Sesi Akademik"]);
sheet.appendRow(["2025/2026 - SEM 2"]);
sheet.appendRow(["2025/2026 - SEM 1"]);
sheet.appendRow(["2024/2025 - SEM 2"]);
sheet.appendRow(["2024/2025 - SEM 1"]);
return sheet;
}
Panduan Struktur Folder
{{ groupName }}
âĸ {{ item.desc }}