Google Sheets脚本如何实现满足条件时复制对应行到指定工作表
修正后可实现需求的Google Apps Script
function principalupdate() { const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 获取主表数据 const principalSheet = spreadsheet.getSheetByName("Principal List"); // 读取主表有效数据范围,避免读取整列空行拖慢性能 const dataRange = principalSheet.getDataRange(); const allData = dataRange.getValues(); // 第1行是表头的话,从第2行(索引为1)开始遍历有效数据 const dataRows = allData.slice(1); // 团队与对应工作表的映射表,后续新增团队只需修改此处即可 const teamSheetMap = { "Full Team Schedule Detail": spreadsheet.getSheetByName("Full Team Schedule Detail"), "Software": spreadsheet.getSheetByName("Software"), "Phones": spreadsheet.getSheetByName("Phones"), "Billing": spreadsheet.getSheetByName("Billing"), "Payments": spreadsheet.getSheetByName("Payments"), "Multi": spreadsheet.getSheetByName("Multi"), "Tier 2": spreadsheet.getSheetByName("Tier 2") }; // 清空所有团队工作表A列的原有内容 Object.values(teamSheetMap).forEach(sheet => { sheet.getRange("A:A").clearContent(); }); // 按团队分组收集对应姓名 const teamNameMap = {}; dataRows.forEach(row => { const agentName = row[0]; // A列是第1列,对应索引0 const teamName = row[6]; // G列是第7列,对应索引6 // 跳过姓名为空、团队为空、无对应工作表的无效数据 if (!agentName || !teamName || !teamSheetMap[teamName]) return; if (!teamNameMap[teamName]) teamNameMap[teamName] = []; teamNameMap[teamName].push([agentName]); // 表格写入要求二维数组格式 }); // 将分组后的姓名批量写入对应工作表 Object.entries(teamNameMap).forEach(([team, nameList]) => { const targetSheet = teamSheetMap[team]; // 从A1单元格开始写入,范围高度等于姓名数量,宽度为1列 targetSheet.getRange(1, 1, nameList.length, 1).setValues(nameList); }); }
核心优化说明
- 批量读取主表所有数据后再做逻辑处理,相比逐行操作表格性能提升明显,数据量越大优势越突出
- 用映射表统一管理团队与工作表的对应关系,后续新增团队无需重复编写清空、写入逻辑,维护成本更低
- 自动过滤无效数据,避免空行、异常团队名导致的脚本报错
- 仅写入实际存在的姓名,不会产生多余空行
内容的提问来源于stack exchange,提问作者dbakery
相关产品推荐
相关产品推荐

