Total Data
0
Stuck (>3h Khusus / >5h Reg)
0
Follow Up
0
Terkirim
0
Return/Cancel
0
Daftar Pengiriman Pesanan
Urutkan dan saring data langsung di header kolom spreadsheet di bawah ini
Unggah File Excel (.xlsx) Shopee
Tarik & Lepaskan berkas di sini, atau pilih berkas
Filter otomatis: status "Sedang Dikirim" & "Telah Dikirim"
Aturan Tracking Resi
Kelola pola pencarian kata kunci ekspedisi dan template URL pelacakan.
Daftar Aturan Aktif
Integrasi Google Sheets API (CORS)
Sambungkan UI Web mandiri Anda ini dengan Cloud Database Google Spreadsheet secara langsung.
Masukkan URL Web App hasil deploy Google Apps Script yang diatur ke akses "Anyone".
Kode Google Apps Script (kode.gs)
Panduan deploy web service API internal untuk sinkronisasi dua arah.
Petunjuk Cepat:
1. Di Google Sheet Anda, klik Extensions -> Apps Script.
2. Ganti seluruh isi editor dengan kode yang disalin di bawah ini.
3. Simpan dan klik Deploy -> New Deployment (Tipe: Web App, Akses: Anyone).
// === FILE: kode.gs ===
// Pembaruan menggunakan getDisplayValues() serta menyertakan kolom "Catatan" (ke-9)
function doGet(e) {
var origin = e && e.parameter && e.parameter.action;
if (origin === "load") {
var data = loadFromSpreadsheet();
return ContentService.createTextOutput(JSON.stringify(data))
.setMimeType(ContentService.MimeType.JSON);
}
if (origin === "test") {
return ContentService.createTextOutput(JSON.stringify({ success: true, message: "Koneksi ke Google Sheets API Berhasil!" }))
.setMimeType(ContentService.MimeType.JSON);
}
return HtmlService.createTemplateFromFile('index')
.evaluate()
.setTitle('Shopee Order Tracker & Status Checker')
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
function doPost(e) {
try {
var postData = e.postData.contents;
var data = JSON.parse(postData);
var result = saveToSpreadsheet(data);
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ success: false, error: err.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
function saveToSpreadsheet(dataList) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Laporan");
if (!sheet) {
sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("Laporan");
sheet.appendRow(["Tanggal Tiketing", "Hari", "Tanggal Pesan", "No. Pesanan", "Kota/Kabupaten", "No. Resi", "Opsi Pengiriman", "Status Pengiriman", "Catatan"]);
}
var sheetData = sheet.getDataRange().getValues();
var headers = sheetData[0];
var orderIdIndex = headers.indexOf("No. Pesanan");
if (orderIdIndex === -1) {
return { success: false, message: "Kolom 'No. Pesanan' tidak ditemukan!" };
}
var counterInserted = 0, counterUpdated = 0;
dataList.forEach(function(item) {
var orderId = String(item.orderId || '').trim();
var foundRowIndex = -1;
for (var i = 1; i < sheetData.length; i++) {
if (String(sheetData[i][orderIdIndex]).trim() === orderId) {
foundRowIndex = i + 1;
break;
}
}
var rowValues = [
item.ticketDate,
item.days || 0,
item.orderDate,
item.orderId,
item.city,
item.resi,
item.shippingOption,
item.status,
item.notes || ""
];
if (foundRowIndex !== -1) {
sheet.getRange(foundRowIndex, 1, 1, rowValues.length).setValues([rowValues]);
counterUpdated++;
} else {
sheet.appendRow(rowValues);
counterInserted++;
}
});
return { success: true, message: "Sinkronisasi Berhasil!", inserted: counterInserted, updated: counterUpdated };
}
function loadFromSpreadsheet() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Laporan");
if (!sheet) return [];
var data = sheet.getDataRange().getDisplayValues();
if (data.length <= 1) return [];
var list = [];
for (var i = 1; i < data.length; i++) {
var row = data[i];
list.push({
ticketDate: row[0],
days: row[1] || 0,
orderDate: row[2],
orderId: String(row[3]),
city: row[4],
resi: row[5],
shippingOption: row[6],
status: row[7],
notes: row[8] || ""
});
}
return list;
}