如何用App Script在单个单元格内按日期排序并自动加时间戳
Google Sheets 原列自动排序带日期内容+自动加日期戳脚本
功能说明
- 编辑指定列单元格时,自动给新增内容加上
DD-MMM格式的当前日期戳 - 单元格内所有带日期的行自动按日期升序排序,直接在原列更新,不用额外辅助列
操作步骤
- 打开你的Google表格,点菜单栏「扩展程序」→「Apps 脚本」
- 清空默认代码,粘贴下方脚本
- 修改脚本里的
TARGET_COLUMN变量,填你要生效的列号(A列填1,B列填2,以此类推) - 保存脚本,命名比如「DateSortAndStamp」
- 首次运行会提示授权,按指引完成即可
完整脚本代码
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
相关产品推荐
相关产品推荐

