如何用Google Sheets脚本比对工作表名与数组元素并执行指定任务
代码缺陷定位与修复方案
核心错误1:if条件括号位置错误
你写的判断逻辑括号位置完全错误,导致判断逻辑完全失效:
// 错误写法 if (processedSheetsRng[n].indexOf(shts[j].getSheetName() === -1))
这里你把=== -1写进了indexOf()的入参里,相当于先判断工作表名是否等于-1(结果永远是false),再判断字符串"false"是否存在于processedSheetsRng[n]中,返回值基本都是-1,而-1在布尔判断中为真值,所以每次都会触发复制逻辑。
核心错误2:循环逻辑错误
你嵌套了两层循环,会导致同一个工作表只要和任意一个已处理表名不匹配就重复执行复制,完全不符合「判断表名是否不存在于已处理数组中」的需求,不需要嵌套循环,直接判断当前表名是否在整个已处理数组内即可。
其他错误
copyTo的目标范围参数写反了行数和列数,会导致范围不匹配报错- 不需要调用
activate()激活工作表,属于冗余代码 - 批量读取A列判断最后一行的逻辑效率很低,直接用
getLastRow()即可
修复后的完整代码
function concatenarResumos() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var databaseSheet = ss.getSheetByName("Database"); // 过滤掉已处理数组里的空值,避免无效判断 var processedSheets = ss.getSheetByName("Suporte").getRange("F6:F").getValues().flat().filter(Boolean); var allSheets = ss.getSheets(); for (var j = 0; j < allSheets.length; j++) { var currentSheet = allSheets[j]; var currentSheetName = currentSheet.getSheetName(); // 跳过Database和Suporte本身,避免处理系统表 if (currentSheetName === "Database" || currentSheetName === "Suporte") continue; // 判断当前表名是否不存在于已处理数组中 if (processedSheets.indexOf(currentSheetName) === -1) { Logger.log("待处理工作表:" + currentSheetName); var data = currentSheet.getRange("C4").getValue(); var copyRange = currentSheet.getRange("B8:G12"); var targetStartRow = databaseSheet.getLastRow() + 1; // 复制内容,行数5,列数6,参数顺序正确 copyRange.copyTo(databaseSheet.getRange(targetStartRow, 2, 5, 6), { contentsOnly: true }); // 填充A列日期 databaseSheet.getRange(targetStartRow, 1, 5, 1).setValue(data); } } }
内容的提问来源于stack exchange,提问作者onit
相关产品推荐
相关产品推荐

