Google Sheets使用Google脚本处理日期时显示为时间戳大数字问题求助
解决Google Sheets脚本中日期转大数字的问题
嘿,这个坑我之前踩过!Google Sheets里显示为dd/mm/yyyy的日期,本质是序列号(从1900年1月1日开始计算的天数,不是你猜的秒数哦)。当你用sheet.getDataRange().getValues()获取数据时,日期列会被转换成JavaScript的Date对象,而你用.valueOf()方法会把这个Date对象直接转成毫秒级时间戳(从1970年1月1日开始的毫秒数),存回工作表自然就显示成一串大数字了。
给你几个实用的解决方案:
方案1:直接保留Date对象操作(最推荐)
如果你的排序逻辑不需要提取日期的数值,完全可以直接用Date对象进行比较,不用调用.valueOf()。Google Sheets的setValues()方法能自动识别Date对象,写入后会按照你设置的dd/mm/yyyy格式显示:
// 获取源数据,日期列是Date对象 const sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("源表"); const data = sourceSheet.getDataRange().getValues(); // 按日期列排序(假设日期在第2列,索引为1) data.sort((rowA, rowB) => rowA[1] - rowB[1]); // 写入新工作表 const newSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("新表"); newSheet.getRange(1, 1, data.length, data[0].length).setValues(data);
方案2:处理数值后转回到Date对象
如果必须要提取日期的数值做计算,处理完记得把时间戳转回Date对象再写入:
const sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("源表"); const data = sourceSheet.getDataRange().getValues(); // 遍历处理每一行,假设第2列是日期 data.forEach(row => { // 提取日期的时间戳(数值) const timestamp = row[1].valueOf(); // 这里插入你需要的数值处理逻辑... // 处理完转回到Date对象 row[1] = new Date(timestamp); }); // 写入新表 const newSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("新表"); newSheet.getRange(1, 1, data.length, data[0].length).setValues(data);
方案3:强制设置单元格格式(兜底)
如果写入后日期格式还是不对,可以在写入后手动设置目标列的格式:
// 写入数据后,给日期列(第2列)设置dd/mm/yyyy格式 newSheet.getRange(1, 2, data.length, 1).setNumberFormat("dd/mm/yyyy");
核心要点就是:Google Sheets对Date对象有原生支持,尽量不要把它转成纯数值直接写入,除非你特意要存储时间戳数据。
内容的提问来源于stack exchange,提问作者RyanWantsToLearn
相关产品推荐
相关产品推荐

