Ringkasan dokumentasi & statistik media SMKN 1 Negara Batin
SMKN 1 NEGARA BATIN • DKV & ALL MAJORS
Sistem Dokumentasi Media & Digital Asset
Kelola seluruh foto kegiatan, karya DKV, video profil, dan dokumen resmi sekolah dalam satu portal terpusat tersinkronisasi Google Sheets & Drive.
Total Media
0
Tersimpan di Drive
Arsip Dokumen
0
Dokumen & Surat
Foto Galeri
0
Dokumentasi Acara
Video Portfolio
0
Profil & Praktek
Karya DKV
0
Desain & Poster
Grafik Unggahan Media
Distribusi Media berdasarkan Jurusan
Termasuk DKV, TSM, AKL, ATP & Umum
Unggahan Terbaru
Media terbaru yang diunggah ke Google Drive
Media
Kategori
Jurusan
Pengunggah
Tanggal
Aksi
Tidak ada media ditemukan
Coba ubah kata kunci pencarian atau filter kategori Anda.
Upload Media Baru
Unggah foto batch (hingga 100 foto), video, karya DKV, atau dokumen ke Google Drive & Sheets.
Laporan & Rekapitulasi Media
Ekspor laporan inventaris dokumentasi sekolah
Pengunggah Teraktif
Pak Budi (Guru DKV)
24 Media Diunggah
Kategori Terpopuler
Jurusan DKV
38% dari total aset
Estimasi Kapasitas Drive
4.2 GB / Unlimited
Status Aman
Log Aktivitas Pengguna (Audit Trail)
Waktu
Pengguna
Aktivitas
Keterangan
12 Nov 2026 09:15
Admin Utama
UPLOAD
Mengunggah 5 foto karya DKV
11 Nov 2026 14:20
Pak Budi (Guru)
EDIT
Memperbarui metadata video profil MPLS
Manajemen Pengguna & Hak Akses
Kelola akun Administrator, Guru, dan Siswa SMKN 1 Negara Batin
Pengguna
Username
Role / Hak Akses
Status
Aksi
Pengaturan Backend & Google Integration
Hubungkan frontend ini dengan Google Apps Script, Google Sheets & 1 Folder Utama Google Drive.
Auto-Folder Management Active
Mekanisme Satu ID Folder Utama Google Drive:
Anda hanya perlu membuat 1 folder utama di Google Drive (misal: BANK MEDIA SMKN 1 NEGARA BATIN) dan memasukkan ID Folder tersebut di bawah ini. Backend Google Apps Script akan otomatis membuat dan mengelola subfolder (FOTO, VIDEO, DESAIN GRAFIS, DOKUMEN, ARSIP beserta folder tahun 2026, 2027, dll.) tanpa duplikasi!
Ambil ID dari URL folder Google Drive Anda.
URL hasil Deployment Web App pada Google Apps Script.
// =================================================================
// KODE GOOGLE APPS SCRIPT (Code.gs) - BANK MEDIA SMKN 1 NEGARA BATIN
// FULL CRUD & SINKRONISASI REAL-TIME MEDIA + USERS KE GOOGLE SHEETS
// =================================================================
const CONFIG = {
SPREADSHEET_ID: SpreadsheetApp.getActiveSpreadsheet().getId(),
ROOT_FOLDER_ID: "MASUKKAN_SATU_ID_FOLDER_UTAMA_DI_SINI"
};
const FOLDER_TYPES = ["FOTO", "VIDEO", "DESAIN GRAFIS", "DOKUMEN", "ARSIP"];
// Handler GET: Mengambil seluruh data MEDIA dan USERS saat aplikasi dibuka/direfresh
function doGet(e) {
var action = e && e.parameter ? e.parameter.action : "";
if (action === "getAllData") {
return responseJSON({
status: "success",
media: getSheetRecords("MEDIA"),
users: getSheetRecords("USERS")
});
}
return responseJSON({
status: "online",
message: "API Bank Media SMKN 1 Negara Batin Siap Digunakan"
});
}
// Handler POST: Upload, Edit, Hapus Media, & Manajemen Pengguna
function doPost(e) {
try {
var contents = e.postData ? e.postData.contents : "";
var data = JSON.parse(contents);
var action = data.action;
if (action === 'initFolders') {
return responseJSON(initFolderStructure(data.rootFolderId));
} else if (action === 'uploadMedia') {
return responseJSON(handleUpload(data));
} else if (action === 'editMedia') {
return responseJSON(handleEditMedia(data));
} else if (action === 'deleteMedia') {
return responseJSON(handleDeleteMedia(data));
} else if (action === 'saveUser') {
return responseJSON(handleSaveUser(data));
} else if (action === 'deleteUser') {
return responseJSON(handleDeleteUser(data));
} else if (action === 'validateFolder') {
var rootId = data.rootFolderId && data.rootFolderId.trim() !== "" ? data.rootFolderId : CONFIG.ROOT_FOLDER_ID;
var root = DriveApp.getFolderById(rootId);
return responseJSON({ status: 'success', message: 'Akses ke Folder "' + root.getName() + '" Terverifikasi' });
}
return responseJSON({ status: 'error', message: 'Aksi tidak valid: ' + action });
} catch (err) {
return responseJSON({ status: 'error', message: err.toString() });
}
}
function responseJSON(obj) {
return ContentService.createTextOutput(JSON.stringify(obj))
.setMimeType(ContentService.MimeType.JSON);
}
// Membaca baris dari Sheet dan mengubahnya menjadi Array of Objects
function getSheetRecords(sheetName) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName);
if (!sheet) return [];
var values = sheet.getDataRange().getValues();
if (values.length <= 1) return [];
var headers = values[0];
var results = [];
for (var i = 1; i < values.length; i++) {
var row = values[i];
var obj = {};
for (var j = 0; j < headers.length; j++) {
obj[headers[j]] = row[j];
}
results.push(obj);
}
return results;
}
// Inisialisasi Subfolder Otomatis
function initFolderStructure(customRootId) {
var rootId = customRootId && customRootId.trim() !== "" ? customRootId : CONFIG.ROOT_FOLDER_ID;
var rootFolder = DriveApp.getFolderById(rootId);
var currentYear = new Date().getFullYear().toString();
var nextYear = (new Date().getFullYear() + 1).toString();
var years = [currentYear, nextYear, "2026", "2027"];
var createdLog = [];
FOLDER_TYPES.forEach(function(type) {
var typeFolder = getOrCreateSubFolder(rootFolder, type);
years.forEach(function(year) {
getOrCreateSubFolder(typeFolder, year);
});
createdLog.push(type);
});
return { status: 'success', message: 'Struktur subfolder otomatis berhasil diperiksa/dibuat', folders: createdLog };
}
function getOrCreateSubFolder(parentFolder, folderName) {
var folders = parentFolder.getFoldersByName(folderName);
return folders.hasNext() ? folders.next() : parentFolder.createFolder(folderName);
}
// Proses Upload ke Google Drive & Simpan Metadata ke Sheet MEDIA
function handleUpload(data) {
var rootFolderId = data.rootFolderId && data.rootFolderId.trim() !== "" ? data.rootFolderId : CONFIG.ROOT_FOLDER_ID;
var rootFolder = DriveApp.getFolderById(rootFolderId);
var targetTypeFolderName = "FOTO";
if (data.jenis === 'video') targetTypeFolderName = "VIDEO";
else if (data.jenis === 'desain') targetTypeFolderName = "DESAIN GRAFIS";
else if (data.jenis === 'dokumen') targetTypeFolderName = "DOKUMEN";
var yearFolderName = data.tanggal ? data.tanggal.substring(0, 4) : new Date().getFullYear().toString();
var typeFolder = getOrCreateSubFolder(rootFolder, targetTypeFolderName);
var targetYearFolder = getOrCreateSubFolder(typeFolder, yearFolderName);
var contentType = data.fileData.substring(5, data.fileData.indexOf(';'));
var bytes = Utilities.base64Decode(data.fileData.substring(data.fileData.indexOf(',') + 1));
var blob = Utilities.newBlob(bytes, contentType, data.fileName);
var file = targetYearFolder.createFile(blob);
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("MEDIA");
if (!sheet) {
sheet = ss.insertSheet("MEDIA");
sheet.appendRow(["ID_Media","Judul","Nama_File","Jenis_Media","Kategori","Deskripsi","Tanggal_Kegiatan","Lokasi","Pengunggah","Jurusan","Tahun_Ajaran","Tag","URL_Drive","File_ID_Drive","Thumbnail_URL","Ukuran_File","Status","Hak_Akses","Created_At","Updated_At"]);
}
var newId = "MED-" + new Date().getTime();
var driveUrl = file.getUrl();
var fileId = file.getId();
var thumbUrl = data.jenis === 'foto' || data.jenis === 'desain' ? "https://lh3.googleusercontent.com/d/" + fileId : "";
sheet.appendRow([
newId, data.judul, data.fileName, data.jenis, data.kategori, data.deskripsi,
data.tanggal, data.lokasi, data.pengunggah, data.jurusan, data.tahun, data.tag,
driveUrl, fileId, thumbUrl, file.getSize(), "Aktif", data.akses, new Date(), new Date()
]);
return {
status: 'success',
id: newId,
fileUrl: driveUrl,
fileId: fileId,
thumbnailUrl: thumbUrl
};
}
// Edit Metadata Media di Google Sheets
function handleEditMedia(data) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("MEDIA");
if (!sheet) return { status: 'error', message: 'Sheet MEDIA tidak ditemukan' };
var rows = sheet.getDataRange().getValues();
for (var i = 1; i < rows.length; i++) {
if (rows[i][0] == data.id) {
sheet.getRange(i + 1, 2).setValue(data.judul);
sheet.getRange(i + 1, 5).setValue(data.kategori);
sheet.getRange(i + 1, 6).setValue(data.deskripsi);
sheet.getRange(i + 1, 10).setValue(data.jurusan);
sheet.getRange(i + 1, 20).setValue(new Date());
return { status: 'success', message: 'Metadata berhasil diperbarui' };
}
}
return { status: 'error', message: 'ID Media tidak ditemukan' };
}
// Hapus Media di Sheet & Pindahkan File ke Sampah Drive
function handleDeleteMedia(data) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("MEDIA");
if (!sheet) return { status: 'error', message: 'Sheet MEDIA tidak ditemukan' };
var rows = sheet.getDataRange().getValues();
for (var i = 1; i < rows.length; i++) {
if (rows[i][0] == data.id) {
var fileId = rows[i][13];
if (fileId) {
try { DriveApp.getFileById(fileId).setTrashed(true); } catch(e) {}
}
sheet.deleteRow(i + 1);
return { status: 'success', message: 'Media berhasil dihapus' };
}
}
return { status: 'error', message: 'ID Media tidak ditemukan' };
}
// Simpan / Edit Pengguna di Sheet USERS
function handleSaveUser(data) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("USERS");
if (!sheet) {
sheet = ss.insertSheet("USERS");
sheet.appendRow(["ID_User", "Nama", "Username", "Password_Hash", "Email", "Role", "Status", "Created_At"]);
}
var rows = sheet.getDataRange().getValues();
if (data.id) {
for (var i = 1; i < rows.length; i++) {
if (rows[i][0] == data.id) {
sheet.getRange(i + 1, 2).setValue(data.nama);
sheet.getRange(i + 1, 3).setValue(data.username);
sheet.getRange(i + 1, 6).setValue(data.role);
sheet.getRange(i + 1, 7).setValue(data.status);
return { status: 'success', id: data.id };
}
}
}
var newUserId = "USR-" + new Date().getTime();
sheet.appendRow([newUserId, data.nama, data.username, "HASH_DEFAULT", data.username + "@smkn1negarabatin.sch.id", data.role, data.status, new Date()]);
return { status: 'success', id: newUserId };
}
// Hapus Pengguna dari Sheet USERS
function handleDeleteUser(data) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("USERS");
if (!sheet) return { status: 'error', message: 'Sheet USERS tidak ditemukan' };
var rows = sheet.getDataRange().getValues();
for (var i = 1; i < rows.length; i++) {
if (rows[i][0] == data.id) {
sheet.deleteRow(i + 1);
return { status: 'success' };
}
}
return { status: 'error', message: 'User tidak ditemukan' };
}