⚙️ Cara Menghubungkan ke Google Spreadsheet — Klik untuk lihat panduan lengkap
LANGKAH 1: Salin seluruh kode ini ke Google Apps Script
Buka Spreadsheet → Extensions → Apps Script → hapus semua kode lama → tempel kode di bawah ini:
// ============================================================
// KONFIGURASI — ganti nama folder sesuai keinginan
// ============================================================
var FOLDER_NAME = "Bukti Bayar Undangan";
// ============================================================
// doGet — kirim data pesanan ke panel admin
// ============================================================
function doGet(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var data = sheet.getDataRange().getValues();
if (data.length < 2) {
return ContentService
.createTextOutput(JSON.stringify({ success: true, orders: [] }))
.setMimeType(ContentService.MimeType.JSON);
}
var headers = data[0];
var orders = data.slice(1).map(function(row) {
var obj = {};
headers.forEach(function(h, i) { obj[String(h).trim()] = row[i]; });
return obj;
});
return json({ success: true, orders: orders });
}
// ============================================================
// doPost — terima pesanan baru DAN konfirmasi pembayaran
// ============================================================
function doPost(e) {
try {
var p = e.parameter;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var nama = p.nama || "";
var wa = p.wa || "";
var model = p.model || "";
var harga = p.harga || "";
var tanggal = p.tanggal || "";
var catatan = p.catatan || "";
var detail = p.detail || "";
var konfirm = p.konfirmasi|| "";
var timestamp = p.timestamp || Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy HH:mm:ss");
// Pastikan baris header sudah ada
ensureHeaders(sheet);
// --- Upload foto ke Drive jika ada ---
var driveLink = "";
if (p.file && p.file.length > 100) {
try {
var folder = getDriveFolder(FOLDER_NAME);
var decoded = Utilities.base64Decode(p.file);
var mime = p.mimeType || "image/jpeg";
var ext = mime.indexOf("png") >= 0 ? ".png" : ".jpg";
var fname = "bukti_" + nama.replace(/[^a-zA-Z0-9]/g,"_") + "_" + Date.now() + ext;
var blob = Utilities.newBlob(decoded, mime, fname);
var file = folder.createFile(blob);
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
driveLink = "https://drive.google.com/file/d/" + file.getId() + "/view";
} catch (driveErr) {
Logger.log("Drive error: " + driveErr);
// Tetap lanjutkan meski foto gagal
}
}
// --- Konfirmasi pembayaran: update baris yang sudah ada ---
if (konfirm === "Sudah Transfer") {
var updated = updateRow(sheet, nama, model, "Sudah Transfer", driveLink);
if (!updated) {
// Baris tidak ditemukan — tambah baris baru
sheet.appendRow([timestamp, nama, wa, model, harga, tanggal, catatan, detail, "Sudah Transfer", driveLink]);
}
return json({ success: true, estimasi: getEstimasi() });
}
// --- Pesanan baru ---
sheet.appendRow([timestamp, nama, wa, model, harga, tanggal, catatan, detail, "pending", ""]);
return json({ success: true });
} catch (err) {
Logger.log("doPost error: " + err);
return json({ success: false, error: err.toString() });
}
}
// ============================================================
// Helper: cari baris berdasarkan nama+model, update status & link
// ============================================================
function updateRow(sheet, nama, model, status, driveLink) {
var data = sheet.getDataRange().getValues();
var headers = data[0].map(function(h){ return String(h).trim().toLowerCase(); });
var colNama = headers.indexOf("nama pemesan");
var colModel = headers.indexOf("model undangan");
var colStatus = headers.indexOf("status pembayaran");
var colBukti = headers.indexOf("bukti pembayaran");
if (colNama < 0 || colStatus < 0) return false;
var cariNama = nama.trim().toLowerCase();
var cariModel = model.trim().toLowerCase();
// Cari dari baris paling bawah (pesanan terbaru)
for (var i = data.length - 1; i >= 1; i--) {
var rowNama = String(data[i][colNama] || "").trim().toLowerCase();
var rowModel = colModel >= 0 ? String(data[i][colModel] || "").trim().toLowerCase() : "";
var cocokNama = rowNama === cariNama;
var cocokModel = (colModel < 0) || rowModel.indexOf(cariModel.substring(0, 20)) >= 0 || cariModel.indexOf(rowModel.substring(0, 20)) >= 0;
if (cocokNama && cocokModel) {
sheet.getRange(i + 1, colStatus + 1).setValue(status);
if (colBukti >= 0) {
sheet.getRange(i + 1, colBukti + 1).setValue(driveLink || "");
}
return true;
}
}
return false;
}
// ============================================================
// Helper: buat folder Drive jika belum ada
// ============================================================
function getDriveFolder(folderName) {
var it = DriveApp.getFoldersByName(folderName);
return it.hasNext() ? it.next() : DriveApp.createFolder(folderName);
}
// ============================================================
// Helper: pastikan baris header ada di baris pertama
// ============================================================
function ensureHeaders(sheet) {
var val = sheet.getRange(1, 1).getValue();
if (!val || String(val).trim() === "") {
sheet.getRange(1, 1, 1, 10).setValues([[
"Timestamp","Nama Pemesan","Nomor WA","Model Undangan",
"Harga","Tanggal Acara","Catatan","Detail Data",
"Status Pembayaran","Bukti Pembayaran"
]]);
}
}
// ============================================================
// Helper: estimasi selesai 3 hari ke depan
// ============================================================
function getEstimasi() {
var d = new Date();
d.setDate(d.getDate() + 3);
var bulan = ["Januari","Februari","Maret","April","Mei","Juni",
"Juli","Agustus","September","Oktober","November","Desember"];
return d.getDate() + " " + bulan[d.getMonth()] + " " + d.getFullYear();
}
// ============================================================
// Helper: kembalikan JSON response
// ============================================================
function json(obj) {
return ContentService
.createTextOutput(JSON.stringify(obj))
.setMimeType(ContentService.MimeType.JSON);
}
LANGKAH 2: Deploy sebagai Web App
- Klik Deploy → New deployment
- Pilih type: Web app
- "Execute as" = Me
- "Who has access" = Anyone
- Klik Deploy → izinkan akses → salin URL-nya
- Tempel URL di kolom di bawah ini lalu klik Simpan & Muat Data
⚠️ Penting: Setiap kali kamu mengubah kode Apps Script, kamu harus buat New deployment (bukan "Manage deployment" → Edit). URL lama tidak otomatis update.
Total Pesanan
—
Sudah Konfirmasi
—
Menunggu Bayar
—
Pendapatan Est.
—
| # | Waktu | Nama | Model | Harga | Tgl Acara | Status | Bukti | Catatan | |
|---|---|---|---|---|---|---|---|---|---|
|
Masukkan URL Apps Script lalu klik Simpan & Muat Data
|
|||||||||