Langkah Pemasangan 1 Menit:
- Buka sheets.new untuk membuat Google Spreadsheet baru (Beri nama:
Database Amanah Galery).
- Di Spreadsheet, klik menu Ekstensi (Extensions) > Apps Script.
- Hapus semua kode lama di
Code.gs, lalu salin & tempelkan kode di bawah ini.
- Klik tombol biru Deploy (Terapkan) > New deployment (Penerapan baru).
- Pilih jenis Web app, isi deskripsi, lalu ubah Who has access (Siapa yang memiliki akses) menjadi "Anyone" (Siapa saja).
- Klik Deploy, salin Web App URL yang didapat, lalu masukkan ke menu Panel Admin / Pengaturan URL Web App di galeri ini.
/* =========================================================================
AMANAH DRIVE GALERY - BACKEND & DATABASE GOOGLE SPREADSHEET (Code.gs)
========================================================================= */
function doGet(e) {
var action = (e && e.parameter && e.parameter.action) ? e.parameter.action : 'getPhotos';
var responseData = {};
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = getOrCreateSheet(ss, "Galeri");
if (action === 'getPhotos') {
var photos = getAllPhotos(sheet);
responseData = { status: 'success', data: photos };
}
else if (action === 'fetchFolder') {
var folderId = e.parameter.folderId;
var albumName = e.parameter.albumName || "Folder Drive";
if (!folderId) throw new Error("Folder ID tidak boleh kosong!");
var folder = DriveApp.getFolderById(folderId);
var files = folder.getFiles();
var addedPhotos = [];
var existingIds = getExistingDriveIds(sheet);
while (files.hasNext()) {
var file = files.next();
var mime = file.getMimeType();
if (mime.indexOf('image/') !== -1 || mime === 'application/vnd.google-apps.photo') {
var fileId = file.getId();
if (!existingIds[fileId]) {
var title = file.getName().replace(/\.[^/.]+$/, "").replace(/[-_]/g, " ");
var dateStr = Utilities.formatDate(file.getDateCreated(), Session.getScriptTimeZone(), "yyyy-MM-dd");
var rowData = [
"photo_" + fileId,
title,
albumName,
dateStr,
fileId,
"",
albumName.toLowerCase(),
"Diimpor otomatis dari Folder Google Drive",
"false"
];
sheet.appendRow(rowData);
existingIds[fileId] = true;
addedPhotos.push({
id: rowData[0],
title: rowData[1],
album: rowData[2],
date: rowData[3],
driveId: rowData[4],
tags: [albumName.toLowerCase()],
description: rowData[7],
isFavorite: false
});
}
}
}
responseData = {
status: 'success',
message: 'Berhasil mengimpor ' + addedPhotos.length + ' foto ke Spreadsheet',
data: addedPhotos
};
}
} catch (err) {
responseData = { status: 'error', message: err.toString() };
}
return ContentService.createTextOutput(JSON.stringify(responseData))
.setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
var responseData = {};
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = getOrCreateSheet(ss, "Galeri");
var params = JSON.parse(e.postData.contents);
var action = params.action;
if (action === 'addPhoto') {
var photo = params.photo;
sheet.appendRow([
photo.id,
photo.title,
photo.album || "Umum",
photo.date,
photo.driveId || "",
photo.directUrl || "",
(photo.tags || []).join(','),
photo.description || "",
photo.isFavorite ? "true" : "false"
]);
responseData = { status: 'success', message: 'Foto berhasil disimpan ke Spreadsheet' };
}
else if (action === 'deletePhoto') {
var photoId = params.id;
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0] == photoId) {
sheet.deleteRow(i + 1);
break;
}
}
responseData = { status: 'success', message: 'Foto berhasil dihapus dari Spreadsheet' };
}
else if (action === 'toggleFavorite') {
var targetId = params.id;
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0] == targetId) {
var curVal = data[i][8] == "true" || data[i][8] === true;
sheet.getRange(i + 1, 9).setValue(!curVal ? "true" : "false");
break;
}
}
responseData = { status: 'success' };
}
} catch (err) {
responseData = { status: 'error', message: err.toString() };
}
return ContentService.createTextOutput(JSON.stringify(responseData))
.setMimeType(ContentService.MimeType.JSON);
}
function getOrCreateSheet(ss, sheetName) {
var sheet = ss.getSheetByName(sheetName);
if (!sheet) {
sheet = ss.insertSheet(sheetName);
sheet.appendRow(["ID", "Judul", "Album", "Tanggal", "Drive_ID", "Direct_URL", "Tags", "Deskripsi", "Favorit"]);
sheet.getRange(1, 1, 1, 9).setFontWeight("bold").setBackground("#dcfce7");
}
return sheet;
}
function getAllPhotos(sheet) {
var data = sheet.getDataRange().getValues();
var photos = [];
if (data.length <= 1) return photos;
for (var i = 1; i < data.length; i++) {
var row = data[i];
if (!row[0]) continue;
photos.push({
id: row[0].toString(),
title: (row[1] || "Tanpa Judul").toString(),
album: (row[2] || "Umum").toString(),
date: row[3] ? row[3].toString() : "",
driveId: row[4] ? row[4].toString() : null,
directUrl: row[5] ? row[5].toString() : null,
tags: row[6] ? row[6].toString().split(',').map(function(t){ return t.trim(); }) : [],
description: row[7] ? row[7].toString() : "",
isFavorite: row[8] == "true" || row[8] === true
});
}
return photos;
}
function getExistingDriveIds(sheet) {
var data = sheet.getDataRange().getValues();
var map = {};
for (var i = 1; i < data.length; i++) {
if (data[i][4]) map[data[i][4].toString()] = true;
}
return map;
}