Google Sheets去重脚本优化:基于邮箱列保留最新条目并忽略空值
优化Google Sheets去重脚本:忽略邮箱大小写、空值,避免误高亮
以下是优化后的完整脚本,解决了你的三个核心问题:忽略E列空值、邮箱大小写不敏感去重、避免新用户行被误高亮:
function onChange(e) { if (e.changeType == 'INSERT_ROW') { const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 精准定位插入的行,给首列添加日期 const insertRow = e.range.getRow(); sh.getRange(insertRow, 1).setValue(new Date()); } } function removeDuplicates() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sh = ss.getSheetByName('Inzendingen'); const dt = sh.getDataRange().getValues(); const seenEmails = new Set(); // 用Set提升重复查找效率 const rowsToDelete = []; const rowsToHighlight = []; // 从下往上遍历,确保保留最新的行 for (let i = dt.length - 1; i >= 0; i--) { const email = dt[i][4]; // 跳过空邮箱或非字符串的行,不参与去重逻辑 if (!email || typeof email !== 'string') { continue; } // 转小写+去首尾空格,消除大小写和空格导致的重复误判 const normalizedEmail = email.toLowerCase().trim(); if (seenEmails.has(normalizedEmail)) { // 标记要删除的旧重复行(行号=数组索引+1) rowsToDelete.push(i + 1); } else { seenEmails.add(normalizedEmail); // 仅当当前行的上方有重复行被标记删除时,才标记当前行需要高亮 const hasDuplicateAbove = rowsToDelete.some(row => row === i); if (hasDuplicateAbove) { rowsToHighlight.push(i + 1); } } } // 批量删除行(从大到小删,避免行号偏移) if (rowsToDelete.length > 0) { rowsToDelete.sort((a, b) => b - a).forEach(row => { sh.deleteRow(row); Utilities.sleep(300); // 缩短等待时间,优化执行速度 }); // 高亮保留的最新有效行 rowsToHighlight.forEach(row => { sh.getRange(row, 1, 1, sh.getLastColumn()).setBackground('lightblue'); }); } }
关键修改说明
- 忽略E列空值:通过
if (!email || typeof email !== 'string')判断,直接跳过空邮箱或非字符串的行,不会把空值纳入去重逻辑,避免误触发删除和高亮 - 邮箱大小写不敏感:将邮箱统一转为小写并去除首尾空格,确保
Test@Example.com和test@example.com被判定为同一邮箱 - 修正高亮逻辑:不再盲目高亮最后一行,仅当当前行确实替换了上方的旧重复行时,才标记高亮,彻底避免新用户行被误标
- 性能优化:用
Set替代数组indexOf提升重复查找效率,批量标记后统一删除行,减少不必要的等待时间
内容的提问来源于stack exchange,提问作者Hjalmar
相关产品推荐
相关产品推荐

