Google Apps Script归档表格:复制静态值遇Range not found错误求助
解决方案
代码错误分析
导致“Exception: Range not found”和公式未清除的核心问题有3个:
- 方法名大小写错误:Google Apps Script是大小写敏感的,
OpenByID、getID()应为小写开头的openById()、getId(),错误写法会直接触发方法不存在的异常。 - 范围引用冗余:当已经通过
getSheetByName获取到指定工作表对象(如source_sheet),调用getRange时无需再加工作表名前缀(Codex!),否则会在当前活动工作表中查找该范围,导致找不到目标区域。 - 目标范围对象错误:
copyTo的目标范围应使用目标工作表对象(target_sheet)的getRange方法,而非整个表格对象的getRange。
修正后的完整代码
function archiveSheet () { var confirm = Browser.msgBox('Have you fully completed the RTU?', Browser.Buttons.YES_NO); if(confirm == 'no') { Logger.log('The user clicked "NO."'); } if(confirm == 'yes') { var ss = SpreadsheetApp.getActiveSpreadsheet(); var RTUDate = ss.getRange('Backend!O9').getValue(); Logger.log(RTUDate); var RTUTime = ss.getRange('Backend!O12').getValue(); Logger.log(RTUTime); // 格式化日期时间(注意时区调整,GMT+20可能需要确认是否符合需求) var formattedDate = Utilities.formatDate(RTUDate, "GMT+20", "MMMM dd, yyyy"); var formattedTime = Utilities.formatDate(RTUTime, "GMT+20", "HH:mm"); // 生成归档文件名称 var name = ss.getName() + " " + formattedDate + " " + formattedTime; // 获取目标文件夹 var destination = DriveApp.getFolderById("MyDriveIDHere"); // 复制原表格到目标文件夹 var file = DriveApp.getFileById(ss.getId()); var newFile = file.makeCopy(name, destination); // 复制静态值到归档表格 var source_sheet = ss.getSheetByName('Codex'); // 修正:使用小写openById和getId var target_ss = SpreadsheetApp.openById(newFile.getId()); var target_sheet = target_ss.getSheetByName('Codex'); // 修正:直接使用工作表内的范围,无需加工作表名前缀 var source_range = source_sheet.getRange('A2:O'); // 确保目标范围和源范围大小一致 var target_range = target_sheet.getRange(source_range.getA1Notation()); // 仅粘贴静态值,覆盖原有公式 source_range.copyTo(target_range, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); } }
额外优化说明
- 用
source_range.getA1Notation()获取源范围的A1表示法,确保目标范围和源范围的行列数完全匹配,避免因范围大小不一致导致的异常。 - 变量名更清晰(如
target_ss代替target_sheet_ID),提升代码可读性。 - 注意时区
GMT+20是否符合实际需求,若时区设置错误会导致归档文件名的日期时间不准确。
内容的提问来源于stack exchange,提问作者iCarrington
相关产品推荐
相关产品推荐

