// ========================================
// KODE APPS SCRIPT - KEHADIRAN SISWA
// VERSI DIPERBAIKI - AUTO DETECT SHEET
// ========================================
// Petunjuk:
// 1. Buka Google Sheets baru atau yang sudah ada
// 2. Pastikan ada sheet dengan nama "Kehadiran" ATAU gunakan sheet pertama
// 3. Buat header di baris pertama: Nama | Kelas | Tanggal | Kehadiran | Catatan
// 4. Buka Extensions > Apps Script
// 5. Hapus semua kode default, paste kode ini
// 6. Klik ikon "Deploy" > "New deployment"
// 7. Klik ikon roda gigi, pilih type: "Web app"
// 8. Execute as: Me
// 9. Who has access: Anyone
// 10. Klik "Deploy"
// 11. Copy URL Web app dan paste di aplikasi
// ========================================
function doGet(e) {
return handleRequest(e);
}
function doPost(e) {
return handleRequest(e);
}
function handleRequest(e) {
var output = ContentService.createTextOutput();
output.setMimeType(ContentService.MimeType.JSON);
try {
var action = e.parameter.action || 'read';
var result;
switch(action) {
case 'read':
result = getData();
break;
case 'update':
result = updateData(e.parameter);
break;
case 'test':
result = testConnection();
break;
default:
result = getData();
}
output.setContent(JSON.stringify(result));
} catch(error) {
output.setContent(JSON.stringify({
success: false,
error: 'Error: ' + error.toString(),
stack: error.stack
}));
}
return output;
}
function getSheet() {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Coba cari sheet dengan nama "Kehadiran" (case insensitive)
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++) {
var sheetName = sheets[i].getName().toLowerCase();
if (sheetName === 'kehadiran') {
return sheets[i];
}
}
// Jika tidak ditemukan, gunakan sheet pertama
if (sheets.length > 0) {
return sheets[0];
}
return null;
} catch(error) {
throw new Error('Gagal mengakses spreadsheet: ' + error.toString());
}
}
function testConnection() {
try {
var sheet = getSheet();
if (!sheet) {
return {
success: false,
error: 'Tidak ada sheet yang tersedia. Buat sheet baru di spreadsheet Anda.'
};
}
var sheetName = sheet.getName();
var rowCount = sheet.getLastRow();
var colCount = sheet.getLastColumn();
return {
success: true,
message: 'Koneksi berhasil!',
sheetName: sheetName,
rows: rowCount,
columns: colCount,
info: 'Sheet "' + sheetName + '" ditemukan dengan ' + rowCount + ' baris data'
};
} catch(error) {
return {
success: false,
error: 'Test koneksi gagal: ' + error.toString()
};
}
}
function getData() {
try {
var sheet = getSheet();
if (!sheet) {
return {
success: false,
error: 'Sheet tidak ditemukan. Pastikan Anda memiliki minimal satu sheet di spreadsheet.',
hint: 'Buat sheet dengan nama "Kehadiran" atau pastikan ada minimal 1 sheet'
};
}
var lastRow = sheet.getLastRow();
// Jika sheet kosong atau hanya ada header
if (lastRow < 2) {
return {
success: true,
data: [],
total: 0,
sheetName: sheet.getName(),
message: 'Sheet ditemukan tapi belum ada data. Silakan tambahkan data di Google Sheets.'
};
}
var data = sheet.getDataRange().getValues();
var headers = data[0];
var result = [];
// Validasi header
var requiredHeaders = ['Nama', 'Kelas', 'Tanggal', 'Kehadiran', 'Catatan'];
var headerLower = headers.map(function(h) { return String(h).toLowerCase(); });
for (var i = 1; i < data.length; i++) {
var row = {};
for (var j = 0; j < headers.length; j++) {
var header = String(headers[j]).trim();
if (header) {
row[header] = data[i][j];
}
}
row['_row'] = i + 1; // Simpan nomor baris untuk update (1-based)
result.push(row);
}
return {
success: true,
data: result,
total: result.length,
sheetName: sheet.getName(),
headers: headers
};
} catch(error) {
return {
success: false,
error: 'Gagal membaca data: ' + error.toString(),
stack: error.stack
};
}
}
function updateData(params) {
try {
var sheet = getSheet();
if (!sheet) {
return { success: false, error: 'Sheet tidak ditemukan' };
}
var row = parseInt(params.row);
var col = parseInt(params.col);
var value = params.value || '';
if (isNaN(row) || isNaN(col)) {
return { success: false, error: 'Parameter row atau col tidak valid' };
}
sheet.getRange(row, col).setValue(value);
return {
success: true,
message: 'Data berhasil diupdate',
updated: {
row: row,
col: col,
value: value
}
};
} catch(error) {
return {
success: false,
error: 'Gagal update data: ' + error.toString()
};
}
}
// ========================================
// CARA DEPLOY (LENGKAP):
// ========================================
// 1. Pastikan Anda sudah login ke Google Account
// 2. Buka/Buat Google Sheets baru
// 3. Buat sheet dengan nama "Kehadiran" (atau gunakan sheet default)
// 4. Isi baris pertama dengan header:
// Nama | Kelas | Tanggal | Kehadiran | Catatan
// 5. Tambahkan beberapa data contoh (opsional)
// 6. Klik menu "Extensions" > "Apps Script"
// 7. Hapus semua kode yang ada (function myFunction)
// 8. Paste kode ini
// 9. Klik ikon "Deploy" (di kanan atas, sebelah Debug)
// 10. Pilih "New deployment"
// 11. Klik ikon roda gigi di samping "Select type"
// 12. Pilih "Web app"
// 13. Isi deskripsi: "Kehadiran Siswa API"
// 14. Execute as: "Me (email@gmail.com)"
// 15. Who has access: "Anyone"
// 16. Klik "Deploy"
// 17. Klik "Authorize access" dan pilih akun Google Anda
// 18. Klik "Advanced" > "Go to ... (unsafe)" jika ada warning
// 19. Klik "Allow"
// 20. Copy URL Web app yang muncul (https://script.google.com/macros/s/.../exec)
// 21. Paste URL di aplikasi web
// 22. Klik "Simpan & Hubungkan"
// ========================================
// TROUBLESHOOTING:
// - Jika error "Sheet tidak ditemukan":
// Pastikan nama sheet persis "Kehadiran" atau gunakan sheet pertama
// - Jika error "Permission denied":
// Deploy ulang dengan "Execute as: Me"
// - Jika data tidak muncul:
// Pastikan ada header dan data di baris 2 dst
// ========================================