Daftar Pasangan Calon Ketua & Wakil OSIS
Silakan pelajari visi, misi, dan klik tombol Pilih Paslon untuk memberikan suara Anda secara langsung.
Afiq Adli R. & Bilqis
Calon Ketua & Calon Wakil Ketua OSIS
Motto & Slogan
"AFBIL : Amanah, Fokus, Bertanggung Jawab, Inovatif, Luar Biasa."
Mewujudkan OSIS SMPN Giriyoso yang cinta kebersihan, beriman, berilmu,dan aktif dalam kegiatan sekolah.
- Meningkatkan kedisiplinan, sopan santun dan akhlak mulia.
- Mengelola organisasi dengan tanggung jawab.
- Menjaga nama baik sekolah.
- Mengaktifkan kembali kegiatan ekstrakurikuler yang ada.
- Mewujudkan sekolah yang bersih dan nyaman.
Janeta & Atta Falisha
Calon Ketua & Calon Wakil Ketua OSIS
Motto & Slogan
"AKSI: Aktif, Kreatif, Solutif, dan Inovatif Menuju Sekolah Unggul."
Menjadikan SMPN Giriyoso sekolah yang aktif, berprestasi, ramah anak, dan responsif terhadap ide-ide kreatif seluruh siswa.
- Menampung dan merealisasikan aspirasi siswa secara transparan.
- Mengembangkan program digitalisasi OSIS & mading kreatif.
- Mempererat rasa kekeluargaan dan kepedulian lingkungan.
Rekapitulasi E-Voting OSIS
Menampilkan persentase & jumlah perolehan suara secara real-time.
Total Suara Masuk
0 Suara
Afiq Adli R. & Bilqis
Pasangan Calon Nomor 01
(0 Suara)
Janeta & Atta Falisha
Pasangan Calon Nomor 02
(0 Suara)
Persentase Perolehan
Akses Panitia E-Voting
Masukkan PIN Panitia untuk membuka kontrol rekapitulasi, sampel data, dan integrasi Google Sheets.
PIN default untuk pengujian: 1234
Kontrol Panitia & Integrasi Apps Script
Kelola data pemungutan suara dan hubungkan secara langsung ke Google Sheet SMPN Giriyoso.
Pengaturan Endpoint Google Apps Script Web App
Tempelkan URL Web App dari Google Apps Script di bawah ini agar data voting tersimpan langsung ke Google Spreadsheet target.
PENTING: Penyebab Data Tidak Masuk ke Spreadsheet & Solusinya
Jika datavoting belum bertambah di Google Sheet saat Anda klik pilih paslon, pastikan langkah-langkah pengaturan Google Apps Script berikut sudah benar:
- Salin Kode GAS Terbaru di bawah ini lalu tempel di editor Google Apps Script Anda (`Code.gs`).
- Klik Deploy > New deployment (Terapkan > Terapkan baru) di menu kanan atas Apps Script.
- Di bagian "Execute as" (Jalankan sebagai): Pilih Me / Saya (email Anda).
- Di bagian "Who has access" (Siapa yang memiliki akses): Pilih Anyone / Siapa saja (Wajib 'Anyone', jika diset 'Only myself' data dari web akan gagal masuk!).
- Klik Deploy, lalu salin URL Web App yang berakhiran
/execdan tempel pada kolom URL Apps Script di atas.
Kelola Foto Pasangan Calon
Unggah foto baru atau masukkan URL foto dari internet untuk memperbarui tampilan di Bilik Suara secara langsung.
Kode Google Apps Script (`Code.gs`) Terbaru
Kode backend terbaru ini mendukung rekaman suara dual-mode (POST & GET) tanpa masalah CORS. ID Sheet: 142NCqsBrV8umTcAqlrwAcMpsoGG-u6EmvUIMmuVfhkk
// ====================================================
// KODE BACKEND: Code.gs (Google Apps Script)
// TERHUBUNG DENGAN SPREADSHEET SMPN GIRIYOSO
// ID SPREADSHEET: 142NCqsBrV8umTcAqlrwAcMpsoGG-u6EmvUIMmuVfhkk
// ====================================================
var SPREADSHEET_ID = "142NCqsBrV8umTcAqlrwAcMpsoGG-u6EmvUIMmuVfhkk";
function doGet(e) {
var lock = LockService.getScriptLock();
lock.tryLock(10000);
try {
var ss = SpreadsheetApp.openById(SPREADSHEET_ID);
var sheet = ss.getSheetByName("HasilVoting") || ss.getSheets()[0];
// Buat header jika tabel masih kosong
if (sheet.getLastRow() === 0) {
sheet.appendRow(["Timestamp", "Kode Voter", "Kelas / Peran", "Pilihan Paslon"]);
}
// Dukungan Catat Suara via GET Query Parameter (Tembus CORS Browser)
if (e && e.parameter && (e.parameter.action === "vote" || e.parameter.paslon)) {
var timestampStr = Utilities.formatDate(new Date(), "Asia/Jakarta", "yyyy-MM-dd HH:mm:ss");
var voterCode = e.parameter.nisn || e.parameter.kode || ("VOTE-" + Math.floor(1000 + Math.random() * 9000));
var kelasStr = e.parameter.kelas || "Siswa";
var paslonVal = e.parameter.paslon;
var paslonStr = paslonVal == 1 ? "Paslon 01 (Afiq & Bilqis)" : (paslonVal == 2 ? "Paslon 02 (Janeta & Atta)" : paslonVal);
sheet.appendRow([timestampStr, voterCode, kelasStr, paslonStr]);
var resData = {
status: "success",
message: "Suara berhasil dicatat ke Google Spreadsheet!"
};
return ContentService.createTextOutput(JSON.stringify(resData))
.setMimeType(ContentService.MimeType.JSON);
}
// Mode Default GET: Ambil Rekapitulasi Perolehan Suara
var data = sheet.getDataRange().getValues();
var p1Count = 0;
var p2Count = 0;
for (var i = 1; i < data.length; i++) {
var paslonVal = String(data[i][3]);
if (paslonVal === "1" || paslonVal.indexOf("01") !== -1 || paslonVal.indexOf("Afiq") !== -1) {
p1Count++;
} else if (paslonVal === "2" || paslonVal.indexOf("02") !== -1 || paslonVal.indexOf("Janeta") !== -1) {
p2Count++;
}
}
var result = {
status: "success",
totalSuara: data.length - 1,
paslon1: p1Count,
paslon2: p2Count
};
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: err.toString() }))
.setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}
function doPost(e) {
var lock = LockService.getScriptLock();
lock.tryLock(10000);
try {
var ss = SpreadsheetApp.openById(SPREADSHEET_ID);
var sheet = ss.getSheetByName("HasilVoting") || ss.getSheets()[0];
if (sheet.getLastRow() === 0) {
sheet.appendRow(["Timestamp", "Kode Voter", "Kelas / Peran", "Pilihan Paslon"]);
}
var params = {};
if (e && e.postData && e.postData.contents) {
try {
params = JSON.parse(e.postData.contents);
} catch(parseErr) {
params = e.parameter || {};
}
} else if (e && e.parameter) {
params = e.parameter;
}
var timestampStr = Utilities.formatDate(new Date(), "Asia/Jakarta", "yyyy-MM-dd HH:mm:ss");
var voterCode = params.nisn || params.kode || ("VOTE-" + Math.floor(1000 + Math.random() * 9000));
var kelasStr = params.kelas || "Siswa";
var paslonVal = params.paslon;
var paslonStr = paslonVal == 1 ? "Paslon 01 (Afiq & Bilqis)" : (paslonVal == 2 ? "Paslon 02 (Janeta & Atta)" : paslonVal);
// Tambahkan baris baru ke Google Sheet secara otomatis
sheet.appendRow([timestampStr, voterCode, kelasStr, paslonStr]);
var responseOutput = {
status: "success",
message: "Suara berhasil tersimpan di Google Spreadsheet!"
};
return ContentService.createTextOutput(JSON.stringify(responseOutput))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: error.toString() }))
.setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}