Langkah 1: Buka Sheet
Buka Google Sheets ID: 12m-TStaKryZWmv9LQdEiZ5BQOOXFxBMCebJRahFidgE
Langkah 2: Buka Editor
Klik menu Ekstensi (Extensions) > Apps Script. Hapus isi default.
Langkah 3: Tempel & Deploy
Tempel script di bawah. Klik Deploy > Manage deployments > Edit ke versi baru.
Langkah 4: Akses Izin
Pilih Execute as: Me dan Who has access: Anyone.
/**
* Google Apps Script - Sistem Registrasi & Absensi Barcode PGRI
* Kegiatan: PGRI KONFERENSI KERJA II
* ID Spreadsheet: 12m-TStaKryZWmv9LQdEiZ5BQOOXFxBMCebJRahFidgE
*/
var SPREADSHEET_ID = "12m-TStaKryZWmv9LQdEiZ5BQOOXFxBMCebJRahFidgE";
var SHEET_NAME = "Data_Peserta";
function getTargetSheet() {
var ss;
try {
ss = SpreadsheetApp.openById(SPREADSHEET_ID);
} catch(e) {
ss = SpreadsheetApp.getActiveSpreadsheet();
}
var sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) {
sheet = ss.insertSheet(SHEET_NAME);
sheet.appendRow([
"ID Peserta",
"Nama Lengkap",
"NPA / NUPTK",
"Unit Kerja",
"Cabang",
"Jabatan",
"No HP",
"Status Kehadiran",
"Waktu Hadir",
"Tanggal Pendaftaran"
]);
sheet.getRange("A1:J1").setFontWeight("bold").setBackground("#D32F2F").setFontColor("#FFFFFF");
sheet.setFrozenRows(1);
}
return sheet;
}
function doPost(e) {
var lock = LockService.getScriptLock();
lock.tryLock(15000);
try {
var sheet = getTargetSheet();
var data = JSON.parse(e.postData.contents);
var action = data.action;
// 1. Registrasi Peserta Baru
if (action === "REGISTER") {
var p = data.payload;
var newRow = [
p.id,
p.nama,
p.npa || "-",
p.unit,
p.cabang,
p.jabatan,
p.hp,
"Belum Hadir",
"-",
new Date().toLocaleString("id-ID", { timeZone: "Asia/Makassar" })
];
sheet.appendRow(newRow);
return ContentService.createTextOutput(JSON.stringify({
status: "success",
message: "Registrasi berhasil disimpan",
data: p
})).setMimeType(ContentService.MimeType.JSON);
}
// 2. Scan Absen / Check-in
if (action === "CHECKIN") {
var searchId = String(data.id).trim().toUpperCase();
var values = sheet.getDataRange().getValues();
var found = false;
var attendeeInfo = {};
for (var i = 1; i < values.length; i++) {
var rowId = String(values[i][0]).trim().toUpperCase();
if (rowId === searchId) {
found = true;
var timestamp = new Date().toLocaleString("id-ID", { timeZone: "Asia/Makassar" });
sheet.getRange(i + 1, 8).setValue("Hadir");
sheet.getRange(i + 1, 9).setValue(timestamp);
attendeeInfo = {
id: values[i][0],
nama: values[i][1],
npa: values[i][2],
unit: values[i][3],
cabang: values[i][4],
jabatan: values[i][5],
hp: values[i][6],
status: "Hadir",
waktuHadir: timestamp
};
break;
}
}
if (found) {
return ContentService.createTextOutput(JSON.stringify({
status: "success",
message: "Presensi berhasil dicatat",
data: attendeeInfo
})).setMimeType(ContentService.MimeType.JSON);
} else {
return ContentService.createTextOutput(JSON.stringify({
status: "error",
message: "ID Peserta (" + searchId + ") tidak ditemukan dalam daftar!"
})).setMimeType(ContentService.MimeType.JSON);
}
}
// 3. Ambil Semua Data Peserta via POST
if (action === "GET_ALL") {
return getAllDataResponse(sheet);
}
return ContentService.createTextOutput(JSON.stringify({
status: "error",
message: "Action tidak dikenali"
})).setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({
status: "error",
message: err.toString()
})).setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}
function doGet(e) {
var action = (e && e.parameter && e.parameter.action) ? e.parameter.action : "GET_ALL";
var sheet = getTargetSheet();
if (action === "GET_ALL") {
return getAllDataResponse(sheet);
}
return ContentService.createTextOutput(JSON.stringify({
status: "online",
event: "PGRI Konferensi Kerja II - API Service Ready",
spreadsheetId: SPREADSHEET_ID
})).setMimeType(ContentService.MimeType.JSON);
}
function getAllDataResponse(sheet) {
var rows = sheet.getDataRange().getValues();
var list = [];
for (var r = 1; r < rows.length; r++) {
if (rows[r][0]) {
list.push({
id: String(rows[r][0]),
nama: String(rows[r][1] || ""),
npa: String(rows[r][2] || "-"),
unit: String(rows[r][3] || ""),
cabang: String(rows[r][4] || ""),
jabatan: String(rows[r][5] || ""),
hp: String(rows[r][6] || ""),
status: String(rows[r][7] || "Belum Hadir").toUpperCase() === "HADIR" ? "HADIR" : "BELUM",
waktuHadir: String(rows[r][8] || "-")
});
}
}
return ContentService.createTextOutput(JSON.stringify({
status: "success",
data: list
})).setMimeType(ContentService.MimeType.JSON);
}