如何修改Google Sheets脚本实现去重表头并覆盖Master表?
调整后的Google Apps Script脚本
没问题,我来帮你修改脚本,实现每次运行覆盖Master表且只保留一份表头的需求。以下是调整后的完整代码,我会在后面解释关键修改点:
function concatAllSheets() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const masterSheet = ss.getSheetByName("Master"); // 1. 先清空Master表的所有内容(覆盖原有数据) if (masterSheet) { masterSheet.clearContents(); // 只清空内容,保留格式;如果要连格式也清,用clear() } else { // 如果Master表不存在,创建一个 ss.insertSheet("Master"); masterSheet = ss.getSheetByName("Master"); } let hasWrittenHeader = false; // 标记是否已经写入表头 const allSheets = ss.getSheets(); for (const sheet of allSheets) { // 跳过Master表本身,避免循环处理自己 if (sheet.getName() === "Master") continue; const dataRange = sheet.getDataRange(); const dataValues = dataRange.getValues(); if (dataValues.length === 0) continue; // 跳过空表 let rowsToWrite; if (!hasWrittenHeader) { // 第一次处理工作表:写入表头+所有数据 rowsToWrite = dataValues; hasWrittenHeader = true; } else { // 后续工作表:只写入数据(跳过第一行表头) rowsToWrite = dataValues.slice(1); } // 批量写入到Master表,从下一行开始 const nextRow = masterSheet.getLastRow() + 1; masterSheet.getRange(nextRow, 1, rowsToWrite.length, rowsToWrite[0].length).setValues(rowsToWrite); } SpreadsheetApp.getUi().alert("合并完成!Master表已更新。"); }
关键修改点说明
- 清空Master表:脚本开头先检查Master表是否存在,存在就清空内容(
clearContents()),不存在则创建。如果需要连格式一起清空,把clearContents()换成clear()即可。 - 避免重复表头:用
hasWrittenHeader布尔值标记,第一次处理工作表时写入完整数据(包含表头),之后的工作表都跳过第一行(用slice(1)截取从第二行开始的数据)。 - 高效批量操作:使用
getValues()和setValues()批量读写数据,比逐行操作快得多,尤其适合处理5000行的大表,避免超时问题。 - 跳过空表和Master自身:循环时跳过Master表,避免重复处理;同时跳过没有数据的工作表,减少不必要的操作。
你可以直接把这段代码替换原来的脚本,运行后就能得到符合需求的合并结果啦!
内容的提问来源于stack exchange,提问作者Nij
相关产品推荐
相关产品推荐

