Apps Script循环过慢优化求助:卡牌随机器性能提升问题
优化卡牌随机器代码以提升运行速度
以下是优化后的代码,完全保留原有功能但大幅提升运行效率:
function Random() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("Sheet1"); const lastRow = sheet.getLastRow(); // 获取最后有数据的行,避免处理空行 if (lastRow < 2) return; // 没有数据时直接退出 // 批量读取复选框状态,减少服务器交互 const checkboxRange = sheet.getRange('A1:F1'); const checkboxValues = checkboxRange.getValues()[0]; const enabledTypes = { 'A': checkboxValues[0], 'B': checkboxValues[1], 'C': checkboxValues[2], 'D': checkboxValues[3], 'E': checkboxValues[4], 'F': checkboxValues[5] }; // 批量读取C列的卡牌类型数据 const cardTypeRange = sheet.getRange('C2:C' + lastRow); const cardTypes = cardTypeRange.getValues().flat(); // 转为一维数组 // 收集需要显示和隐藏的行号 const rowsToShow = []; const rowsToHide = []; for (let i = 0; i < cardTypes.length; i++) { const rowNum = i + 2; // 对应表格中的行号(从第2行开始) const type = cardTypes[i]; if (type === "STOP") { rowsToHide.push(rowNum); } else if (enabledTypes[type]) { rowsToShow.push(rowNum); } else { rowsToHide.push(rowNum); } } // 批量处理行的显示/隐藏,减少服务器交互次数 if (rowsToShow.length > 0) { sheet.showRows(rowsToShow); } if (rowsToHide.length > 0) { sheet.hideRows(rowsToHide); } // 只对有数据的区域随机排序 const targetRange = sheet.getRange("A2:O" + lastRow); targetRange.randomize(); }
核心优化点说明:
- 减少服务器交互次数:原代码逐行读取单元格值、逐行切换行显示状态,每次操作都要和服务器通信,这是耗时的主要原因。优化后改为批量读取所有需要的数据(复选框状态、卡牌类型),再批量处理行的显示/隐藏,大幅减少交互次数。
- 避免处理空行:用
getLastRow()替代getMaxRows(),只处理有数据的行,跳过大量空行的无效循环。 - 简化类型判断逻辑:用对象映射
enabledTypes替代多个else if,代码更简洁,执行效率也更高。 - 规范变量声明:所有变量用
const/let声明,避免全局变量污染,代码更健壮。
内容的提问来源于stack exchange,提问作者Hazel
相关产品推荐
相关产品推荐

