H2H match and sikka game app script code

// ======================================================= // 🚀 ARENA 11 - ULTIMATE MASTER BACKEND (v12.1 PRO FINAL) // 🔒 All Limits, Cancel Refund, Toss Logic & Admin Lock // ======================================================= const MIN_BET = 20; const MAX_BET = 500; const MIN_WITHDRAW = 100; const MAX_WITHDRAW = 5000; const ADMIN_SECRET = "ARENA_ADMIN_786"; // 🚨 H2H Match Settlement ke liye Secret Password function doPost(e) { try { var payload = JSON.parse(e.postData.contents); var action = payload.action; // --- PUBLIC ROUTES --- if (action === "register") return jsonResponse(handleRegister(payload)); if (action === "login") return jsonResponse(handleLogin(payload)); if (action === "getDashboardData") return jsonResponse(getDashboardData()); // --- SECURE ROUTES (Session Token Required) --- if (!verifySession(payload.phone, payload.token)) { return jsonResponse({ success: false, message: "Session Expired! Logged in from another device." }); } if (action === "getUserData") return jsonResponse(handleGetUserData(payload)); if (action === "deposit") return jsonResponse(handleDeposit(payload)); if (action === "withdraw") return jsonResponse(handleWithdraw(payload)); // --- H2H ARENA GAMES --- if (action === "createChallenge") return jsonResponse(handleCreateChallenge(payload)); if (action === "acceptChallenge") return jsonResponse(handleAcceptChallenge(payload)); if (action === "cancelChallenge") return jsonResponse(handleCancelChallenge(payload)); // 🔥 NEW: Auto Refund if (action === "resolveH2HMatch") return jsonResponse(handleResolveH2HMatch(payload)); // --- TOSS GAME --- if (action === "tossGetRound") return jsonResponse(handleTossGetRound(payload)); if (action === "tossPlaceBet") return jsonResponse(handleTossPlaceBet(payload)); if (action === "tossResolve") return jsonResponse(handleTossResolve(payload)); } catch (err) { return jsonResponse({ success: false, message: "Server Error: " + err.message }); } } function jsonResponse(data) { return ContentService.createTextOutput(JSON.stringify(data)).setMimeType(ContentService.MimeType.JSON); } // ==================================================== // 1. SIGNUP & LOGIN (WITH AUTO-REACTIVATION) // ==================================================== function handleRegister(payload) { var phone = String(payload.phone).trim(); var otp = String(payload.otp).trim(); var otpSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Common OTP"); if (!otpSheet) return { success: false, message: "System Error: OTP sheet missing!" }; var validOtp = String(otpSheet.getRange("A2").getValue()).trim(); if (otp !== validOtp) return { success: false, message: "Invalid OTP! Admin se sahi OTP lein." }; if (/^(\d)\1{9}$/.test(phone)) return { success: false, message: "Fake number not allowed!" }; if (phone.length !== 10) return { success: false, message: "Enter exactly 10 digits!" }; var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetsToCheck = ["Users", "Inactive_Users", "Archive_Users"]; for (var s = 0; s < sheetsToCheck.length; s++) { var checkSheet = ss.getSheetByName(sheetsToCheck[s]); if (checkSheet) { var cData = checkSheet.getDataRange().getValues(); for (var i = 1; i < cData.length; i++) { if (String(cData[i][2]) === phone) return { success: false, message: "Number already registered!" }; } } } var newId = Utilities.getUuid().split('-')[0]; var userSheet = ss.getSheetByName("Users"); userSheet.appendRow([newId, payload.name, phone, "N/A", 0, new Date(), "Active", payload.pass, ""]); return { success: true, message: "Registered Successfully! Please Login." }; } function handleLogin(payload) { var phone = String(payload.phone).trim(); var pass = String(payload.pass).trim(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sessionToken = Utilities.getUuid(); var found = false; var balance = 0; var userSheet = ss.getSheetByName("Users"); var data = userSheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { if (String(data[i][2]) === phone) { if (String(data[i][7]) !== pass) return { success: false, message: "Wrong Password!" }; userSheet.getRange(i + 1, 9).setValue(sessionToken); userSheet.getRange(i + 1, 6).setValue(new Date()); balance = parseFloat(data[i][4]) || 0; found = true; break; } } if (!found) { var reactivated = reactivateUser(phone, pass, sessionToken); if (reactivated.success) { found = true; balance = reactivated.balance; } } if (found) return { success: true, balance: balance, token: sessionToken }; return { success: false, message: "User not found!" }; } function reactivateUser(phone, pass, token) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var userSheet = ss.getSheetByName("Users"); var sheetsToSearch = ["Inactive_Users", "Archive_Users"]; for (var s = 0; s < sheetsToSearch.length; s++) { var oldSheet = ss.getSheetByName(sheetsToSearch[s]); if (!oldSheet) continue; var data = oldSheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { if (String(data[i][2]) === phone) { if (String(data[i][7]) !== pass) return { success: false, message: "Wrong Password!" }; var rowData = data[i]; rowData[5] = new Date(); rowData[6] = "Active"; rowData[8] = token; userSheet.appendRow(rowData); oldSheet.deleteRow(i + 1); return { success: true, balance: parseFloat(rowData[4]) || 0 }; } } } return { success: false }; } function verifySession(phone, token) { if (!phone || !token) return false; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users"); var data = sheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { if (String(data[i][2]) === String(phone)) { if (String(data[i][8]) === String(token)) { sheet.getRange(i + 1, 6).setValue(new Date()); return true; } } } return false; } function handleGetUserData(payload) { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users"); var data = sheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { if (String(data[i][2]) === String(payload.phone)) { return { success: true, balance: parseFloat(data[i][4]) || 0 }; } } return { success: false }; } // ==================================================== // 2. SECURE WITHDRAW & DEPOSIT // ==================================================== function handleWithdraw(payload) { var lock = LockService.getScriptLock(); if (!lock.tryLock(5000)) return { success: false, message: "System busy. Try again." }; try { var amount = parseFloat(payload.amount) || 0; var upi = String(payload.upi).trim(); if (amount < MIN_WITHDRAW || amount > MAX_WITHDRAW) return { success: false, message: "Withdrawal limit: ₹" + MIN_WITHDRAW + " to ₹" + MAX_WITHDRAW }; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users"); var data = sheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { if (String(data[i][2]) === String(payload.phone)) { var balance = parseFloat(data[i][4]) || 0; if (balance < amount) return { success: false, message: "Insufficient Wallet Balance!" }; sheet.getRange(i + 1, 5).setValue(balance - amount); if(upi !== "") sheet.getRange(i + 1, 4).setValue(upi); else upi = String(data[i][3]); var txnSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions"); var txnId = "TXN" + Math.floor(Math.random() * 900000 + 100000); txnSheet.appendRow([txnId, new Date(), payload.phone, "Withdrawal", amount, "Pending", upi]); return { success: true }; } } return { success: false, message: "User not found!" }; } finally { lock.releaseLock(); } } function handleDeposit(payload) { var amount = parseFloat(payload.amount) || 0; if (amount <= 0) return { success: false, message: "Invalid Amount!" }; var txnSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions"); var txnId = "TXN" + Math.floor(Math.random() * 900000 + 100000); txnSheet.appendRow([txnId, new Date(), payload.phone, "Deposit", amount, "Pending", payload.utr]); return { success: true }; } // ==================================================== // 3. 🏏 H2H CHALLENGE ARENA & SETTLEMENT LOGIC // ==================================================== function getDashboardData() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var matches = [], bets = []; var matchSheet = ss.getSheetByName("Matches"); if(matchSheet) { var mData = matchSheet.getDataRange().getValues(); for(var i = 1; i < mData.length; i++) { if(mData[i][5] === "Upcoming" || mData[i][5] === "Live") { matches.push({ matchId: mData[i][0], matchName: mData[i][1], matchDate: mData[i][2], teamA: mData[i][3], teamB: mData[i][4], teamAPlayers: mData[i][7] || "Not Announced", teamBPlayers: mData[i][8] || "Not Announced" }); } } } var betSheet = ss.getSheetByName("Bets"); if(betSheet) { var bData = betSheet.getDataRange().getValues(); for(var j = 1; j < bData.length; j++) { if(bData[j][6] === "Open") { bets.push({ betId: bData[j][0], matchId: bData[j][1], creatorPhone: bData[j][2], creatorName: "Player", team: bData[j][3], amount: bData[j][4] }); } } } return { success: true, upcomingMatches: matches, openChallenges: bets }; } function handleCreateChallenge(payload) { var lock = LockService.getScriptLock(); if (!lock.tryLock(5000)) return { success: false, message: "System busy." }; try { var amount = parseFloat(payload.amount) || 0; if (amount < MIN_BET || amount > MAX_BET) return { success: false, message: "Bet limit: ₹" + MIN_BET + " to ₹" + MAX_BET }; var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users"); var userData = userSheet.getDataRange().getValues(); for (var i = 1; i < userData.length; i++) { if (String(userData[i][2]) === String(payload.phone)) { var balance = parseFloat(userData[i][4]) || 0; if (balance < amount) return { success: false, message: "Insufficient Balance!" }; userSheet.getRange(i + 1, 5).setValue(balance - amount); var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bets"); var betId = "BET-" + Utilities.getUuid().split('-')[0]; betSheet.appendRow([betId, payload.matchId, payload.phone, payload.team, amount, "", "Open"]); return { success: true, message: "Challenge Created!" }; } } return { success: false, message: "User error." }; } finally { lock.releaseLock(); } } function handleAcceptChallenge(payload) { var lock = LockService.getScriptLock(); if (!lock.tryLock(5000)) return { success: false, message: "System busy." }; try { var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bets"); var betData = betSheet.getDataRange().getValues(); var betRow = -1, amount = 0, creatorPhone = ""; for (var j = 1; j < betData.length; j++) { if (String(betData[j][0]) === payload.betId && String(betData[j][6]) === "Open") { betRow = j + 1; creatorPhone = String(betData[j][2]); amount = parseFloat(betData[j][4]) || 0; break; } } if (betRow === -1) return { success: false, message: "Challenge already accepted or doesn't exist." }; if (creatorPhone === String(payload.phone)) return { success: false, message: "You cannot accept your own challenge!" }; var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users"); var userData = userSheet.getDataRange().getValues(); for (var i = 1; i < userData.length; i++) { if (String(userData[i][2]) === String(payload.phone)) { var balance = parseFloat(userData[i][4]) || 0; if (balance < amount) return { success: false, message: "Insufficient Balance!" }; userSheet.getRange(i + 1, 5).setValue(balance - amount); betSheet.getRange(betRow, 6).setValue(payload.phone); betSheet.getRange(betRow, 7).setValue("Matched"); return { success: true, message: "Challenge Accepted!" }; } } return { success: false, message: "User error." }; } finally { lock.releaseLock(); } } // 🔥 NEW: Auto Refund for unaccepted bets function handleCancelChallenge(payload) { var lock = LockService.getScriptLock(); if (!lock.tryLock(5000)) return { success: false, message: "System busy." }; try { var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bets"); var betData = betSheet.getDataRange().getValues(); var betRow = -1, amount = 0; for (var j = 1; j < betData.length; j++) { if (String(betData[j][0]) === payload.betId && String(betData[j][6]) === "Open") { if (String(betData[j][2]) !== String(payload.phone)) return { success: false, message: "You can only cancel your own challenge!" }; betRow = j + 1; amount = parseFloat(betData[j][4]) || 0; break; } } if (betRow === -1) return { success: false, message: "Challenge cannot be cancelled (Already Matched or Settled)." }; // Refund Money var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users"); var userData = userSheet.getDataRange().getValues(); for (var i = 1; i < userData.length; i++) { if (String(userData[i][2]) === String(payload.phone)) { var balance = parseFloat(userData[i][4]) || 0; userSheet.getRange(i + 1, 5).setValue(balance + amount); betSheet.getRange(betRow, 7).setValue("Cancelled"); // Mark as Cancelled return { success: true, message: "Challenge Cancelled. ₹" + amount + " Refunded!" }; } } return { success: false, message: "User error." }; } finally { lock.releaseLock(); } } // 🔥 SECURED H2H Match Settlement (With Admin Password Protection) function handleResolveH2HMatch(payload) { if(payload.adminPass !== ADMIN_SECRET) return { success: false, message: "Unauthorized! Incorrect Admin Password." }; var lock = LockService.getScriptLock(); if (!lock.tryLock(10000)) return { success: false, message: "System busy processing results." }; try { var matchId = String(payload.matchId); var winnerTeam = String(payload.winnerTeam).trim().toUpperCase(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var betSheet = ss.getSheetByName("Bets"); var betData = betSheet.getDataRange().getValues(); var userSheet = ss.getSheetByName("Users"); var userData = userSheet.getDataRange().getValues(); var userPhoneMap = {}; for (var u = 1; u < userData.length; u++) { userPhoneMap[String(userData[u][2])] = { row: u + 1, balance: parseFloat(userData[u][4]) || 0 }; } var totalMatchPool = 0; var totalAdminCommission = 0; var totalGivenToWinners = 0; for (var j = 1; j < betData.length; j++) { if (String(betData[j][1]) === matchId && String(betData[j][6]) === "Matched") { var creatorPhone = String(betData[j][2]); var creatorTeam = String(betData[j][3]).toUpperCase(); var betAmount = parseFloat(betData[j][4]) || 0; var opponentPhone = String(betData[j][5]); var totalPool = betAmount * 2; var adminCommission = betAmount * 0.2; // 10% of Total Pool var winnerPayout = totalPool - adminCommission; // 1.8x Payout var actualWinnerPhone = (creatorTeam === winnerTeam) ? creatorPhone : opponentPhone; if (userPhoneMap[actualWinnerPhone]) { userPhoneMap[actualWinnerPhone].balance += winnerPayout; userSheet.getRange(userPhoneMap[actualWinnerPhone].row, 5).setValue(userPhoneMap[actualWinnerPhone].balance); } betSheet.getRange(j + 1, 7).setValue("Settled"); totalMatchPool += totalPool; totalAdminCommission += adminCommission; totalGivenToWinners += winnerPayout; } } var profitSheet = ss.getSheetByName("Admin_Profit"); if(profitSheet && totalMatchPool > 0) { profitSheet.appendRow([matchId, totalMatchPool, totalAdminCommission, totalGivenToWinners, new Date()]); } var matchSheet = ss.getSheetByName("Matches"); var matchData = matchSheet.getDataRange().getValues(); for(var m = 1; m < matchData.length; m++) { if(String(matchData[m][0]) === matchId) { matchSheet.getRange(m + 1, 6).setValue("Completed"); matchSheet.getRange(m + 1, 7).setValue(winnerTeam); break; } } return { success: true, message: "Match Resolved! Admin Profit: ₹" + totalAdminCommission }; } finally { lock.releaseLock(); } } // ==================================================== // 4. 🪙 TOSS GAME LOGIC // ==================================================== function handleTossGetRound(payload) { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Rounds"); var data = sheet.getDataRange().getValues(); var activeRound = null; for (var i = data.length - 1; i > 0; i--) { if (data[i][2] === "Active") { activeRound = { roundId: data[i][0], timestamp: data[i][1], status: data[i][2] }; break; } } if (!activeRound) { var newRoundId = "TOSS-" + new Date().getTime(); var timestamp = new Date().getTime(); sheet.appendRow([newRoundId, timestamp, "Active", "Pending"]); activeRound = { roundId: newRoundId, timestamp: timestamp, status: "Active" }; } return { success: true, round: activeRound }; } function handleTossPlaceBet(payload) { var lock = LockService.getScriptLock(); if (!lock.tryLock(5000)) return { success: false, message: "System busy. Try again." }; try { var amount = parseFloat(payload.amount) || 0; var side = String(payload.side).trim().toUpperCase(); if (amount < MIN_BET || amount > MAX_BET) return { success: false, message: "Bet limit: ₹" + MIN_BET + " to ₹" + MAX_BET }; var roundSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Rounds"); var roundData = roundSheet.getDataRange().getValues(); var isRoundActive = false, roundTimestamp = 0; for (var i = roundData.length - 1; i > 0; i--) { if (String(roundData[i][0]) === payload.roundId && String(roundData[i][2]) === "Active") { isRoundActive = true; roundTimestamp = parseFloat(roundData[i][1]); break; } } if (!isRoundActive) return { success: false, message: "Round closed!" }; if (new Date().getTime() - roundTimestamp > 25000) return { success: false, message: "Betting time over! Coin is spinning." }; var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users"); var userData = userSheet.getDataRange().getValues(); for (var j = 1; j < userData.length; j++) { if (String(userData[j][2]) === String(payload.phone)) { var balance = parseFloat(userData[j][4]) || 0; if (balance < amount) return { success: false, message: "Insufficient Balance!" }; userSheet.getRange(j + 1, 5).setValue(balance - amount); var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Bets"); var betId = "TBET-" + Utilities.getUuid().split('-')[0]; betSheet.appendRow([betId, payload.roundId, payload.phone, side, amount, "Pending", 0]); return { success: true, message: "Bet Placed on " + side }; } } return { success: false, message: "User error." }; } finally { lock.releaseLock(); } } function handleTossResolve(payload) { var lock = LockService.getScriptLock(); if (!lock.tryLock(5000)) return { success: false, message: "System busy. Try again." }; try { var roundSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Rounds"); var roundData = roundSheet.getDataRange().getValues(); var roundRow = -1; for (var i = roundData.length - 1; i > 0; i--) { if (String(roundData[i][0]) === payload.roundId) { if (String(roundData[i][2]) === "Completed") return { success: true, message: "Round already resolved." }; roundRow = i + 1; break; } } if (roundRow === -1) throw new Error("Round not found!"); var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Bets"); var betData = betSheet.getDataRange().getValues(); var totalHeadAmount = 0, totalTailAmount = 0; for (var b = 1; b < betData.length; b++) { if (String(betData[b][1]) === payload.roundId && String(betData[b][5]) === "Pending") { var betSide = String(betData[b][3]).toUpperCase(); var betAmt = parseFloat(betData[b][4]) || 0; if (betSide === "HEAD") totalHeadAmount += betAmt; else if (betSide === "TAIL") totalTailAmount += betAmt; } } var result = (totalHeadAmount > totalTailAmount) ? "TAIL" : (totalTailAmount > totalHeadAmount) ? "HEAD" : (Math.random() > 0.5 ? "HEAD" : "TAIL"); var totalPool = totalHeadAmount + totalTailAmount; var totalPayout = 0; var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users"); var userData = userSheet.getDataRange().getValues(); var userPhoneMap = {}; for (var u = 1; u < userData.length; u++) { userPhoneMap[String(userData[u][2])] = { row: u + 1, balance: parseFloat(userData[u][4]) || 0 }; } for (var k = 1; k < betData.length; k++) { if (String(betData[k][1]) === payload.roundId && String(betData[k][5]) === "Pending") { var userPhone = String(betData[k][2]); var userSide = String(betData[k][3]).toUpperCase(); var userAmt = parseFloat(betData[k][4]) || 0; if (userSide === result) { var winnings = userAmt * 1.9; totalPayout += winnings; betSheet.getRange(k + 1, 6).setValue("Won"); betSheet.getRange(k + 1, 7).setValue(winnings); if (userPhoneMap[userPhone]) { userPhoneMap[userPhone].balance += winnings; userSheet.getRange(userPhoneMap[userPhone].row, 5).setValue(userPhoneMap[userPhone].balance); } } else { betSheet.getRange(k + 1, 6).setValue("Lost"); betSheet.getRange(k + 1, 7).setValue(0); } } } roundSheet.getRange(roundRow, 3).setValue("Completed"); roundSheet.getRange(roundRow, 4).setValue(result); var adminProfit = totalPool - totalPayout; var profitSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Admin_Profit"); if(profitSheet && totalPool > 0) { profitSheet.appendRow([payload.roundId, totalPool, adminProfit, totalPayout, new Date()]); } return { success: true, result: result }; } finally { lock.releaseLock(); } } // ==================================================== // 5. AUTO-WALLET APPROVAL TRIGGER // ==================================================== function onEdit(e) { var range = e.range; var sheet = range.getSheet(); if (sheet.getName() === "Transactions" && range.getColumn() === 6) { var row = range.getRow(); if (row == 1) return; var status = range.getValue(); var prevStatus = e.oldValue; var phone = sheet.getRange(row, 3).getValue(); var type = sheet.getRange(row, 4).getValue(); var amount = parseFloat(sheet.getRange(row, 5).getValue()) || 0; if (status === "Approved" && prevStatus !== "Approved" && type === "Deposit") { updateUserBalance(phone, amount); } else if (status === "Rejected" && prevStatus !== "Rejected" && type === "Withdrawal") { updateUserBalance(phone, amount); } } } function updateUserBalance(phone, amountToAdd) { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users"); var data = sheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { if (String(data[i][2]) === String(phone)) { var bal = parseFloat(data[i][4]) || 0; sheet.getRange(i + 1, 5).setValue(bal + amountToAdd); break; } } } // ==================================================== // 6. BACKGROUND CRON JOBS (Set in Triggers) // ==================================================== function autoCleanupTossData() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var cutoff = new Date().getTime() - (6 * 60 * 60 * 1000); var roundSheet = ss.getSheetByName("Toss_Rounds"); if (roundSheet) { var rData = roundSheet.getDataRange().getValues(); for (var i = rData.length - 1; i > 0; i--) { if (String(rData[i][2]) === "Completed" && (parseFloat(rData[i][1]) || 0) < cutoff) roundSheet.deleteRow(i + 1); } } var betSheet = ss.getSheetByName("Toss_Bets"); if (betSheet) { var bData = betSheet.getDataRange().getValues(); for (var j = bData.length - 1; j > 0; j--) { var rId = String(bData[j][1]); if (rId.indexOf("TOSS-") === 0 && (parseFloat(rId.replace("TOSS-", "")) || 0) < cutoff) betSheet.deleteRow(j + 1); } } } function userLifecycleManagement() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var usersSheet = ss.getSheetByName("Users"); var inactiveSheet = ss.getSheetByName("Inactive_Users"); var archiveSheet = ss.getSheetByName("Archive_Users"); if(!usersSheet || !inactiveSheet || !archiveSheet) return; var now = new Date().getTime(); var msPerDay = 24 * 60 * 60 * 1000; var aData = archiveSheet.getDataRange().getValues(); for (var k = aData.length - 1; k > 0; k--) { var aDate = new Date(aData[k][5]).getTime(); if ((now - aDate) > (90 * msPerDay)) archiveSheet.deleteRow(k + 1); } var iData = inactiveSheet.getDataRange().getValues(); for (var j = iData.length - 1; j > 0; j--) { var iDate = new Date(iData[j][5]).getTime(); if ((now - iDate) > (60 * msPerDay)) { var row = iData[j]; row[6] = "Archived"; archiveSheet.appendRow(row); inactiveSheet.deleteRow(j + 1); } } var uData = usersSheet.getDataRange().getValues(); for (var i = uData.length - 1; i > 0; i--) { var uDate = new Date(uData[i][5]).getTime(); if ((now - uDate) > (30 * msPerDay)) { var uRow = uData[i]; uRow[6] = "Inactive"; inactiveSheet.appendRow(uRow); usersSheet.deleteRow(i + 1); } } }