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

如何用App Script在单个单元格内按日期排序并自动加时间戳

Google Sheets 原列自动排序带日期内容+自动加日期戳脚本

功能说明

  • 编辑指定列单元格时,自动给新增内容加上DD-MMM格式的当前日期戳
  • 单元格内所有带日期的行自动按日期升序排序,直接在原列更新,不用额外辅助列

操作步骤

  1. 打开你的Google表格,点菜单栏「扩展程序」→「Apps 脚本」
  2. 清空默认代码,粘贴下方脚本
  3. 修改脚本里的TARGET_COLUMN变量,填你要生效的列号(A列填1,B列填2,以此类推)
  4. 保存脚本,命名比如「DateSortAndStamp」
  5. 首次运行会提示授权,按指引完成即可

完整脚本代码

function onEdit(e) {
  const TARGET_COLUMN = 1; // 修改为目标列号,A列=1,B列=2
  const DATE_FORMAT = "dd-MMM"; // 日期格式,可按需调整为"yyyy-MM-dd"之类的
  
  // 只处理目标列的编辑操作
  if (e.range.columnStart !== TARGET_COLUMN) return;
  
  const sheet = e.source.getActiveSheet();
  const cell = sheet.getRange(e.range.rowStart, TARGET_COLUMN);
  let cellContent = cell.getValue().trim();
  const oldContent = e.oldValue ? e.oldValue.trim() : "";
  
  // 内容有变化时才处理
  if (cellContent !== oldContent) {
    let newText = "";
    // 拆分新旧内容,找出新增部分
    if (oldContent) {
      const oldLines = oldContent.split("\n").filter(line => line.trim() !== "");
      const newLines = cellContent.split("\n").filter(line => line.trim() !== "");
      newText = newLines.filter(line => !oldLines.includes(line)).join("\n");
    } else {
      // 单元格原本为空,所有内容都是新增的
      newText = cellContent;
    }
    
    // 给新增内容加日期戳
    if (newText) {
      const today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), DATE_FORMAT);
      const stampedNewLines = newText.split("\n").map(line => {
        // 跳过已经带日期戳的行,避免重复添加
        if (/^\d{2}-[A-Za-z]{3} - /.test(line)) return line;
        return `${today} - ${line.trim()}`;
      });
      
      // 合并原有内容和带戳的新增内容,再排序
      const allLines = [...oldContent.split("\n").filter(line => line.trim() !== ""), ...stampedNewLines];
      const sortedLines = sortLinesByDate(allLines);
      // 更新单元格内容
      cell.setValue(sortedLines.join("\n"));
    }
  }
}

// 辅助函数:按行首日期对内容排序
function sortLinesByDate(lines) {
  const validLines = lines.filter(line => line.trim() !== "");
  // 给每行匹配日期,方便排序
  const linesWithDate = validLines.map(line => {
    const dateMatch = line.match(/^(\d{2}-[A-Za-z]{3})/);
    if (dateMatch) {
      // 把DD-MMM转为日期对象(默认用当前年份,需跨年份可自行调整)
      const dateStr = `${dateMatch[1]}-${new Date().getFullYear()}`;
      const dateObj = new Date(dateStr);
      return { line, date: dateObj };
    }
    // 不带日期的行统一放最后
    return { line, date: new Date(9999, 11, 31) };
  });
  
  // 按日期升序排序
  linesWithDate.sort((a, b) => a.date - b.date);
  return linesWithDate.map(item => item.line);
}

使用提示

  • 直接在目标列单元格输入新增内容,脚本自动加日期戳并排序
  • 已经带DD-MMM - 格式日期的内容,不会重复加戳
  • 不带日期的内容会被排在所有带日期行的后面

内容的提问来源于stack exchange,提问作者Gurminder Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:15:41