app script

// ========================================== // CHANNEL DEALS & PT SEVA DEALS - GAS MASTER SCRIPT (FINAL PERFECT) // ========================================== const SHEET_ID = '1zLtoIoTeWDYUY8RXSCESpPuSYf6jNkpGw_HRAKOMzJo'; const ADMIN_WHATSAPP = "917987744656"; // 🔴 API KEYS 🔴 const GROQ_API_KEY = "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"; const BLOG_ID = "8618582521881069823"; // ========================================== // 1. DATA DIKHANE KE LIYE (GET REQUEST) // ========================================== function doGet(e) { try { const ss = SpreadsheetApp.openById(SHEET_ID); const action = (e.parameter && e.parameter.action) ? e.parameter.action : "getChannels"; // 🟢 NEW: INVENTORY SYSTEM FETCH (UPDATED FOR MORE STATS) if (action === "getInventory") { function fetchSheet(sheetName, mapper) { const sheet = ss.getSheetByName(sheetName); if(!sheet) return []; const data = sheet.getDataRange().getValues(); let res = []; for(let i=1; i ({ id: r[4], name: r[5], subs: r[6], views: r[7], monetized: r[8], earning: r[9], watchTime: r[10], strike: r[11], category: r[12], type: r[13], topGeo: r[2], status: s, blogLink: r[18], adminWhatsapp: ADMIN_WHATSAPP })); // Insta mein 6 Stats const igData = fetchSheet("Insta_Deals", (r, s) => ({ id: r[4], name: r[5], followers: r[6], reach: r[7], storyViews: r[8], oge: r[9], category: r[10], topGeo: r[2], status: s, blogLink: r[18], adminWhatsapp: ADMIN_WHATSAPP })); // FB mein 8 Stats (Updated for Earning/WT and Category) const fbData = fetchSheet("FB_Deals", (r, s) => ({ id: r[4], name: r[5], followers: r[6], reach: r[7], monetized: r[8], bmStatus: r[9], quality: r[10], earning: r[11], watchTime: r[12], category: r[13], // ✅ L(11)=Earning, M(12)=WT, N(13)=Category topGeo: r[2], status: s, blogLink: r[19], adminWhatsapp: ADMIN_WHATSAPP })); return jsonResponse({ yt: ytData, ig: igData, fb: fbData }); } if (action === "getPartnerStats") { const partnerId = e.parameter.partnerId; const partnerSheet = ss.getSheetByName("Partners_DB"); const pData = partnerSheet.getDataRange().getValues(); for (let i = 1; i < pData.length; i++) { if (pData[i][1].toString().trim() === partnerId) { return jsonResponse({ name: pData[i][2], totalLeads: pData[i][5], successDeals: pData[i][6], wallet: pData[i][7], paymentStatus: pData[i][9] }); } } return jsonResponse({ error: "Partner ID not found" }); } // ORIGINAL GET CHANNELS const sheet = ss.getSheetByName("New Channels"); const data = sheet.getDataRange().getValues(); let jsonData = []; for (let i = 1; i < data.length; i++) { let row = data[i]; let status = row[3] ? row[3].toString().trim().toUpperCase() : ""; if (status === "APPROVED" || status === "SOLD OUT") { jsonData.push({ adminWhatsapp: ADMIN_WHATSAPP, topGeo: row[2] || "", status: status === "SOLD OUT" ? "Sold Out" : "Approved", channelId: row[4] || "", channelName: row[5] || "", subscribers: row[6] || "", views: row[7] || "", monetized: row[8] ? row[8].toString().trim().toLowerCase() : "no", lifetimeEarning: row[9] || "", watchTime: row[10] || "", strikeInfo: row[11] || "", category: row[12] || "", videoType: row[13] || "", detailLink: row[18] || "#" }); } } return jsonResponse(jsonData); } catch (error) { return jsonResponse({ "error": error.message }); } } // ========================================== // 2. DATA SAVE KARNE KE LIYE (POST REQUEST) // ========================================== function doPost(e) { try { const ss = SpreadsheetApp.openById(SHEET_ID); let formData = JSON.parse(e.postData.contents || "{}"); const action = formData.action; const timestamp = new Date(); // --- YOUTUBE FORM (Original 100% Intact) --- if (action === "sellChannel") { const dbSheet = ss.getSheetByName("New Channels"); const newRow = dbSheet.getLastRow() + 1; const channelId = "CD" + (1000 + newRow); const promptFormula = '="इस यूट्यूब चैनल की सिर्फ 3-4 लाइन की एक दमदार और आकर्षक AI Description लिखो। यह चैनल सेल के लिए है। सिर्फ फायदे बताओ ताकि कस्टमर तुरंत खरीद ले। चैनल का नाम: " & F' + newRow + ' & ", सब्सक्राइबर्स: " & G' + newRow + ' & ", कमाई: " & J' + newRow + ' & "। कोई HTML मत देना, सिर्फ सीधा टेक्स्ट लिखना।"'; const msgFormula = '="🔔 YouTube Channel for Sale ! 🔔" & CHAR(10) & "-----" & CHAR(10) & "👉 Channel ID: " & E' + newRow + ' & CHAR(10) & "👉 Current Status: AVAILABLE🟢" & CHAR(10) & "👉 Total Subscribers: " & G' + newRow + ' & CHAR(10) & "👉 Life Time Views: " & H' + newRow + ' & CHAR(10) & "👉 Monetize Status: " & I' + newRow + ' & CHAR(10) & "👉 Video type: " & N' + newRow + ' & CHAR(10) & "👉 Restrictions/Strikes: " & L' + newRow + ' & CHAR(10) & "👉 Lifetime Earnings: " & J' + newRow + ' & CHAR(10) & "👉 View More (Dashboard SS etc.): " & IF(S' + newRow + '="", "Link Processing...", S' + newRow + ') & CHAR(10) & CHAR(10) & "📌 Interested?, To buy this channel, Send us a message on What\'s App or Arratai: ' + ADMIN_WHATSAPP + ' with Screenshot or Channel ID Number: " & E' + newRow; dbSheet.appendRow([ timestamp, trimData(formData.sellerWhatsapp), trimData(formData.topGeo), "Pending", channelId, trimData(formData.channelName), trimData(formData.subscribers), trimData(formData.views), trimData(formData.monetized || "no"), trimData(formData.earning || "0"), trimData(formData.watchTime || "0"), trimData(formData.strikeInfo || "No Strike"), trimData(formData.category), trimData(formData.videoType || ""), trimData(formData.images[0]), trimData(formData.images[1]), trimData(formData.images[2]), trimData(formData.channelLink), "", trimData(formData.partnerId || ""), promptFormula, "", msgFormula ]); return jsonResponse({ status: "success", message: "Channel listed!" }); } // 🟢 NEW: INSTAGRAM FORM (FIXED COLUMNS A TO T) if (action === "sellInsta") { const dbSheet = ss.getSheetByName("Insta_Deals"); const newRow = dbSheet.getLastRow() + 1; const accId = "IG" + (1000 + newRow); const promptFormula = '="इस Instagram Account की 3-4 लाइन की दमदार AI Description लिखो। फायदे बताओ। Username: " & F' + newRow + ' & ", Followers: " & G' + newRow + ' & ", Reach: " & H' + newRow + ' & "। कोई HTML मत देना।"'; // ✅ FIX: View More ke liye ab 'S' ki jagah 'P' (Blog Link column) use hoga const msgFormula = '="⭐ Instagram Account for Sale ! ⭐" & CHAR(10) & ' + '"-----" & CHAR(10) & ' + '"👉 Account ID: " & E' + newRow + ' & CHAR(10) & ' + '"👉 Current Status: AVAILABLE🟢" & CHAR(10) & ' + '"👉 Total Followers: " & G' + newRow + ' & CHAR(10) & ' + '"👉 Monthly Reach: " & H' + newRow + ' & CHAR(10) & ' + '"👉 Avg. Story Views: " & I' + newRow + ' & CHAR(10) & ' + '"👉 OGE Status: " & J' + newRow + ' & CHAR(10) & ' + '"👉 Top Audience: " & K' + newRow + ' & CHAR(10) & ' + '"👉 Category: " & L' + newRow + ' & CHAR(10) & ' + '"👉 View More (Insights SS etc.): " & IF(P' + newRow + '="", "Processing...", P' + newRow + ') & CHAR(10) & CHAR(10) & ' + '"📌 Interested?, To buy this account, Send us a message on What\'s App or Arratai: ' + ADMIN_WHATSAPP + ' with Screenshot or Account ID Number: " & E' + newRow; // ✅ FIX: Faltu khali strings hata diye hain. Exact 20 Columns map kiye hain. dbSheet.appendRow([ timestamp, // A (1) trimData(formData.sellerWhatsapp), // B (2) trimData(formData.topGeo), // C (3) "Pending", // D (4) accId, // E (5) trimData(formData.instaUsername), // F (6) trimData(formData.followers), // G (7) trimData(formData.monthlyReach), // H (8) trimData(formData.storyViews), // I (9) trimData(formData.ogeStatus), // J (10) trimData(formData.category), // K (11) trimData(formData.images[0]), // L (12) Reach SS trimData(formData.images[1]), // M (13) Audience SS trimData(formData.images[2]), // N (14) History SS "https://instagram.com/" + formData.instaUsername.replace('@',''), // O (15) Profile Link "", // P (16) Blog Link trimData(formData.partnerId || ""), // Q (17) Partner ID promptFormula, // R (18) Prompt Formula "", // S (19) Blog Code msgFormula // T (20) Message Formula ]); return jsonResponse({ status: "success", message: "Insta listed!" }); } // 🟢 NEW: FACEBOOK FORM if (action === "sellFacebook") { const dbSheet = ss.getSheetByName("FB_Deals"); const newRow = dbSheet.getLastRow() + 1; const pgId = "FB" + (1000 + newRow); const promptFormula = '="इस Facebook Page की 3-4 लाइन की दमदार AI Description लिखो। फायदे बताओ। Page Name: " & F' + newRow + ' & ", Followers: " & G' + newRow + ' & ", Monetization: " & I' + newRow + ' & "। कोई HTML मत देना।"'; const msgFormula = '="📢 Facebook Page for Sale ! 📢" & CHAR(10) & ' + '"-----" & CHAR(10) & ' + '"👉 Page ID: " & E' + newRow + ' & CHAR(10) & ' + '"👉 Current Status: AVAILABLE🟢" & CHAR(10) & ' + '"👉 Total Followers: " & G' + newRow + ' & CHAR(10) & ' + '"👉 Last 28D Reach: " & H' + newRow + ' & CHAR(10) & ' + '"👉 Monetize Status: " & I' + newRow + ' & CHAR(10) & ' + '"👉 Page Quality: " & K' + newRow + ' & CHAR(10) & ' + '"👉 Category: " & N' + newRow + ' & CHAR(10) & ' + '"👉 Earning / WT: " & IF(L' + newRow + '="", M' + newRow + ', L' + newRow + ') & CHAR(10) & ' + '"👉 View More (Insights SS etc.): " & IF(T' + newRow + '="", "Processing...", T' + newRow + ') & CHAR(10) & CHAR(10) & ' + '"📌 Interested?, To buy this page, Send us a message on What\'s App or Arratai: ' + ADMIN_WHATSAPP + ' with Screenshot or Page ID Number: " & E' + newRow; dbSheet.appendRow([ timestamp, trimData(formData.sellerWhatsapp), trimData(formData.topGeo), "Pending", pgId, trimData(formData.pageName), trimData(formData.followers), trimData(formData.reach), trimData(formData.monetization), trimData(formData.bmStatus), trimData(formData.pageQuality), trimData(formData.earning || "0"), trimData(formData.watchTime || "0"), trimData(formData.category), // ✅ FIX: L=Earning, M=WT, N=Category trimData(formData.images[0]), trimData(formData.images[1]), trimData(formData.images[2]), trimData(formData.images[3]), trimData(formData.pageLink), "", trimData(formData.partnerId || ""), promptFormula, "", msgFormula ]); return jsonResponse({ status: "success", message: "FB listed!" }); } if (action === "registerPartner") { const waNum = trimData(formData.whatsapp).replace(/\D/g, ''); const partnerId = "pts-" + waNum.slice(-5); ss.getSheetByName("Partners_DB").appendRow([timestamp, partnerId, trimData(formData.name), waNum, trimData(formData.upi), 0, 0, 0, 0, "Active"]); return jsonResponse({ status: "success", partnerId: partnerId }); } if (action === "submitLead") { const pId = trimData(formData.partnerId); ss.getSheetByName("Leads_DB").appendRow([timestamp, pId, trimData(formData.leadType), trimData(formData.customerWhatsapp), trimData(formData.requirement), trimData(formData.budget), "Pending", ""]); updatePartnerLeadCount(ss, pId); return jsonResponse({ status: "success" }); } return jsonResponse({ status: "error", message: "Invalid action." }); } catch (error) { return jsonResponse({ status: "error", message: error.message }); } } // ========================================== // 3. MAGIC AUTOMATION (ON EDIT TRIGGER) // ========================================== function createAutoBlog(e) { if (!e || !e.range) return; const sheet = e.range.getSheet(); const sheetName = sheet.getName(); const row = e.range.getRow(); const col = e.range.getColumn(); const value = e.value; if (row < 2) return; if ((sheetName === "New Channels" || sheetName === "Insta_Deals" || sheetName === "FB_Deals") && col === 4) { const statusValue = value ? value.toString().trim().toUpperCase() : ""; if (statusValue === "REJECTED") { sheet.deleteRow(row); return; } if (statusValue === "APPROVED") { let promptCol, blogLinkCol, blogCodeCol; // ✅ Corrected Mapping for All Sheets if (sheetName === "New Channels") { promptCol = 21; blogLinkCol = 19; blogCodeCol = 22; } else if (sheetName === "Insta_Deals") { promptCol = 18; blogLinkCol = 16; blogCodeCol = 19; } // Prompt=R(18), Link=P(16), Code=S(19) else if (sheetName === "FB_Deals") { promptCol = 22; blogLinkCol = 20; blogCodeCol = 23; } const blogLinkCheck = sheet.getRange(row, blogLinkCol).getValue(); if (!blogLinkCheck) { // Data range thodi lambi fetch kar rahe hain taaki FB ke Column X (24) tak aa jaye const rowData = sheet.getRange(row, 1, 1, 26).getValues()[0]; const geminiPrompt = rowData[promptCol - 1]; // Array 0-indexed hota hai try { const rawText = callGroq(geminiPrompt); const aiDescription = rawText.replace(/```html/g, "").replace(/```/g, "").trim().replace(/\n/g, "
"); // Blog code right column mein save hoga (Insta ke liye 'S') sheet.getRange(row, blogCodeCol).setValue(aiDescription); let postUrl = ""; const postTitle = `🔥 Buy ${rowData[5]} | ID: ${rowData[4]}`; if (sheetName === "New Channels") postUrl = publishToBlogger(postTitle, aiDescription, rowData[12], rowData); else if (sheetName === "Insta_Deals") postUrl = publishInstaToBlogger(postTitle, aiDescription, rowData[10], rowData); else if (sheetName === "FB_Deals") postUrl = publishFBToBlogger(postTitle, aiDescription, rowData[13], rowData); if (postUrl) { // ✅ Ab 100% guarantee hai ki Link sahi jagah jayega (Insta ke liye 'P') sheet.getRange(row, blogLinkCol).setValue(postUrl); sheet.getRange(row, promptCol).clearContent(); sheet.getRange(row, blogCodeCol).clearContent(); } } catch (error) { // Error bhi usi blogLinkCol mein aayega sheet.getRange(row, blogLinkCol).setValue("Error: " + error.message); } } } } // Partner Trigger if (sheetName === "Partners_DB" && col === 10) { if (value && value.toString().trim().toLowerCase() === "settled") { const walletRange = sheet.getRange(row, 8), paidRange = sheet.getRange(row, 9); const curWallet = parseFloat(walletRange.getValue()) || 0, curPaid = parseFloat(paidRange.getValue()) || 0; if (curWallet > 0) { paidRange.setValue(curPaid + curWallet); walletRange.setValue(0); } } } if (sheetName === "Leads_DB" && (col === 7 || col === 8)) { const statusValue = sheet.getRange(row, 7).getValue().toString().trim().toLowerCase(); const commission = parseFloat(sheet.getRange(row, 8).getValue()) || 0; if (statusValue === "done" && commission > 0) { const pId = sheet.getRange(row, 2).getValue().toString().trim(); if (pId) { const pSheet = e.source.getSheetByName("Partners_DB"); const pData = pSheet.getDataRange().getValues(); for (let i = 1; i < pData.length; i++) { if (pData[i][1].toString().trim() === pId) { pSheet.getRange(i + 1, 7).setValue((parseInt(pData[i][6]) || 0) + 1); pSheet.getRange(i + 1, 8).setValue((parseFloat(pData[i][7]) || 0) + commission); pSheet.getRange(i + 1, 10).setValue("Pending"); sheet.getRange(row, 7).setValue("Done ✅"); break; } } } } } } // ========================================== // 4. FULLY-AUTO SEO MACHINE // ========================================== // ========================================== // 4. FULLY-AUTO SEO MACHINE (SMART SEO SUMMARY FIX) // ========================================== function runAutoSEOManager() { const ss = SpreadsheetApp.openById(SHEET_ID); let seoSheet = ss.getSheetByName("SEO_Keywords_DB"); if (!seoSheet) return; const data = seoSheet.getDataRange().getValues(); for (let i = 1; i < data.length; i++) { let keyword = data[i][0] ? data[i][0].toString().trim() : ""; let status = data[i][1] ? data[i][1].toString().trim().toUpperCase() : ""; if (status === "PENDING" && keyword !== "") { try { // NAYA COMMAND: AI ab sabse pehle 140 character ka description likhega const prompt = `Write a highly engaging, SEO-optimized article about "${keyword}". Language: Mix of English and simple Hindi (Hinglish/Roman Hindi) so Indian audience can easily read. Format: Use proper HTML tags like

,

,

,

    ,
  • . CRITICAL SEO RULE: The very first element of the article MUST be a

    tag containing a powerful 140-character SEO Meta Description summarizing the topic. Make it bold using tag. Important: At the very end of the article, add a compelling Call-to-Action (CTA) inside an attractive HTML box with background color #162438, text color white, and border-left 4px solid #f39c12. The CTA should say: "🔥 Kya aap bhi ek Safe, Monetized YouTube Channel kharidna ya apna channel bechna chahte hain? Hamari PT Seva Deals agency aapse sirf 1 WhatsApp message door hai! Aaj hi sampark karein: +91 7987744656." Output rule: Return ONLY the clean HTML code for the article body. No markdown backticks, no or tags.`; const rawText = callGroq(prompt); const cleanHtml = rawText.replace(/```html/g, "").replace(/```/g, "").trim(); // API ke liye bhi description bhejenge (Agar Google future me apna bug theek kar de) const plainText = cleanHtml.replace(/<[^>]+>/g, '').replace(/ /g, ' ').trim(); const searchDesc = plainText.length > 145 ? plainText.substring(0, 145) + "..." : plainText; publishSEOArticleToBlogger(keyword, cleanHtml, searchDesc); seoSheet.getRange(i + 1, 2).setValue("DONE ✅"); break; } catch (error) { seoSheet.getRange(i + 1, 3).setValue("Error: " + error.message); break; } } } } // ========================================== // API HELPER FUNCTIONS // ========================================== function callGroq(promptText) { const url = "https://api.groq.com/openai/v1/chat/completions"; const payload = { "model": "llama-3.3-70b-versatile", "messages": [{ "role": "user", "content": promptText }], "temperature": 0.7 }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + GROQ_API_KEY }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.choices && json.choices.length > 0) return json.choices[0].message.content; else throw new Error("Groq API Error"); } // ========================================== // 5. PREMIUM APP-STYLE BLOGGER FUNCTION (YT - 100% ORIGINAL TEMPLATE) // ========================================== function publishToBlogger(title, aiContent, label, rowData) { const channelId = rowData[4] || "N/A"; const subs = rowData[6] || "0"; const views = rowData[7] || "0"; let rawMon = (rowData[8] || "No").toString().trim().toLowerCase(); let monStatus = "Not Monetised"; if (rawMon === "yes") monStatus = "Full Monetised"; else if (rawMon === "half") monStatus = "Half Monetised"; else if (rawMon !== "no" && rawMon !== "") monStatus = rowData[8]; const earnings = rowData[9] || "$0"; const strikes = rowData[11] || "None"; const videoType = rowData[13] || "Mixed"; const img1 = rowData[14] || ""; const img2 = rowData[15] || ""; const img3 = rowData[16] || ""; const ytLink = rowData[17] || "#"; const finalHtml = ` ${title}

    Earning Channel
    ID: ${channelId}

    ${subs} Subs & ${monStatus} YouTube Channel For Sale!

    Buy this active, earning channel (${videoType} Videos) securely.

    ${subs}

    Subscribers

    ${views}

    Lifetime Views

    ${videoType}

    Video Type

    ${monStatus}

    Status

    Restrictions: ${strikes}
    Monetize Status: ${monStatus}
    Lifetime Earnings: ${earnings}

    Channel Info

    ${aiContent}

    100% सुरक्षित डील

    चैनल आपको पूरी सेफ्टी के साथ ट्रांसफर किया जाएगा।

    `; const url = "https://www.googleapis.com/blogger/v3/blogs/" + BLOG_ID + "/posts/"; const labelsArray = label ? [label.toString().trim(), "Channel Deals", "Premium"] : ["Channel Deals", "Premium"]; const payload = { "kind": "blogger#post", "title": title, "content": finalHtml, "labels": labelsArray }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.url) return json.url; else throw new Error(json.error ? json.error.message : "Blogger error"); } // 🟢 NEW: PUBLISHER (INSTAGRAM) - INDEPENDENT CODE function publishInstaToBlogger(title, aiContent, label, rowData) { // Extracting Exact Columns for Insta_Deals (Updated for New Sheet Structure) const accId = rowData[4] || "N/A"; const username = rowData[5] || "N/A"; const followers = rowData[6] || "0"; const reach = rowData[7] || "0"; const storyViews = rowData[8] || "0"; const oge = rowData[9] || "No"; const category = rowData[10] || "Mixed"; // 👇 FIXED INDICES: Shifted back by 3 due to deleted columns const img1 = rowData[11] || ""; // L Column const img2 = rowData[12] || ""; // M Column const img3 = rowData[13] || ""; // N Column const igLink = rowData[14] || "#"; // O Column const finalHtml = ` ${title}
    Instagram Account
    ID: ${accId}

    ${followers} Followers & ${category} Instagram Account For Sale!

    Buy this highly active Instagram account securely with Escrow.

    ${followers}

    Followers

    ${reach}

    Monthly Reach

    ${storyViews}

    Story Views

    ${oge}

    OGE Status

    Account Niche: ${category}
    Original Email (OGE): ${oge}
    Profile Link: Provided on Request

    Account Info

    ${aiContent}

    100% सुरक्षित डील

    अकाउंट आपको पूरी सेफ्टी के साथ ट्रांसफर किया जाएगा।

    `; const url = "https://www.googleapis.com/blogger/v3/blogs/" + BLOG_ID + "/posts/"; const payload = { "kind": "blogger#post", "title": title, "content": finalHtml, "labels": ["Instagram Deals", "Premium"] }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.url) return json.url; else throw new Error("Blogger Error"); } // 🟢 NEW: PUBLISHER (FACEBOOK) - INDEPENDENT & SAFE CODE function publishFBToBlogger(title, aiContent, label, rowData) { const pgId = rowData[4] || "N/A"; const pageName = rowData[5] || "N/A"; const followers = rowData[6] || "0"; const reach = rowData[7] || "0"; let monStatus = rowData[8] || "No"; const bm = rowData[9] || "No"; const qual = rowData[10] || "Mixed"; // ✅ Ab Column L (11) sirf Earning hai, Name Change hamesha ke liye hat gaya const rawEarning = (rowData[11] || "").toString().trim(); // Column L const rawWT = (rowData[12] || "").toString().trim(); // Column M const category = rowData[13] || "Mixed"; // Column N const img1 = rowData[14] || ""; const img2 = rowData[15] || ""; const img3 = rowData[16] || ""; const img4 = rowData[17] || ""; const fbLink = rowData[18] || "#"; // Custom Logic for Monetization / Earning / WT let extraStatTitle = "Earning / WT"; let extraStatValue = "N/A"; if (rawEarning !== "") { extraStatTitle = "Lifetime Earnings"; extraStatValue = rawEarning; } else if (rawWT !== "") { extraStatTitle = "Watch Time (60D)"; extraStatValue = rawWT; } const finalHtml = ` ${title}
    Facebook Page
    ID: ${pgId}

    ${followers} Followers & ${qual} Quality Facebook Page For Sale!

    Buy this highly active Facebook Page securely with Escrow.

    ${followers}

    Followers

    ${reach}

    Reach (28D)

    ${bm}

    BM Status

    ${monStatus}

    Monetization

    Page Quality: ${qual}
    Category: ${category}
    ${extraStatTitle}: ${extraStatValue}

    Page Info

    ${aiContent}

    100% सुरक्षित डील

    पेज आपको पूरी सेफ्टी के साथ ट्रांसफर किया जाएगा।

    `; const labelsArray = label ? ["Facebook Deals", "Premium", label.toString().trim()] : ["Facebook Deals", "Premium"]; const url = "https://www.googleapis.com/blogger/v3/blogs/" + BLOG_ID + "/posts/"; const payload = { "kind": "blogger#post", "title": title, "content": finalHtml, "labels": labelsArray }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.url) return json.url; else throw new Error(json.error ? json.error.message : "Blogger Error"); } function publishSEOArticleToBlogger(title, htmlContent) { const url = "https://www.googleapis.com/blogger/v3/blogs/" + BLOG_ID + "/posts/"; const finalHtml = `

    ${title}

    ${htmlContent}
    `; const payload = { "kind": "blogger#post", "title": title, "content": finalHtml, "labels": ["SEO", "Growth", "Guide"] }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.url) return json.url; else throw new Error("Blogger error"); } function trimData(val) { return val ? val.toString().trim() : ""; } function jsonResponse(data) { return ContentService.createTextOutput(JSON.stringify(data)).setMimeType(ContentService.MimeType.JSON); } function updatePartnerLeadCount(ss, pId) { const sheet = ss.getSheetByName("Partners_DB"), data = sheet.getDataRange().getValues(); for (let i = 1; i < data.length; i++) { if (data[i][1].toString().trim() === pId) { sheet.getRange(i+1, 6).setValue((parseInt(data[i][5])||0)+1); break; } } }