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);
}