ina invitationPanel Admin
← Kembali ke Katalog
⚙️ 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

  1. Klik Deploy → New deployment
  2. Pilih type: Web app
  3. "Execute as" = Me
  4. "Who has access" = Anyone
  5. Klik Deploy → izinkan akses → salin URL-nya
  6. 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 WhatsApp Model Harga Tgl Acara Status Bukti Catatan
📋
Masukkan URL Apps Script lalu klik Simpan & Muat Data