Google Apps Script中如何优化多重else if语句提升运行速度?
核心优化思路
你的代码慢主要来自两个可优化的问题:
- 冗余的16分支判断逻辑,完全可以通过映射关系简化为一行判断
- 循环内反复调用
getRange()、getValue()等表格API,这类IO操作每次都有固定开销,循环执行几十上百次自然会很慢
1. 逻辑简化方案
你原来的分支逻辑本质上就是:只有当列类型对应的筛选器为开启状态时,才允许显示该列,根本不需要枚举16种组合。直接做一个类型到筛选状态的映射即可。
2. 性能优化方案
Google Apps Script操作表格的核心性能准则是:尽量减少API调用次数,批量读写数据。你需要把循环内要读取的xRow行、第16行的所有数据一次性读到内存数组里,循环直接操作数组即可。
优化后完整代码
function Unfilter(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); // 一次性读取所有配置参数 var configVals = sheet.getRange(1,1,4,1).getValues(); var nameShow = configVals[0][0]; var statusShow = configVals[1][0]; var dateShow = configVals[2][0]; var evidenceShow = configVals[3][0]; var numCols = sheet.getRange(1,3).getValue(); var xRow = sheet.getRange(1,5).getValue() + 16; // 建立类型到筛选状态的映射,直接替代16个if else分支 const typeFilterMap = { "Name": nameShow, "Status": statusShow, "Date": dateShow, "Evidence": evidenceShow } // 一次性读取要用到的两行所有数据:第16行(类型行)、xRow行(空值校验行) var row16Vals = sheet.getRange(16, 10, 1, numCols - 9).getValues()[0]; var xRowVals = sheet.getRange(xRow, 10, 1, numCols - 9).getValues()[0]; // 循环操作内存数组,不需要再调用表格读接口 for (var i=0; i < row16Vals.length; i++) { if (xRowVals[i] == "") { var catType = row16Vals[i]; // 直接用映射判断即可 if (typeFilterMap[catType]) { sheet.showColumns(i + 10); // 偏移10列,因为是从第10列开始读取的数据 } } } }
优化效果说明
- 逻辑层面:消除了所有冗余分支,后续如果新增筛选类型,只需要在
typeFilterMap里加一行配置即可,不需要新增判断 - 性能层面:原来有N列的话要调用2*N次读API,优化后只需要4次读API,性能提升至少10倍以上,如果列数多提升会更明显
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

