Google Apps Script跨标签运行报错:Range Not Found问题求助
问题修复:跨标签运行脚本时找不到命名范围的错误
问题根源
原代码第5行const tableCol = ss.getRange("RepPrTracking").getColumn();会在当前活动的工作表中查找RepPrTracking这个命名范围,但该范围仅存在于以"Week"开头的标签页中。当你在非Week标签页运行脚本时,当前活动表没有这个命名范围,就会抛出Range Not Found错误。
修复后的代码
function createMaxList() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const target = ss.getSheetByName('Rep PR Data'); const sheets = ss.getSheets(); // 先找到第一个Week标签页,从中获取RepPrTracking的列号 const firstWeekSheet = sheets.find(s => s.getName().match(/Week[\s\S]\d/)); if (!firstWeekSheet) { SpreadsheetApp.getUi().alert("未找到以Week开头的标签页"); return; } const tableCol = firstWeekSheet.getRange("RepPrTracking").getColumn(); const results = [['Week', 'Exercise', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10','e1RM']]; sheets.forEach(s => { const name = s.getName() if (!name.match(/Week[\s\S]\d/)) { return; } s.getRange(3, tableCol, s.getLastRow() - 2, 12).getValues() .forEach((row) => { const [exc] = row if (exc == "" || exc == "Reps:" || !exc) { return; } results.push([name, ...row]) }) }) target.getDataRange().clearContent() target.getRange(1, 1, results.length, results[0].length).setValues(results) }
修改说明
- 新增
firstWeekSheet:通过find方法从所有工作表中筛选出第一个以"Week"开头的标签页,确保我们能在正确的工作表中获取RepPrTracking命名范围。 - 增加异常判断:如果找不到任何Week标签页,弹出提示并终止脚本,避免后续报错。
- 调整
tableCol的获取方式:从找到的Week工作表中获取列号,不再依赖当前活动表,这样无论在哪个标签页运行脚本,都能正确获取目标列。
如果每个Week标签页的RepPrTracking列位置可能不同,也可以在遍历每个Week表时单独获取该表的列号,修改如下:
sheets.forEach(s => { const name = s.getName() if (!name.match(/Week[\s\S]\d/)) { return; } // 每个Week表单独获取RepPrTracking的列号 const tableCol = s.getRange("RepPrTracking").getColumn(); s.getRange(3, tableCol, s.getLastRow() - 2, 12).getValues() .forEach((row) => { const [exc] = row if (exc == "" || exc == "Reps:" || !exc) { return; } results.push([name, ...row]) }) })
这种方式更灵活,适合不同Week表列位置不一致的场景。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

