Google Sheets去重脚本丢失时间戳时间问题求助
问题分析
你的脚本中时间戳的时间部分丢失,根源在于多次使用getValues()和setValues()反转数据:当把Date对象从单元格取出再写回时,可能因隐含的类型转换或单元格格式自动调整,导致时间部分被剥离。另外,原DeleteBlankRows的循环删除逻辑存在bug,会跳过部分空行,但不直接影响时间戳问题。
解决方案
- 替换反转数组的操作,改用Google Sheets原生的
sort()方法按时间戳降序排序,让最新记录排在最前面,这样removeDuplicates会保留最新的那条,无需来回反转数据。 - 修复
DeleteBlankRows的循环逻辑,从下往上删除空行,避免索引混乱。
修改后的完整代码
function removeDups(){ const ss = SpreadsheetApp.getActive(); const sh = ss.getSheets()[0]; const dataRange = sh.getRange("A2:O"); // 按A列(时间戳)降序排序,确保最新记录在最上方 dataRange.sort({column: 1, ascending: false}); // 根据第11、15列去重,保留第一个出现的最新记录 dataRange.removeDuplicates([11,15]); // 可选:按时间戳升序排序恢复原顺序,不需要可删除此行 dataRange.sort({column: 1, ascending: true}); DeleteBlankRows(); } function DeleteBlankRows(){ const sh = SpreadsheetApp.getActiveSheet(); const lastRow = sh.getLastRow(); // 从最后一行向上遍历,避免删除行后索引错位 for (let row = lastRow; row >= 1; row--) { if (sh.getRange(`A${row}`).getValue() === '') { sh.deleteRow(row); } } sh.getRange("B2:B").clear(); sh.getRange("L2:L").clear(); sh.getRange("M2:M").clear(); }
说明
- 用
sort()替代数组反转,直接在工作表层面操作,避免了Date对象的取出和写入环节,彻底解决时间部分丢失的问题。 - 去重时,因为最新记录已排在最前面,
removeDuplicates会保留这条最新数据,符合你的需求。 - 修复后的删除空行逻辑,能确保所有A列为空的行都被删除,不会出现遗漏。
内容的提问来源于stack exchange,提问作者chap
相关产品推荐
相关产品推荐

