调用getSheets(file)时出现TypeError:无法读取undefined的getId属性
错误原因及修正方案
核心错误:file参数未正确传递
报错TypeError: Cannot read properties of undefined (reading 'getId')的直接原因是调用getSheets(file)时,传入的file参数为undefined。你需要确保调用这个函数时,传入的是有效的Google Drive文件对象(比如通过DriveApp.getFileById("文件ID")获取的对象,或是从文件选择器、触发器事件中正确传递的文件实例)。
代码中的其他问题及修正
1. 重复声明变量导致混淆
你连续两次声明了sourceSheet,第一次获取的是指定工作表,第二次覆盖成了整个Spreadsheet对象。虽然后续逻辑用的是Spreadsheet的getSheets()方法,但重复声明容易引发逻辑混乱,建议合并或重命名变量。
2. 数组遍历方式不规范
使用for(var i in allsheets)遍历数组可能会遍历到数组原型上的额外属性,推荐使用for...of或普通for循环来遍历工作表数组。
3. 数据范围获取逻辑错误
在copyData函数中,getRange(16,3,numRows,54)的行数计算有误:numRows是工作表的最后一行号,从第16行开始取numRows行的话,会超出工作表实际范围。正确的行数应该是sourceSheet.getLastRow() - 15(如果最后一行大于等于16),同时要处理工作表行数不足16的情况,避免获取无效范围。
修正后的完整代码
function getSheets(file) { // 先校验file参数是否有效 if (!file) { Logger.log("错误:未传入有效的文件对象"); return; } var sourceSpreadsheet = SpreadsheetApp.openById(file.getId()); var destSheet = SpreadsheetApp.openById("URLxxx").getSheetByName("sheet1"); var allsheets = sourceSpreadsheet.getSheets(); // 使用for...of遍历工作表数组 for (var sheet of allsheets) { if (sheet.getName().includes("X")) { Logger.log(sheet.getName()); copyData(sheet, destSheet); } } } function copyData(sourceSheet, destSheet) { var lastRow = sourceSheet.getLastRow(); // 处理行数不足16的情况 if (lastRow < 16) { Logger.log(sourceSheet.getName() + ":数据行数不足,跳过复制"); return; } var nextRow = destSheet.getLastRow() + 1; var numRows = lastRow - 15; // 从第16行开始的有效行数 var sourceRange = sourceSheet.getRange(16, 3, numRows, 54); var sourceValues = sourceRange.getValues(); destSheet.getRange(nextRow, 1, numRows, 54).setValues(sourceValues); }
额外注意事项
- 确保
"URLxxx"替换成目标表格的实际ID(不是完整URL,是URL中/d/和/edit之间的字符串)。 - 检查脚本是否有足够的权限访问源表格和目标表格,必要时重新授权。
内容的提问来源于stack exchange,提问作者SarahH
相关产品推荐
相关产品推荐

