修改Google Apps Script仅导出指定工作表为Excel的报错解决
报错根因
TypeError: st1.getName is not a function是典型的数组遍历写法错误:for(i in sheets)的写法会枚举数组对象原型链上的所有可枚举属性,遍历到的内容不全是Sheet实例,自然不存在getName方法。
而且你现在只需要处理单张指定名称的工作表,完全没必要遍历全表,直接按表名取对象的逻辑更简洁,也能从根源上避开这个遍历错误。
修改后完整代码
直接替换原有脚本即可,原有配置的文件夹ID、目标表格ID不需要改动:
function SaveMySheet() { var folder = DriveApp.getFolderById('12345foobarfolder'); var source = SpreadsheetApp.getActiveSpreadsheet(); var target = SpreadsheetApp.openById('12345foobarstaticdatasheet'); // 直接获取指定名称的目标工作表,无需全表遍历 var exportSheetName = 'My Foo Bar Sheet'; var sourceSheet = source.getSheetByName(exportSheetName); if (!sourceSheet) { throw new Error('当前源文件不存在名称为「' + exportSheetName + '」的工作表,请检查表名拼写'); } var sheetData = sourceSheet.getDataRange().getValues(); var targetSheet = target.getSheetByName(exportSheetName); if(targetSheet) { var existRange = targetSheet.getDataRange(); if(existRange) existRange.clearContent(); targetSheet.getRange(1,1,sheetData.length,sheetData[0].length).setValues(sheetData); } var exportBlob = getGoogleSpreadsheetAsExcel('12345foobarstaticdatasheet',"My Report Filename "+Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd hh:mm a')) folder.createFile(exportBlob); } function getGoogleSpreadsheetAsExcel(ssID,name){ try { var url = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + ssID + "&exportFormat=xlsx"; var params = { method : "get", headers : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()}, muteHttpExceptions: true }; var blob = UrlFetchApp.fetch(url, params).getBlob(); blob.setName(name + ".xlsx"); return blob; } catch (err) { Logger.log(err.toString()); } }
改动说明
- 移除了原有的全表遍历for循环,直接通过
getSheetByName精准定位需要导出的单表,彻底解决遍历带来的类型错误 - 增加了源工作表不存在时的明确报错提示,避免静默失败方便排查
- 删除了导出函数中定义后从未使用的冗余变量,减少无意义的资源调用
- 完全保留原有的静态数据同步、xlsx格式导出、指定云盘文件夹存储的核心逻辑,不需要调整原有ID配置
内容的提问来源于stack exchange,提问作者Kevin Malone
相关产品推荐
相关产品推荐

