Sistem
Absensi
Sekolah
dengan Google Apps Script
Bangun sistem absensi siswa otomatis menggunakan Google Apps Script dan Google Spreadsheet — gratis, tanpa server, mudah digunakan guru, dan rekap kehadiran harian maupun bulanan berjalan sendiri.
| Tanggal | Nama Siswa | Kelas | Status |
|---|---|---|---|
| 22/04 | Andi Pratama | VII-A | ✅ Hadir |
| 22/04 | Budi Santoso | VII-A | ✅ Hadir |
| 22/04 | Citra Dewi | VII-A | 📋 Izin |
| 22/04 | Dian Kusuma | VII-A | ✅ Hadir |
| 22/04 | Eka Putri | VII-A | ❌ Alpha |
🏆 Kenapa Pilih Google Apps Script?
Banyak sekolah masih mencatat absensi secara manual di kertas atau Excel statis, yang rawan kehilangan data, sulit direkap, dan membutuhkan waktu lama. Google Apps Script (GAS) hadir sebagai solusi modern yang:
Gratis Sepenuhnya
Tidak ada biaya lisensi, hosting, atau server. Cukup akun Google.
Berbasis Cloud
Data tersimpan di Google Drive, aman, dan bisa diakses dari mana saja.
Otomatis Penuh
Rekap harian dan bulanan dibuat otomatis tanpa campur tangan manual.
Google Spreadsheet
Data tersimpan rapi di Spreadsheet yang bisa diedit & dianalisis kapan saja.
Akses HP/PC
Guru & siswa bisa mengisi absensi lewat Google Forms dari HP mana pun.
Notifikasi Otomatis
Kirim email atau WA ke guru dan wali murid saat ada siswa tidak hadir.
⚙️ Persiapan & Setup Awal
Sebelum mulai, siapkan komponen-komponen berikut. Semua gratis dan bisa selesai dalam 15 menit:
Buka sheets.google.com → Buat spreadsheet baru → Beri nama Absensi_Sekolah_2025. Buat sheet dengan nama: DataAbsensi, RekapHarian, RekapBulanan.
Buka forms.google.com → Form baru → Tambahkan kolom: Nama Siswa (dropdown/pilihan), Kelas, Status Kehadiran (Hadir / Izin / Sakit / Alpha), dan Keterangan.
Di Google Form → klik tab Responses → klik ikon Spreadsheet hijau → pilih spreadsheet yang sudah dibuat tadi. Respons form akan otomatis masuk ke Spreadsheet.
Di Spreadsheet → klik menu Extensions → Apps Script. Editor script akan terbuka. Di sinilah kamu akan menempelkan kode-kode otomatisasi.
Salin script di bawah ini → tempel di editor → tekan Ctrl+S atau klik ikon Save. Setelah itu jalankan fungsi setupTrigger() sekali untuk mengaktifkan trigger otomatis.
🔄 Cara Kerja Sistem Absensi
Berikut alur lengkap sistem absensi dari input siswa hingga rekap laporan untuk kepala sekolah:
Isi Google Form
Data masuk otomatis
Proses & validasi
Harian & Bulanan
Email / WA Guru
💻 Script Absensi Lengkap
Berikut kode Google Apps Script lengkap untuk sistem absensi. Salin dan tempel ke Apps Script Editor:
// ══════════════════════════════════════════════════════
// SISTEM ABSENSI SEKOLAH — Google Apps Script
// Simpan di: Extensions → Apps Script
// ══════════════════════════════════════════════════════
// ── Konfigurasi Utama ─────────────────────────────────
const CONFIG = {
spreadsheetId : "", // Kosongkan = gunakan sheet aktif
sheetAbsensi : "DataAbsensi",
sheetRekap : "RekapHarian",
sheetBulanan : "RekapBulanan",
emailGuru : "guru@sekolah.sch.id",
namaSekolah : "SMP Negeri 1 Contoh",
};
// ── Helper: Ambil Spreadsheet ─────────────────────────
function getSS() {
return CONFIG.spreadsheetId
? SpreadsheetApp.openById(CONFIG.spreadsheetId)
: SpreadsheetApp.getActiveSpreadsheet();
}
function getSheet(name) {
return getSS().getSheetByName(name);
}
// ── Format Tanggal Indonesia ──────────────────────────
function formatTanggal(d) {
const bln = ["Jan","Feb","Mar","Apr","Mei","Jun",
"Jul","Ags","Sep","Okt","Nov","Des"];
return `${d.getDate()} ${bln[d.getMonth()]} ${d.getFullYear()}`;
}
// ── Trigger: Dipanggil otomatis tiap Form diisi ───────
function catatAbsensi(e) {
try {
const resp = e.namedValues;
const tgl = new Date();
const nama = resp["Nama Siswa"]?.[0]?.trim() || "";
const kelas = resp["Kelas"]?.[0]?.trim() || "";
const status = resp["Status Kehadiran"]?.[0] || "";
const ket = resp["Keterangan"]?.[0] || "-";
// Simpan ke sheet DataAbsensi
getSheet(CONFIG.sheetAbsensi).appendRow([
formatTanggal(tgl),
Utilities.formatDate(tgl, "Asia/Jakarta", "HH:mm"),
nama, kelas, status, ket
]);
// Kirim notifikasi jika tidak hadir
if (["Alpha", "Sakit"].includes(status)) {
kirimNotifikasi(nama, kelas, status, tgl);
}
} catch(err) {
Logger.log("Error catatAbsensi: " + err);
}
}
// ── Kirim Email Notifikasi ke Guru ────────────────────
function kirimNotifikasi(nama, kelas, status, tgl) {
const subj = `[Absensi] ${nama} - ${status} - ${formatTanggal(tgl)}`;
const body = `
Yth. Bapak/Ibu Guru,
Informasi Ketidakhadiran Siswa:
━━━━━━━━━━━━━━━━━━━━━
Nama : ${nama}
Kelas : ${kelas}
Status : ${status}
Tanggal: ${formatTanggal(tgl)}
━━━━━━━━━━━━━━━━━━━━━
Mohon ditindaklanjuti.
Salam,
Sistem Absensi ${CONFIG.namaSekolah}
`;
GmailApp.sendEmail(CONFIG.emailGuru, subj, body);
}
// ── Setup Trigger (jalankan sekali saja) ──────────────
function setupTrigger() {
// Hapus trigger lama dulu
ScriptApp.getProjectTriggers().forEach(t =>
ScriptApp.deleteTrigger(t)
);
// Buat trigger baru: jalankan saat Form disubmit
ScriptApp.newTrigger("catatAbsensi")
.forSpreadsheet(getSS())
.onFormSubmit()
.create();
Logger.log("✅ Trigger berhasil dibuat!");
}
📅 Rekap Harian Otomatis
Script ini membuat rekap harian yang dijalankan secara otomatis setiap hari pada pukul 14.00 (setelah jam sekolah), mengumpulkan semua data absensi hari itu ke sheet RekapHarian.
// ── Rekap Harian (otomatis jam 14:00) ────────────────
function buatRekapHarian() {
const hari = formatTanggal(new Date());
const src = getSheet(CONFIG.sheetAbsensi);
const rekap = getSheet(CONFIG.sheetRekap);
const rows = src.getDataRange().getValues();
// Hitung per kelas
const stats = {};
rows.slice(1).forEach((r) => {
if (r[0] !== hari) return;
const kelas = r[3];
const status = r[4];
if (!stats[kelas]) {
stats[kelas] = { H:0, I:0, S:0, A:0 };
}
if (status === "Hadir") stats[kelas].H++;
if (status === "Izin") stats[kelas].I++;
if (status === "Sakit") stats[kelas].S++;
if (status === "Alpha") stats[kelas].A++;
});
// Tulis ke sheet RekapHarian
const lastRow = rekap.getLastRow();
if (lastRow === 0) {
// Header baris pertama
rekap.appendRow([
"Tanggal", "Kelas", "Hadir",
"Izin", "Sakit", "Alpha", "Total"
]);
}
Object.entries(stats).forEach(([kelas, s]) => {
const total = s.H + s.I + s.S + s.A;
rekap.appendRow([hari, kelas, s.H, s.I, s.S, s.A, total]);
});
// Kirim email ringkasan ke guru
kirimRingkasanHarian(hari, stats);
}
// ── Trigger rekap harian jam 14:00 ────────────────────
function setupTriggerHarian() {
ScriptApp.newTrigger("buatRekapHarian")
.timeBased()
.everyDays(1)
.atHour(14)
.create();
}
Contoh Hasil Rekap Harian
| Tanggal | Kelas | Hadir | Izin | Sakit | Alpha | Total | % Hadir |
|---|---|---|---|---|---|---|---|
| 22 Apr 2025 | VII-A | 30 | 2 | 1 | 1 | 34 | 88.2% |
| 22 Apr 2025 | VII-B | 32 | 1 | 0 | 0 | 33 | 97.0% |
| 22 Apr 2025 | VIII-A | 28 | 3 | 2 | 2 | 35 | 80.0% |
| 22 Apr 2025 | IX-A | 33 | 0 | 1 | 0 | 34 | 97.1% |
📊 Rekap Bulanan & Laporan
Rekap bulanan dijalankan otomatis di akhir setiap bulan (tanggal terakhir, pukul 15.00). Laporan lengkap per siswa dikirimkan ke email kepala sekolah dan wali kelas secara otomatis.
// ── Rekap Bulanan per Siswa ───────────────────────────
function buatRekapBulanan() {
const now = new Date();
const bln = ["Jan","Feb","Mar","Apr",
"Mei","Jun","Jul","Ags",
"Sep","Okt","Nov","Des"];
const bulan = `${bln[now.getMonth()]} ${now.getFullYear()}`;
const src = getSheet(CONFIG.sheetAbsensi);
const target = getSheet(CONFIG.sheetBulanan);
const rows = src.getDataRange().getValues();
// Hitung total per siswa bulan ini
const siswaMap = {};
rows.slice(1).forEach(r => {
const [tgl,,nama,kelas,status] = r;
// Cek bulan yang sama
if (!new Date(tgl).getMonth() === now.getMonth()) return;
const key = `${kelas}|${nama}`;
if (!siswaMap[key])
siswaMap[key] = {kelas, nama, H:0, I:0, S:0, A:0};
if (status==="Hadir") siswaMap[key].H++;
if (status==="Izin") siswaMap[key].I++;
if (status==="Sakit") siswaMap[key].S++;
if (status==="Alpha") siswaMap[key].A++;
});
// Header
target.appendRow([
bulan, "Kelas", "Nama Siswa",
"Hadir", "Izin", "Sakit", "Alpha",
"Total Hari", "% Kehadiran"
]);
// Isi data per siswa
Object.values(siswaMap)
.sort((a,b) => a.kelas.localeCompare(b.kelas))
.forEach(s => {
const total = s.H + s.I + s.S + s.A;
const persen = total ? Math.round(s.H/total*100) : 0;
target.appendRow([
bulan, s.kelas, s.nama,
s.H, s.I, s.S, s.A, total, `${persen}%`
]);
});
Logger.log("✅ Rekap bulanan selesai!");
}
GmailApp.sendEmail() di akhir buatRekapBulanan(), laporan rekap bulanan bisa otomatis terkirim sebagai lampiran PDF ke email kepala sekolah setiap akhir bulan.
🔗 Integrasi & Pengembangan Lanjutan
Sistem absensi ini bisa dikembangkan lebih jauh dengan menghubungkan berbagai layanan lain untuk mempermudah guru dan orang tua dalam memantau kehadiran siswa:
