Google Sheets脚本隐藏列报错:Those columns are out of bounds问题排查
问题分析与解决方案
问题根源
报错Exception: Those columns are out of bounds.的核心原因是:执行tempSheet.hideColumns(i+1)时,i+1对应的列号超出了临时表格tempSheet的实际列数范围。
你提到仅当columnHidden为true且列数超过30时程序崩溃,是因为只有此时才会触发hideColumns方法;当列数≤30时,i+1始终落在tempSheet的列数范围内,因此不会报错。日志最后一行的isHidden: false说明报错发生在之前某次循环的hideColumns调用(那次循环的columnHidden为true),日志打印是循环末尾执行的,所以滞后于报错触发时机。
解决方案
1. 确保临时表格列数匹配
先检查tempSheet的列数是否与原表格的range列数一致——如果是复制原range内容到tempSheet,要确保复制操作完整覆盖所有列,避免tempSheet列数不足。
2. 增加列号边界校验
在调用hideColumns前,先判断目标列号是否在tempSheet的有效范围内,避免越界:
const startColumn = range.getColumn(); const numColumns = range.getNumColumns(); for (let i = 0; i < numColumns; i++) { const originalColumn = startColumn + i; // 先校验原表格列号是否合法 if (originalColumn > sheet.getLastColumn()) { Logger.log(`原表格列${originalColumn}超出范围,跳过`); continue; } const columnHidden = sheet.isColumnHiddenByUser(originalColumn); const ende = tempSheet.getLastColumn(); if (columnHidden) { const targetCol = i + 1; // 校验临时表格列号是否合法 if (targetCol <= ende) { tempSheet.hideColumns(targetCol); } else { Logger.log(`跳过隐藏列${originalColumn}:临时表格列${targetCol}超出范围`); } } Logger.log(`start column: ${startColumn + i}, left: ${numColumns-i} , Ende: ${ende} , Checking column: ${originalColumn}, isHidden: ${columnHidden}`); }
3. 限制循环范围到临时表格实际列数
如果tempSheet的列数确实少于原range的列数,直接将循环上限设为两者的较小值,避免无效循环:
const startColumn = range.getColumn(); const numColumns = range.getNumColumns(); const tempMaxCols = tempSheet.getLastColumn(); // 只遍历双方都存在的列 const loopMax = Math.min(numColumns, tempMaxCols); for (let i = 0; i < loopMax; i++) { const originalColumn = startColumn + i; const columnHidden = sheet.isColumnHiddenByUser(originalColumn); if (columnHidden) { tempSheet.hideColumns(i+1); } Logger.log(`start column: ${startColumn + i}, left: ${loopMax-i} , Ende: ${tempMaxCols} , Checking column: ${originalColumn}, isHidden: ${columnHidden}`); }
内容的提问来源于stack exchange,提问作者Lovis Wagner
相关产品推荐
相关产品推荐

