修复Apps Script合并多工作表缺失表头、数据拼接留空隙问题
故障原因
两个问题的根源都在原代码的逻辑疏漏:
- 无表头:原代码读取所有子工作表时均从第2行开始抓取,完全没有提取第1行的公共表头写入Master表。
- 数据间空白:
getRange(起始行, 起始列, 读取行数, 读取列数)的第三个参数要求传入实际需要读取的行数,原代码直接传入工作表总最后行号getLastRow(),从第2行开始读取时会多读出空行,拼接后就会出现不同工作表数据之间的空白间隔。
修复后完整代码
function combineSheets() { const sApp = SpreadsheetApp.getActiveSpreadsheet(); const masterSheet = sApp.getSheetByName("Master"); // 清空Master表原有残留内容 masterSheet.clearContents(); // 生成36个子表的名称列表 const subSheetNames = Array.from({length: 36}, (_, index) => `A${index + 1}`); // 提取第一个子表的第1行作为公共表头 const firstSubSheet = sApp.getSheetByName(subSheetNames[0]); const tableHeader = firstSubSheet.getRange(1, 1, 1, 27).getValues(); const mergedData = [...tableHeader]; // 循环读取所有子表的有效数据 subSheetNames.forEach(sheetName => { const currentSheet = sApp.getSheetByName(sheetName); const lastRowNum = currentSheet.getLastRow(); // 子表只有表头没有数据时直接跳过,避免写入空行 if (lastRowNum < 2) return; // 修正行数计算:从第2行开始读,有效数据行数为总最后行号减1(减去表头行) const sheetData = currentSheet.getRange(2, 1, lastRowNum - 1, 27).getValues(); mergedData.push(...sheetData); }); // 将表头+所有有效数据一次性写入Master表 masterSheet.getRange(1, 1, mergedData.length, 27).setValues(mergedData); }
关键修复点
- 补全表头逻辑:自动提取第一个子工作表的首行作为公共表头,固定在Master表最顶部
- 修正行数计算:读取子表数据时将行数参数改为
lastRowNum - 1,从根源上避免多读取空行导致的拼接间隙 - 增加空表判断:自动跳过无有效数据的子表,不会引入无效空行
- 精简冗余代码:用循环替代原代码中36个工作表的重复变量声明、重复取值逻辑,后续调整合并的工作表范围只需要修改
subSheetNames即可 - 增加预清空逻辑:每次合并前先清空Master表的旧内容,避免多次运行导致数据重复堆积
内容的提问来源于stack exchange,提问作者Nischay Soni
相关产品推荐
相关产品推荐

