You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets去重脚本丢失时间戳时间问题求助

问题分析

你的脚本中时间戳的时间部分丢失,根源在于多次使用getValues()和setValues()反转数据:当把Date对象从单元格取出再写回时,可能因隐含的类型转换或单元格格式自动调整,导致时间部分被剥离。另外,原DeleteBlankRows的循环删除逻辑存在bug,会跳过部分空行,但不直接影响时间戳问题。

解决方案
  1. 替换反转数组的操作,改用Google Sheets原生的sort()方法按时间戳降序排序,让最新记录排在最前面,这样removeDuplicates会保留最新的那条,无需来回反转数据。
  2. 修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:35:01