0
Total Peserta
0
Sudah Check-in
0
Belum Hadir
Progress Check-in 0%
Peserta Terbaru
๐Ÿ“‹
Belum ada peserta
Aksi Cepat
QR di sini berisi ID Unik setiap peserta. Download โ†’ kirim via email / WA ke masing-masing peserta.
Generate QR Individual
Pilih peserta dari daftar atau masukkan ID manual
Cara Kerja
1
Pilih peserta & generate QR
Setiap peserta dapat QR unik berisi ID mereka
2
Download & kirim manual
Kirim via email atau WA ke masing-masing peserta
3
Hari H: Scan โ†’ Check-in otomatis
Scanner HP panitia baca QR โ†’ data masuk Google Sheets
Klik Mulai Kamera
IDNamaInstansiEmailNo. HP StatusTerdaftarAksi
๐Ÿ‘ฅ
Belum ada peserta
Nama Event
Nama ini ditampilkan di dashboard
Google Sheets Integration
Paste URL Apps Script Web App kamu di sini. URL ini didapat setelah kamu deploy script di Google Sheets.
Lihat panduan setup di bawah โ€” URL berbentuk: https://script.google.com/macros/s/.../exec
๐Ÿ“‹ Panduan Setup Google Sheets
Ikuti langkah ini untuk menghubungkan AO Event dengan Google Sheets kamu
Step 1 โ€” Buat Google Form
Buat form dengan field: Nama Lengkap, Instansi, Email, No. HP. Setelah form dibuat, Google Sheets otomatis tersambung.
Step 2 โ€” Buka Apps Script
Di Google Sheets โ†’ menu Extensions โ†’ Apps Script โ†’ paste kode script dari panduan โ†’ Save.
Step 3 โ€” Deploy Web App
Deploy โ†’ New Deployment โ†’ Web App. Set "Who has access" ke Anyone. Copy URL yang muncul โ†’ paste di field atas.
Step 4 โ€” Test & Selesai
Klik "Test Koneksi" di atas. Kalau berhasil, data peserta dari Sheets akan sinkron ke app ini.
๐Ÿ“„ Kode Apps Script
Copy kode ini ke Google Apps Script kamu
// ============================================
// AO Event โ€” Apps Script for Google Sheets
// Paste this in Extensions > Apps Script
// ============================================

const SHEET_NAME = "Form Responses 1"; // Sesuaikan nama sheet kamu

function doGet(e) {
  const action = e.parameter.action || "list";
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(SHEET_NAME);
  const data = sheet.getDataRange().getValues();
  const headers = data[0];

  if (action === "list") {
    const rows = data.slice(1).map((row, i) => {
      const id = "EVT-" + String(i+1).padStart(3,"0");
      return {
        id: id,
        nama: row[1] || "",
        instansi: row[2] || "",
        email: row[3] || "",
        hp: row[4] || "",
        ci: row[5] === true || row[5] === "TRUE",
        ciTime: row[6] || null,
        regAt: row[0] || ""
      };
    });
    return ContentService
      .createTextOutput(JSON.stringify({ok:true, data:rows}))
      .setMimeType(ContentService.MimeType.JSON);
  }

  if (action === "checkin") {
    const id = e.parameter.id;
    const rows = data.slice(1);
    for (let i = 0; i < rows.length; i++) {
      const rowId = "EVT-" + String(i+1).padStart(3,"0");
      if (rowId === id) {
        if (rows[i][5] === true || rows[i][5] === "TRUE") {
          return ContentService
            .createTextOutput(JSON.stringify({ok:false, alreadyIn:true, nama:rows[i][1]}))
            .setMimeType(ContentService.MimeType.JSON);
        }
        sheet.getRange(i+2, 6).setValue(true);
        sheet.getRange(i+2, 7).setValue(new Date().toISOString());
        return ContentService
          .createTextOutput(JSON.stringify({ok:true, nama:rows[i][1], instansi:rows[i][2], email:rows[i][3]}))
          .setMimeType(ContentService.MimeType.JSON);
      }
    }
    return ContentService
      .createTextOutput(JSON.stringify({ok:false, notFound:true}))
      .setMimeType(ContentService.MimeType.JSON);
  }

  return ContentService
    .createTextOutput(JSON.stringify({ok:true, msg:"AO Event API Ready"}))
    .setMimeType(ContentService.MimeType.JSON);
}
      
โš ๏ธ Pastikan kolom di Sheets kamu: Timestamp | Nama | Instansi | Email | HP | CheckIn | CheckInTime. Kolom CheckIn & CheckInTime ditambahkan manual.