Admin Dashboard GAS script Code

// 📊 CHARO SHEETS KI ID const foodSheetId = '1NjqHSgvmcD6Oo7Xd6VUcIRLG-5P57x6WQkoTCveUeqg'; const listSheetId = '1e9Wxh3cps3Bgw-9zCzZ7uA88gcLRK5YYlNs7t1-NoYg'; const clothSheetId = '1LvFnqRaWJPp-FoxSR0iomBjXoP-mDbawnBHj26zx23M'; const ownerAccessSheetId = '15KTshizI8H48SbXJfwu7LPQUAo-qkxMYQ4JTcXn2AVw'; // 🚀 NAYI SERVICE (4th Sheet) // ========================================== // 📥 1. DATA FETCHING (GET) - WITH EXACT ROW NUMBERS // ========================================== function doGet(e) { try { const foodSs = SpreadsheetApp.openById(foodSheetId); const listSs = SpreadsheetApp.openById(listSheetId); const clothSs = SpreadsheetApp.openById(clothSheetId); const ownerSs = SpreadsheetApp.openById(ownerAccessSheetId); // Nayi sheet open ki // 🚀 O(1) ROW NUMBER ENGINE const getSafeDataWithRow = (ss, name) => { const sheet = ss.getSheetByName(name); if (!sheet) return []; const data = sheet.getDataRange().getValues(); const result = []; for(let i=1; i r[0] && String(r[11]).toLowerCase() !== 'delivered' && String(r[11]).toLowerCase() !== 'cancelled' && String(r[11]).toLowerCase() !== 'refunded') .map(r => [r[1], r[6], r[11], r[r.length-1]]); const dData = getSafeDataWithRow(foodSs, "DeliveryPartners"); const drivers = dData.filter(r => r[0]).map(r => [r[1], r[2], r[10], r[12], r[r.length-1]]); const rData = getSafeDataWithRow(foodSs, "Restaurants"); const restaurants = rData.filter(r => r[0]).map(r => [r[3], r[10], r[r.length-1]]); // --- 📺 PRE-LISTING & ITEMS DATA (WITH UTR) --- const dealData = getSafeDataWithRow(listSs, "PTSDeals"); const deals = dealData.filter(r => r[0] && String(r[13]).toLowerCase() === 'pending') .map(r => [r[2], r[8], r[12], r[13], r[r.length-1]]); // r[12] is Col M (UTR) const iData = getSafeDataWithRow(listSs, "PTSitems"); const items = iData.filter(r => r[0] && String(r[11]).toLowerCase() === 'pending') .map(r => [r[2], r[3], r[10], r[11], r[r.length-1]]); // r[10] is Col K (UTR) // --- 👕 CLOTH DATA --- const coData = getSafeDataWithRow(clothSs, "Orders_Master"); const clothOrders = coData.filter(r => r[0] && String(r[14]).toLowerCase() !== 'delivered' && String(r[14]).toLowerCase() !== 'cancelled') .map(r => [r[1], r[8], r[14], r[r.length-1]]); const cdData = getSafeDataWithRow(clothSs, "DeliveryPartners"); const clothDrivers = cdData.filter(r => r[0]).map(r => [r[1], r[2], r[11], r[8], r[r.length-1]]); const cvData = getSafeDataWithRow(clothSs, "Vendor_Master"); const clothVendors = cvData.filter(r => r[0]).map(r => [r[2], r[8], r[7], r[r.length-1]]); // --- 🤝 4. CHANNEL LISTING - AFTER OWNER ACCESS (NEW SERVICE) --- const ownerData = getSafeDataWithRow(ownerSs, "New Channels"); // Columns: r[0]=Timestamp, r[3]=Status (Col D), r[5]=Name (Col F), r[6]=Subs (Col G) const ownerAccessDeals = ownerData.filter(r => r[0] && String(r[3]).toLowerCase() === 'pending') .map(r => [r[5], r[6], r[3], r[r.length-1]]); // Return mapped data safely return ContentService.createTextOutput(JSON.stringify({ success: true, type: 'READ', orders, drivers, restaurants, deals, items, clothOrders, clothDrivers, clothVendors, ownerAccessDeals // NAYA DATA ADD KIYA })).setMimeType(ContentService.MimeType.JSON); } catch(err) { return ContentService.createTextOutput(JSON.stringify({success: false, error: err.toString()})).setMimeType(ContentService.MimeType.JSON); } } // ========================================== // 📤 2. DIRECT ROW UPDATING (POST) // ========================================== function doPost(e) { try { if (!e || !e.postData || !e.postData.contents) { return ContentService.createTextOutput(JSON.stringify({success: false, error: "Empty Payload"})).setMimeType(ContentService.MimeType.JSON); } const data = JSON.parse(e.postData.contents); const action = data.action; const rowNum = Number(data.id); const newValue = data.newValue; const channelId = data.extraData; // 🚀 HTML se aayi hui Channel ID (Agar ho toh) if(!rowNum || rowNum < 2) { return ContentService.createTextOutput(JSON.stringify({success: false, error: "Invalid Row Number"})).setMimeType(ContentService.MimeType.JSON); } const foodSs = SpreadsheetApp.openById(foodSheetId); const listSs = SpreadsheetApp.openById(listSheetId); const clothSs = SpreadsheetApp.openById(clothSheetId); const ownerSs = SpreadsheetApp.openById(ownerAccessSheetId); // Nayi sheet open ki let sheet, colNum; // Routing Logic to map actions to target sheet & column if (action === 'update_order') { sheet = foodSs.getSheetByName("Orders"); colNum = 12; } else if (action === 'update_driver') { sheet = foodSs.getSheetByName("DeliveryPartners"); colNum = 13; } else if (action === 'update_restaurant') { sheet = foodSs.getSheetByName("Restaurants"); colNum = 11; } else if (action === 'update_deal') { sheet = listSs.getSheetByName("PTSDeals"); colNum = 14; } else if (action === 'update_item') { sheet = listSs.getSheetByName("PTSitems"); colNum = 12; } else if (action === 'update_cloth_order') { sheet = clothSs.getSheetByName("Orders_Master"); colNum = 15; } else if (action === 'update_cloth_driver') { sheet = clothSs.getSheetByName("DeliveryPartners"); colNum = 9; } else if (action === 'update_cloth_vendor') { sheet = clothSs.getSheetByName("Vendor_Master"); colNum = 8; } // 🚀 ACTION FOR: "After Owner Access" Deals (Status is in Column D -> 4) else if (action === 'update_owner_access') { sheet = ownerSs.getSheetByName("Channel_Deals_Database"); colNum = 4; } else { return ContentService.createTextOutput(JSON.stringify({success: false, error: "Unknown Action"})).setMimeType(ContentService.MimeType.JSON); } if(sheet) { // Step 1: Normal Status Update karein sheet.getRange(rowNum, colNum).setValue(newValue); // 🚀 Step 2: Agar Owner Access approve hua hai aur Channel ID aayi hai, toh Col E me likhein if (action === 'update_owner_access' && newValue === 'APPROVED' && channelId) { sheet.getRange(rowNum, 5).setValue(channelId); // Column E = 5 } SpreadsheetApp.flush(); return ContentService.createTextOutput(JSON.stringify({success: true, type: 'WRITE', log: `Row ${rowNum} updated!`})).setMimeType(ContentService.MimeType.JSON); } else { return ContentService.createTextOutput(JSON.stringify({success: false, error: "Sheet tab not found"})).setMimeType(ContentService.MimeType.JSON); } } catch (err) { return ContentService.createTextOutput(JSON.stringify({success: false, error: err.toString()})).setMimeType(ContentService.MimeType.JSON); } }