Apps Script复制工作表时如何排除隐藏工作表不生成_temp副本
现有代码行为确认
你的现有代码会复制所有隐藏工作表:
Spreadsheet.getSheets()方法会返回表格内的全部工作表,不区分可见/隐藏状态- 调用
sheet.copyTo()复制隐藏工作表时,生成的副本会继承原工作表的隐藏属性,因此你看不到带_temp后缀的副本,这些副本确实处于隐藏状态
修改方案
遍历工作表时通过 Sheet.isSheetHidden() 方法判断工作表状态,直接跳过隐藏工作表的复制逻辑即可,能有效减少无效操作、缩短脚本运行时间,避免触发运行资源限制导致崩溃。
写法1:forEach 实现
var ss = SpreadsheetApp.openById(spreadsheetId); var tempSheets = []; ss.getSheets().forEach(function(sheet) { // 命中隐藏工作表直接跳过 if (sheet.isSheetHidden()) return; var dstSheet = sheet.copyTo(ss).setName(sheet.getSheetName() + "_temp"); var src = dstSheet.getDataRange(); src.copyTo(src, {contentsOnly: true}); tempSheets.push(dstSheet); });
写法2:filter + map 链式实现
如果你偏好链式调用风格,也可以先过滤掉隐藏工作表,再执行复制映射逻辑,最终返回的tempSheets数组和原逻辑结构完全一致:
var ss = SpreadsheetApp.openById(spreadsheetId); var tempSheets = ss.getSheets() .filter(function(sheet) { // 仅保留非隐藏的工作表 return !sheet.isSheetHidden(); }) .map(function(sheet) { var dstSheet = sheet.copyTo(ss).setName(sheet.getSheetName() + "_temp"); var src = dstSheet.getDataRange(); src.copyTo(src, {contentsOnly: true}); return dstSheet; });
内容的提问来源于stack exchange,提问作者user19389364
相关产品推荐
相关产品推荐

