Google Apps Script untuk Absensi Sekolah — Rekap Otomatis di Google Spreadsheet

Google Apps Script untuk Absensi Sekolah — Rekap Otomatis di Google Spreadsheet
Google Apps Script ✦ Gratis · No-Server

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.

✦ Live Demo — Apps Script Membangun Aplikasi Absensi ✦

🏆 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.

💡
Cocok untuk semua jenjang pendidikan Sistem ini bisa diterapkan di SD, SMP, SMA, maupun SMK. Cukup sesuaikan nama kelas dan struktur data Spreadsheet sesuai kebutuhan sekolahmu.

⚙️ Persiapan & Setup Awal

Sebelum mulai, siapkan komponen-komponen berikut. Semua gratis dan bisa selesai dalam 15 menit:

1
Buat Google Spreadsheet Baru

Buka sheets.google.com → Buat spreadsheet baru → Beri nama Absensi_Sekolah_2025. Buat sheet dengan nama: DataAbsensi, RekapHarian, RekapBulanan.

2
Buat Google Form untuk Input Absensi

Buka forms.google.com → Form baru → Tambahkan kolom: Nama Siswa (dropdown/pilihan), Kelas, Status Kehadiran (Hadir / Izin / Sakit / Alpha), dan Keterangan.

3
Hubungkan Form ke Spreadsheet

Di Google Form → klik tab Responses → klik ikon Spreadsheet hijau → pilih spreadsheet yang sudah dibuat tadi. Respons form akan otomatis masuk ke Spreadsheet.

4
Buka Apps Script Editor

Di Spreadsheet → klik menu Extensions → Apps Script. Editor script akan terbuka. Di sinilah kamu akan menempelkan kode-kode otomatisasi.

5
Copy-Paste Script & Simpan

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:

📱 Siswa/Guru
Isi Google Form
📊 Spreadsheet
Data masuk otomatis
⚙️ Apps Script
Proses & validasi
📈 Rekap
Harian & Bulanan
🔔 Notifikasi
Email / WA Guru
0s Waktu rekap otomatis
100% Bebas biaya
24/7 Aktif tanpa server
Kelas yang bisa dikelola
ℹ️
Trigger Form Submission Apps Script berjalan secara otomatis setiap kali ada siswa yang mengisi Google Form. Tidak perlu ada yang "menjalankan" script secara manual — semuanya terjadi di belakang layar, real-time.

💻 Script Absensi Lengkap

Berikut kode Google Apps Script lengkap untuk sistem absensi. Salin dan tempel ke Apps Script Editor:

Absensi_Sekolah.gs — GOOGLE APPS SCRIPT
// ══════════════════════════════════════════════════════
// 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.gs — GOOGLE APPS SCRIPT
// ── 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.gs — GOOGLE APPS SCRIPT
// ── 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!");
}
🎉
Laporan Otomatis ke Email Kepala Sekolah Dengan menambahkan fungsi 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:

📱
WhatsApp — Notifikasi Wali Murid Integrasikan dengan Fonnte / WA Gateway API untuk kirim pesan WA otomatis ke orang tua siswa yang tidak hadir.
📧
Gmail — Email Rekap Otomatis Kirim rekap harian / mingguan / bulanan ke wali kelas dan kepala sekolah via GmailApp secara otomatis.
📊
Google Data Studio / Looker Studio Buat dashboard visual interaktif dari data Spreadsheet — grafik kehadiran, tren per kelas, siswa paling sering alpha.
🤖
Telegram Bot — Rekap via Chat Hubungkan ke Telegram Bot API — guru bisa minta rekap harian cukup dengan mengirim pesan ke bot Telegram.
🔐
QR Code — Absensi Tanpa Kertas Generate QR Code unik per siswa menggunakan Google Apps Script. Scan QR → form otomatis terisi → absensi tercatat.
🚀 Langkah selanjutnya: Buat Google Site sebagai portal absensi sekolah yang terintegrasi langsung dengan Spreadsheet dan Apps Script. Tampilan profesional tanpa biaya hosting!

FAQ — Pertanyaan Umum

Apakah sistem ini benar-benar gratis tanpa batas?
Ya, Google Apps Script, Google Forms, Gmail, dan Spreadsheet semuanya gratis dengan akun Google biasa. Batas penggunaan harian Google Apps Script sangat besar (6 jam eksekusi/hari) — lebih dari cukup untuk absensi ribuan siswa.
Apakah guru perlu bisa coding untuk menggunakannya?
Tidak sama sekali! Guru hanya perlu mengisi Google Form atau memantau Spreadsheet. Script hanya perlu di-setup satu kali oleh admin/operator sekolah. Setelah itu semua berjalan otomatis tanpa perlu sentuh kode sama sekali.
Bagaimana cara backup data absensi agar tidak hilang?
Data otomatis tersimpan di Google Drive yang sudah di-backup oleh Google. Untuk keamanan ekstra, tambahkan script yang mengekspor Spreadsheet ke PDF setiap bulan dan menyimpannya di folder Google Drive tersendiri.
Bisakah digunakan untuk banyak kelas sekaligus?
Tentu! Cukup tambahkan kolom "Kelas" di Google Form dan script otomatis akan memisahkan rekap per kelas. Tidak ada batasan jumlah kelas yang bisa dikelola dalam satu Spreadsheet.
Apakah bisa mengirim notifikasi ke WhatsApp orang tua?
Bisa! Integrasikan Apps Script dengan layanan WA Gateway seperti Fonnte.com atau WA Gateway lainnya. Cukup tambahkan nomor HP wali murid di Spreadsheet dan script akan otomatis mengirim WA saat siswa tidak hadir.
Lebih baru Lebih lama