feedback backend script running

// ========================================== // CUSTOMER FEEDBACK SYSTEM - GAS BACKEND (Pagination + Channel Type Final) // ========================================== const SHEET_NAME = 'Feedback data'; function doGet(e) { try { const action = (e.parameter && e.parameter.action) ? e.parameter.action : "getFeedbacks"; if (action === "getFeedbacks") { // SAFETY FIX: Checking if e.parameter exists before reading start/limit const start = (e.parameter && e.parameter.start) ? parseInt(e.parameter.start) : 0; const limit = (e.parameter && e.parameter.limit) ? parseInt(e.parameter.limit) : 20; const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName(SHEET_NAME); if (!sheet) throw new Error("Sheet '" + SHEET_NAME + "' nahi mili."); const data = sheet.getDataRange().getValues(); let allValidFeedbacks = []; // Niche se upar loop (Latest first) for (let i = data.length - 1; i >= 1; i--) { let row = data[i]; // D column is Deal Type now (Index 3) if (!row[0] && !row[3]) continue; let imageLinks = []; // Images E(4) se N(13) tak hain for (let j = 4; j <= 13; j++) { let link = row[j] ? row[j].toString().trim() : ""; if (link) imageLinks.push(link); } if (imageLinks.length > 0) { let formattedDate = "N/A"; if (row[0]) { let dateObj = new Date(row[0]); formattedDate = Utilities.formatDate(dateObj, Session.getScriptTimeZone(), "dd/MM/yyyy"); } allValidFeedbacks.push({ date: formattedDate, channelType: row[2] ? row[2].toString().trim() : "Not Monetized", // C: Channel Type dealType: row[3] ? row[3].toString().trim() : "Channel Sold", // D: Deal Type images: imageLinks }); } } // Server-Side Slice (Pagination Logic) const paginatedFeedbacks = allValidFeedbacks.slice(start, start + limit); const hasMoreData = (start + limit) < allValidFeedbacks.length; return jsonResponse({ status: "success", data: paginatedFeedbacks, hasMore: hasMoreData, totalRecords: allValidFeedbacks.length }); } return jsonResponse({ status: "error", message: "Invalid action." }); } catch (error) { return jsonResponse({ status: "error", message: error.message }); } } function doPost(e) { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName(SHEET_NAME); if (!sheet) throw new Error("Sheet '" + SHEET_NAME + "' nahi mili."); if (!e || !e.postData || !e.postData.contents) { throw new Error("No data received from form."); } let formData = JSON.parse(e.postData.contents); const action = formData.action; if (action === "submitFeedback") { let rowData = [ formData.date ? new Date(formData.date) : new Date(), // A: Date (Index 0) trimData(formData.contact), // B: Contact (Index 1) trimData(formData.channelType), // C: Channel Type (Index 2) trimData(formData.dealType) // D: Deal Type (Index 3) ]; let imageArray = Array.isArray(formData.images) ? formData.images : []; // Images 4 se 13 tak for (let i = 0; i < 10; i++) { rowData.push(imageArray[i] ? trimData(imageArray[i]) : ""); } sheet.appendRow(rowData); return jsonResponse({ status: "success", message: "Feedback saved successfully!" }); } return jsonResponse({ status: "error", message: "Invalid POST action." }); } catch (error) { return jsonResponse({ status: "error", message: error.message }); } } function trimData(val) { return val ? val.toString().trim() : ""; } function jsonResponse(data) { return ContentService.createTextOutput(JSON.stringify(data)) .setMimeType(ContentService.MimeType.JSON); }