Rabu, 28 Januari 2026

Formulir Absensi

 






Code.gs

// Code.gs

var sheetName = "Attendance Form";
var headers = ["Timestamp", "First Name", "Last Name", "Position", "Mobile Number", "Signature Image URL"];
var folderId = "15TdXdrtYNst3V5XDXzKT893-4pDKw9yY"; // Replace with your folder ID

function createFormSheet() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  if (!spreadsheet.getSheetByName(sheetName)) {
    spreadsheet.insertSheet(sheetName);
    var sheet = spreadsheet.getSheetByName(sheetName);
    sheet.appendRow(headers);
  }
}

function onSubmitForm(formData) {
  if (!formData) {
    Logger.log("Form data is undefined or null.");
    return;
  }
 
  if (!formData.firstName || !formData.lastName || !formData.position || !formData.mobileNumber || !formData.signature) {
    Logger.log("One or more required fields are missing in form data.");
    return;
  }

  Logger.log("Received form data: " + JSON.stringify(formData));

  var responseData = [new Date(), formData.firstName, formData.lastName, formData.position, formData.mobileNumber];

  // Save signature image to Google Drive
  var signatureImage = formData.signature.split(',')[1]; // Remove data URL header
  var folder = DriveApp.getFolderById(folderId);
  var file = folder.createFile(Utilities.newBlob(Utilities.base64Decode(signatureImage), 'image/png', 'signature.png'));
  var fileUrl = file.getUrl();
  responseData.push(fileUrl);

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  sheet.appendRow(responseData);
}

function doGet() {
  createFormSheet();
  var htmlOutput = HtmlService.createHtmlOutputFromFile('index').setTitle('Attendance Form');
  return htmlOutput;
}

Index.html

<!-- index.html -->

<!DOCTYPE html>
<html>
<head>
  <base target="_top">
  <title>Attendance Form</title>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  <script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
  <style>
    .container {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100vh;
    }
    .form-container {
      max-width: 600px;
    }
    .signature-pad {
      border: 1px solid #cfcfcf;
      width: 300px;
      height: 150px;
      cursor: crosshair;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="form-container">
      <h2 class="mb-4">Attendance Form</h2>
      <form id="attendanceForm">
        <div class="form-row">
          <div class="form-group col-md-6">
            <label for="firstName">First Name:</label>
            <input type="text" class="form-control" id="firstName" name="firstName" required>
          </div>
          <div class="form-group col-md-6">
            <label for="lastName">Last Name:</label>
            <input type="text" class="form-control" id="lastName" name="lastName" required>
          </div>
        </div>
        <div class="form-row">
          <div class="form-group col-md-6">
            <label for="position">Position:</label>
            <input type="text" class="form-control" id="position" name="position" required>
          </div>
          <div class="form-group col-md-6">
            <label for="mobileNumber">Mobile Number:</label>
            <input type="number" class="form-control" id="mobileNumber" name="mobileNumber" required>
          </div>
        </div>
        <div class="form-group">
          <label for="signature">Signature:</label><br>
          <canvas id="signatureCanvas" class="signature-pad"></canvas><br>
          <a href="#" id="clearSignature" class="btn btn-outline-secondary">Clear</a>
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
      </form>
    </div>
  </div>
 
  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.3/dist/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
  <script>
    var canvas = document.getElementById('signatureCanvas');
    var ctx = canvas.getContext('2d');
    var drawing = false;
    var prevX = 0;
    var prevY = 0;

    canvas.addEventListener('mousedown', function(e) {
      drawing = true;
      prevX = e.clientX - canvas.offsetLeft;
      prevY = e.clientY - canvas.offsetTop;
    });

    canvas.addEventListener('mousemove', function(e) {
      if (drawing) {
        var currX = e.clientX - canvas.offsetLeft;
        var currY = e.clientY - canvas.offsetTop;

        ctx.beginPath();
        ctx.moveTo(prevX, prevY);
        ctx.lineTo(currX, currY);
        ctx.strokeStyle = 'black';
        ctx.lineWidth = 2;
        ctx.stroke();

        prevX = currX;
        prevY = currY;
      }
    });

    canvas.addEventListener('mouseup', function() {
      drawing = false;
    });

    canvas.addEventListener('mouseleave', function() {
      drawing = false;
    });

    document.getElementById('clearSignature').addEventListener('click', function(e) {
      e.preventDefault();
      clearCanvas();
    });

    function clearCanvas() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
    }

    document.getElementById('attendanceForm').addEventListener('submit', function(e) {
      e.preventDefault();
      var formData = {
        firstName: document.getElementById('firstName').value,
        lastName: document.getElementById('lastName').value,
        position: document.getElementById('position').value,
        mobileNumber: document.getElementById('mobileNumber').value,
        signature: canvas.toDataURL()
      };
      console.log("Form data to be submitted:", formData);
      google.script.run.withSuccessHandler(showConfirmation).onSubmitForm(formData);
      document.getElementById('attendanceForm').reset();
      clearCanvas();
    });

    function showConfirmation() {
      swal("Success!", "Your attendance has been recorded. Thank you!", "success");
    }
  </script>
</body>
</html>


Senin, 26 Januari 2026

Google Site

 







Prompt Canva

 





Kode.gs

fungsi doPost ( e ) {

  jika (! e || ! e . parameter ) {

    kembalikan ContentService

      .createTextOutput("Tidak ada data yang dikirim")

      .setMimeType ( ContentService.MimeType.TEXT ) ;

  }


  // Ambil sheet aktif bernama "Data Absensi"

  var sheet = SpreadsheetApp.getActiveSpreadsheet (). getSheetByName ( " Data Absensi" );


  // Jika sheet belum ada, buat baru dan tambahkan header

  jika (! lembar ) {

    sheet = SpreadsheetApp.getActiveSpreadsheet ( ). insertSheet ( " Data Absensi" );

    sheet.appendRow(["NIS", "Nama Lengkap", "Kelas", "Tanggal Absen", "Keterangan"]);

  }


  // Ambil data dari request POST

  var nis = e . parameter . NIS ;

  var name = e.parameters [ "FullName " ] ;

  var kelas = e . parameter . kelas ;

  vartanggal = e.parameter["Tanggal Absen"];

  varketerangan = e.parameter.Keterangan;


  // Tambahkan ke baris baru

  sheet.appendRow([nis, nama, kelas, tanggal, keterangan]);


  kembalikan ContentService

    .createTextOutput("Data absen berhasil disimpan.")

    .setMimeType ( ContentService.MimeType.TEXT ) ;

}



Kode untuk Prompt


Pertanyaan 1

Buatkan saya sistem absensi otomatis untuk sekolah “SMK Negeri Indonesia” absensi untuk Guru “Nama” yang terdiri dari 2 kelas: X-TKJ 1 dan X-RPL 1 tampilkan waktu hari dan tanggal secara otomatis di header menggunakan zona waktu WITA


buatkan dashboard adminya yang terdiri dari:

pertama menu untuk guru melakukan absensi siswa

kedua menu untuk melihat data rekap absensi siswa

Ketiga buatkan menu yang dibutuhkan sesuai dengan sistem



ketika guru ingin melakukan absen data siswa otomatis di ambil dari google sheet dengan alamat url publikasi: …


ketika guru mengklik kirim absensi data siswa otomatis terkirim dan tersimpan di google sheet dengan url web aplikasi: …



Ketika tombol kirim absensi di klik ada pemberitahuan to up modal informasi sedang mengirim data mohon menunggu dan ketika semua data siswa terkirim ada informasi berhasil dengan keterangannya.



Pertanyaan 2

pada menu pengaturan hapus saja


pada menu Absensi saya saya ingin data siswa yang tampil diambil otomatis dari google sheet. data saya di google sheet ada 2 kelas yaitu Kelas X-TKJ 1 dan X-RPL 1 tampilkan berdasarkan kelasnya. jadi pada menu Form Absensi Siswa pilih kelas ketika saya klik X-TKJ 1 data muncul sesuai kelas


untuk data siswanya ambil otomatis dari google sheet dengan url Publikasi: …



dan data ketika klik kirim absensi otomatis tersimpan di google sheet.


terkait dengan keterangan saya ingin dipilih secara manual.



Pertanyaan 3

data siswa belum tampil pada menu absensi siswa. data siswa diambil dari google sheet dengan alamat publikasi web: …



Pertanyaan 4

saya ingin data siswa yang tampil dari google sheet dengan nama sheet "Data Siswa" yang terdiri dari kolom A: NIS, B: Nama Lengkap, C: Jenis Kelamin dan D: Kelas


dengan alamat url publikasi web:  …


Pertanyaan 5 

untuk keterangan saya ingin pilih secara manual terkait dengan hadir, izin, sakit dan alpa


ketika saya klik tombol kirim absensi saya ingin semua data terkirim dan tersimpan otomatis pada google sheet dengan alamat url web aplikasi: …..


dan kode apps scriptnya:

….



yang terdiri dari Kolom: A: NIS, B: Nama Lengkap, C: Kelas, D: Tanggal Absen dan E: keterangan 



Pertanyaan 6

untuk menu rekap absensi saya ingin data otomatis tampil secara realtime dari google sheet.

data yang ditampilkan dari google sheet dengan nama sheet "Data Absensi" dengan alamat url publikasi web: …


yang terdiri dari Kolom: A: NIS, B: Nama Lengkap, C: Kelas, D: Tanggal Absen dan E: keterangan 


untuk Filter Data Absensi saya ingin ketika klik kelas ada form pilih siswa. jadi ketika saya pilih kelas X-TKJ 1 ada form pilih siswa X-TKJ 1 


Pada menu absensi siswa saya ingin untuk keterangan: Hadir, Izin, Sakit dan Alpa buat lebih elegan tombol



Prompt 7

saya ingin data yang tampil pada menu rekap absensi dari google sheet secara otomatis dan pada Filter Data Absensi data yang tampil ambil atau tampilkan dari google sheet dengan alamat url Publikasi web: …


dengan nama sheet "Data Absensi"


dan untuk menu Absensi siswa pada Form Absensi Siswa pada keterangan saya ingin tombolnya kecil dan berjejer ke samping atau horizontal



Pertanyaan 8

pada menu rekap absensi data yang tampil belum dari google sheet.


saya ingin data rekap absensi tampil secara otomatis dan realtime dari google sheet. ambil dan tampilkan data pada rekap absensi secara otomatis dari google sheet dengan alamat url publikasi web: ….


untuk sheetnya berada pada sheet ke 2 dengan nama sheet "Data Absensi"



Pertanyaan 9

tampilkan data rekapan pada Data Rekap Absensi dari google sheet dengan alamat url publikasi web: …



Pertanyaan 10

saya ingin pada menu absensi tampilkan data realtime dan otomatis dari google sheet dan untuk Data Rekap Absensi data yang tampil dari google sheet. pada google sheet terdiri dari kolom: A: NIS, B: Nama Lengkap, C: Kelas, D: Tanggal Absen dan E: keterangan 


dan alamat url publikasi webnya: …


dengan nama sheet "Data Absensi" pada sheet ke 2. tampilkan secara realtime



Pertanyaan 11

ini data publikasi url saya : ….


untuk sheet pertama dengan nama sheet "Data Siswa" untuk menu Absensi Siswa


dan untuk sheet kedua dengan nama sheet "Data Absensi" untuk menu rekap absensi


tarik data dari google sheet dengan real time dan otomatis



Pertanyaan 12

untuk menu absensi siswa gunakan url google sheet dengan alamat publikasi: …


dan untuk menu rekap absensi gunakan url google sheet dengan alamat publikasi: …



Pertanyaan 13

datanya belum tampil


untuk menu absensi siswa gunakan url google sheet dengan alamat publikasi: …


terdiri dari Kolom: A: NIS, B: Nama Lengkap, C: Jenis Kelamin dan D: Kelas


dan untuk menu rekap absensi gunakan url google sheet dengan alamat publikasi: …


terdiri dari kolom A: NIS, B: Nama Lengkap, C: Kelas, D: Tanggal Absen dan E: keterangan 



Pertanyaan 14

tampilkan logo sekolah saya dengan alamat image url:...


dan buatkan halaman login keren sebelum melakukan absensi dengan 

nama belakang: …

kata sandi: …




Formulir Absensi

  https://www.youtube.com/watch?v=Fxzhcj-yZ-U&list=PL36UuWSN9z2fPYaM8BO-Aa2DVPXzBUI4Z https://www.codewithai.my.id/2024/03/project-1-mem...