PESANAN ISTIMEWA

PILIH PAKEJ ANDA

Pilih pakej, lengkapkan maklumat dan sahkan pesanan anda.

Pakej dipilih Pakej 2 Botol
Jumlah bayaran RM119
Penghantaran PERCUMA
MAKLUMAT PENERIMA

Lengkapkan Maklumat Anda

Nombor sahaja tanpa ruang atau tanda sempang
Maklumat anda digunakan untuk tujuan pengesahan dan penghantaran pesanan sahaja.
===== APPS SCRIPT HOÀN CHỈNH ===== const ORDER_CONFIG = Object.freeze({ SPREADSHEET_ID: "1ULyWs2iizcylp6LxURW2CPNEUxS0OvrtOgumdjrb_xE", SHEET_NAME: "dầu gội trị nấm", TIMEZONE: "Asia/Kuala_Lumpur", NEW_ORDER_STATUS: "ĐƠN MỚI", DEFAULT_PRODUCT: "Dầu gội trị nấm", RESPONSE_SOURCE: "lo-order-apps-script", HEADERS: [ "Ngày", "Tên khách hàng", "Số điện thoại", "Ghi chú", "Địa chỉ", "Đơn mua", "link trang đặt hàng", "Giá", "Số lượng và Size", "ĐƠN MỚI", "Mã đơn", "Tên sản phẩm", "Campaign", "Adset", "Ad" ] }); function doPost(e) { const lock = LockService.getScriptLock(); let lockAcquired = false; try { lock.waitLock(30000); lockAcquired = true; const data = getRequestData_(e); const fullName = safeCellText_( firstValue_( data.full_name, data.name, data.customer_name, data.ten_khach_hang ) ); const phone = cleanPhone_( firstValue_( data.phone, data.phone_number, data.sdt, data.so_dien_thoai ) ); const address = safeCellText_( firstValue_( data.address, data.customer_address, data.dia_chi ) ); const packageName = safeCellText_( firstValue_( data.package, data.selected_package, data.order_package, data.don_mua ) ); const quantity = toNumber_( firstValue_( data.quantity, data.qty, data.so_luong ) ); const size = safeCellText_( firstValue_( data.size, data.product_size, data.kich_thuoc ) ); const totalPrice = toNumber_( firstValue_( data.total_price, data.price, data.amount, data.gia ) ); const productName = safeCellText_( firstValue_( data.product, data.product_name, data.ten_san_pham, ORDER_CONFIG.DEFAULT_PRODUCT ) ); const note = safeCellText_( firstValue_( data.note, data.notes, data.remark, data.ghi_chu ) ); const pageUrl = safeCellText_( firstValue_( data.page_url, data.landing_page, data.source_url, data.link_trang_dat_hang, data.referrer ) ); const campaign = safeCellText_( firstValue_( data.campaign, data.utm_campaign, data.campaign_name, data.campaign_id ) ); const adset = safeCellText_( firstValue_( data.adset, data.utm_adset, data.adset_name, data.ad_set, data.utm_term, data.adset_id ) ); const ad = safeCellText_( firstValue_( data.ad, data.utm_ad, data.ad_name, data.utm_content, data.ad_id ) ); const orderNumber = safeCellText_( firstValue_( data.order_number, data.order_id, data.ma_don, generateOrderNumber_() ) ); if (!fullName) { throw new Error("Thiếu tên khách hàng."); } if (!phone) { throw new Error("Thiếu số điện thoại."); } if (!address) { throw new Error("Thiếu địa chỉ giao hàng."); } if (!packageName) { throw new Error("Thiếu thông tin gói sản phẩm."); } const spreadsheet = SpreadsheetApp.openById( ORDER_CONFIG.SPREADSHEET_ID ); const sheet = getTargetSheet_(spreadsheet); ensureHeaders_(sheet); if (isDuplicateOrder_(sheet, orderNumber)) { return htmlResponse_({ source: ORDER_CONFIG.RESPONSE_SOURCE, success: true, duplicate: true, message: "Đơn hàng đã tồn tại.", order_number: orderNumber, sheet: sheet.getName() }); } const orderDate = parseDate_( firstValue_( data.created_at, data.time, data.order_time ) ); const formattedDate = Utilities.formatDate( orderDate, ORDER_CONFIG.TIMEZONE, "dd/MM/yyyy HH:mm:ss" ); let quantityAndSize = ""; if (quantity > 0) { quantityAndSize = quantity + " chai"; } if (size) { quantityAndSize += quantityAndSize ? " | Size: " + size : "Size: " + size; } const nextRow = Math.max( sheet.getLastRow() + 1, 2 ); const rowData = [ formattedDate, fullName, phone, note, address, packageName, pageUrl, totalPrice, quantityAndSize, ORDER_CONFIG.NEW_ORDER_STATUS, orderNumber, productName, campaign, adset, ad ]; sheet.getRange(nextRow, 3).setNumberFormat("@"); sheet.getRange(nextRow, 11).setNumberFormat("@"); sheet .getRange(nextRow, 1, 1, ORDER_CONFIG.HEADERS.length) .setValues([rowData]) .setVerticalAlignment("middle"); sheet .getRange(nextRow, 8) .setNumberFormat("#,##0"); SpreadsheetApp.flush(); return htmlResponse_({ source: ORDER_CONFIG.RESPONSE_SOURCE, success: true, message: "Đã ghi đơn hàng thành công.", order_number: orderNumber, row: nextRow, sheet: sheet.getName() }); } catch (error) { console.error( "Lỗi doPost:", error && error.stack ? error.stack : error ); return htmlResponse_({ source: ORDER_CONFIG.RESPONSE_SOURCE, success: false, message: error && error.message ? error.message : "Không thể ghi đơn hàng.", order_number: getOrderNumberFromEvent_(e) }); } finally { if (lockAcquired) { lock.releaseLock(); } } } function doGet() { try { const spreadsheet = SpreadsheetApp.openById( ORDER_CONFIG.SPREADSHEET_ID ); const sheet = getTargetSheet_(spreadsheet); return jsonResponse_({ success: true, message: "Apps Script đã kết nối đúng Google Sheets.", spreadsheet_name: spreadsheet.getName(), spreadsheet_id: spreadsheet.getId(), sheet: sheet.getName(), last_row: sheet.getLastRow(), timezone: ORDER_CONFIG.TIMEZONE }); } catch (error) { return jsonResponse_({ success: false, message: error && error.message ? error.message : "Không thể kết nối Google Sheets." }); } } function getRequestData_(e) { const data = {}; if (e && e.parameter) { Object.keys(e.parameter).forEach(function (key) { data[key] = e.parameter[key]; }); } if ( e && e.postData && e.postData.contents ) { const contentType = String( e.postData.type || "" ).toLowerCase(); if ( contentType.indexOf("application/json") !== -1 ) { try { const jsonData = JSON.parse( e.postData.contents ); if ( jsonData && typeof jsonData === "object" ) { Object.keys(jsonData).forEach(function (key) { data[key] = jsonData[key]; }); } } catch (jsonError) { console.warn( "Không đọc được dữ liệu JSON:", jsonError ); } } } return data; } function getOrderNumberFromEvent_(e) { try { const data = getRequestData_(e); return cleanText_( firstValue_( data.order_number, data.order_id, data.ma_don ) ); } catch (error) { return ""; } } function getTargetSheet_(spreadsheet) { let sheet = spreadsheet.getSheetByName( ORDER_CONFIG.SHEET_NAME ); if (sheet) { return sheet; } const targetName = normalizeSheetName_( ORDER_CONFIG.SHEET_NAME ); const sheets = spreadsheet.getSheets(); for (let index = 0; index < sheets.length; index++) { const currentSheet = sheets[index]; if ( normalizeSheetName_(currentSheet.getName()) === targetName ) { return currentSheet; } } if (sheets.length === 1) { return sheets[0]; } throw new Error( 'Không tìm thấy tab "' + ORDER_CONFIG.SHEET_NAME + '".' ); } function normalizeSheetName_(value) { return String(value || "") .trim() .toLowerCase() .replace(/\s+/g, " "); } function ensureHeaders_(sheet) { const totalColumns = ORDER_CONFIG.HEADERS.length; if (sheet.getMaxColumns() < totalColumns) { sheet.insertColumnsAfter( sheet.getMaxColumns(), totalColumns - sheet.getMaxColumns() ); } const headerRange = sheet.getRange( 1, 1, 1, totalColumns ); const currentHeaders = headerRange .getDisplayValues()[0]; const headerIsEmpty = currentHeaders.every( function (value) { return !String(value).trim(); } ); if (headerIsEmpty) { headerRange.setValues([ ORDER_CONFIG.HEADERS ]); headerRange .setFontWeight("bold") .setHorizontalAlignment("center") .setVerticalAlignment("middle") .setBackground("#93c47d") .setWrap(true); sheet.setFrozenRows(1); } } function isDuplicateOrder_(sheet, orderNumber) { if (!orderNumber) { return false; } const lastRow = sheet.getLastRow(); if (lastRow < 2) { return false; } const match = sheet .getRange(2, 11, lastRow - 1, 1) .createTextFinder(orderNumber) .matchEntireCell(true) .findNext(); return Boolean(match); } function parseDate_(dateValue) { if (dateValue) { const parsedDate = new Date(dateValue); if (!isNaN(parsedDate.getTime())) { return parsedDate; } } return new Date(); } function generateOrderNumber_() { const timestamp = Utilities.formatDate( new Date(), ORDER_CONFIG.TIMEZONE, "yyMMddHHmmss" ); const randomNumber = Math.floor( 1000 + Math.random() * 9000 ); return "MY" + timestamp + randomNumber; } function firstValue_() { for ( let index = 0; index < arguments.length; index++ ) { const value = arguments[index]; if ( value !== undefined && value !== null && String(value).trim() !== "" ) { return value; } } return ""; } function cleanText_(value) { return String( value === undefined || value === null ? "" : value ) .replace(/\s+/g, " ") .trim(); } function safeCellText_(value) { const text = cleanText_(value); if (/^[=+\-@]/.test(text)) { return "'" + text; } return text; } function cleanPhone_(value) { return String( value === undefined || value === null ? "" : value ) .replace(/[^\d+]/g, "") .trim(); } function toNumber_(value) { if ( value === undefined || value === null || value === "" ) { return 0; } const cleanedValue = String(value) .replace(/RM/gi, "") .replace(/[^\d.-]/g, ""); const numberValue = Number(cleanedValue); return isNaN(numberValue) ? 0 : numberValue; } function htmlResponse_(payload) { const safePayload = JSON.stringify(payload) .replace(//g, "\\u003e") .replace(/&/g, "\\u0026"); const html = "" + '' + "" + "
SOALAN LAZIM

SOALAN YANG
SERING DITANYA

Ketahui lebih lanjut tentang Syampu Halia LAOJIANG sebelum membuat pesanan.

Ya. Syampu Halia LAOJIANG diformulasikan untuk membantu membersihkan kulit kepala daripada minyak berlebihan, kotoran dan serpihan kelemumur supaya kulit kepala terasa lebih bersih dan segar.

Untuk rutin penjagaan harian, gunakan ketika mencuci rambut seperti biasa. Urut perlahan pada kulit kepala selama 2–3 minit sebelum membilas sehingga bersih.

Ya. Syampu ini sesuai digunakan oleh lelaki dan wanita yang ingin menjaga kebersihan kulit kepala serta mendapatkan rasa rambut yang lebih segar setiap hari.

Sesuai. Cuaca Malaysia yang panas dan lembap boleh menyebabkan kulit kepala mudah berminyak dan kurang selesa. Rutin mencuci dengan syampu yang sesuai membantu memberikan rasa bersih dan segar.

Ya. Ramai pemakai tudung memilih rutin penjagaan kulit kepala yang lebih menyegarkan kerana rambut lebih lama tertutup dan mudah berasa kurang selesa.

Setiap individu mempunyai keadaan kulit kepala yang berbeza. Dengan penggunaan secara konsisten, ramai pengguna merasakan kulit kepala lebih bersih, segar dan selesa dalam rutin harian mereka.

Ekstrak halia terkenal dalam penjagaan tradisional kerana memberikan rasa hangat dan menyegarkan. Dalam rutin rambut, ia membantu memberikan pengalaman mencuci yang lebih menyenangkan.

Anda hanya perlu pilih pakej pilihan, isi nama, nombor telefon dan alamat penghantaran. Pasukan kami akan menghubungi anda untuk mengesahkan pesanan sebelum penghantaran.

Pesanan Mudah & Selamat

Bayaran dan penghantaran akan disahkan bersama pelanggan sebelum pesanan diproses.