Google Apps Script表格导出:仅NON JV子表无法正常写入数据
问题:Google Apps Script中NON JV数据无法导出到对应子表
我编写了一段Google Apps Script,手动执行时会将源表格FOREX工作表的A2:M2行数据,根据L2单元格的值(NON JV/JV1/JV2)导出到目标表格对应的子表。目前JV1和JV2子表的导出功能正常,但当L2单元格值为NON JV时,脚本提示执行完成,却未在目标表格的NON JV子表中找到对应数据。
原代码如下:
function expo() { //Source link var ssraw = SpreadsheetApp.getActiveSpreadsheet(); var sheetraw = ssraw.getSheetByName('FOREX'); var range = sheetraw.getRange('A2:M2'); var data = range.getValues(); var datacheck=sheetraw.getRange('L2').getValue(); if(datacheck=="JV1") { var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=1641519106'); var reqsheet = ss.getSheetByName("JV1"); reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).clear(); reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).setValues(data); } else if(datacheck=="JV2") { var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=1056263168'); var reqsheet = ss.getSheetByName("JV2"); reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).clear(); reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).setValues(data); } else if(datacheck=="NON JV") { var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=0') var reqsheet= ss.getSheetByName("NON JV"); reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).clear(); reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).setValues(data); } } function getLastRow(sheet,rangeString) {var rng=sheet.getRange(rangeString).getValues(); var lrIndex; for(var i=rng.length-1;i>=0;i--) {lrIndex=i; if(!rng[i].every(function(c){return c=="";})){break;}} }
问题分析
- 核心错误:目标表格URL不匹配:NON JV分支中使用的目标表格URL与你提供的实际目标表不一致,导致数据被写入了错误的文档,而非你预期的表格。
- 冗余代码:未使用的
getLastRow函数:该函数定义后未被调用,且无返回值,对当前逻辑无作用。 - 逻辑重复:多分支冗余代码:三个分支的导出逻辑高度重复,增加维护成本。
修复后的代码
function expo() { // 源表格数据获取 const ssraw = SpreadsheetApp.getActiveSpreadsheet(); const sheetraw = ssraw.getSheetByName('FOREX'); const data = sheetraw.getRange('A2:M2').getValues(); const datacheck = sheetraw.getRange('L2').getValue(); // 统一管理目标表格配置 const targetMap = { "JV1": { sheetUrl: "https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=1641519106", sheetName: "JV1" }, "JV2": { sheetUrl: "https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=1056263168", sheetName: "JV2" }, "NON JV": { sheetUrl: "https://docs.google.com/spreadsheets/d/1VQ__WsrJ8C8XVbyx1KsKxjHfVnDbUdReCIZMsedlBuc/edit#gid=0", sheetName: "NON JV" } }; // 执行导出逻辑 const targetConfig = targetMap[datacheck]; if (!targetConfig) throw new Error(`不支持的类型:${datacheck}`); const targetSs = SpreadsheetApp.openByUrl(targetConfig.sheetUrl); const targetSheet = targetSs.getSheetByName(targetConfig.sheetName); if (!targetSheet) throw new Error(`未找到子表:${targetConfig.sheetName}`); const lastRow = targetSheet.getLastRow() + 1; // 若不需要清除单元格,可删除下面一行 targetSheet.getRange(lastRow, 1, 1, 13).clear(); targetSheet.getRange(lastRow, 1, 1, 13).setValues(data); }
修复说明
- 修正目标URL:将NON JV分支的目标表格URL替换为你提供的正确链接,确保数据写入预期表格。
- 简化代码结构:用对象映射统一管理不同类型的目标配置,减少重复代码,便于后续修改。
- 增加错误校验:对不支持的类型、不存在的子表抛出明确错误,快速定位问题。
- 优化写入逻辑:提前获取最后一行索引,避免重复调用
getLastRow()可能导致的位置偏移问题。
内容的提问来源于stack exchange,提问作者Anushka
相关产品推荐
相关产品推荐

