Google Sheets脚本问题:日期加1月需移除时间戳并修正计算错误
解决Google Sheets日期加1个月时的时间戳与日期异常问题
你的问题出在两个核心点:原脚本通过序列号转Date时容易引入时间偏移,导致时间戳残留;setMonth方法会自动调整日期(比如遇到下月无对应日期时),使得Account1的10月1日错误变成10月31日。以下是修正后的脚本和关键改动说明:
修正后的代码
function dateChanger() { var sheetName = "Sheet 1"; var a1Notations = ['G5:G27', 'T5:T27', 'AG5:AG27', 'AT5:AT27']; var ss = SpreadsheetApp.getActiveSpreadsheet(); var ssId = ss.getId(); var ranges = a1Notations.map(e => `'${sheetName}'!${e}`); // 直接获取格式化后的日期字符串,避免序列号转换的精度误差 var { valueRanges } = Sheets.Spreadsheets.Values.batchGet(ssId, { ranges, valueRenderOption: "FORMATTED_VALUE" }); var data = valueRanges.map(({ values }, i) => { var values = values.map(([dateStr]) => { // 将日期字符串转为Date对象 var originalDate = new Date(dateStr); // 直接构造新日期:保持年份、日期不变,月份+1 var newDate = new Date(originalDate.getFullYear(), originalDate.getMonth() + 1, originalDate.getDate()); // 强制清零时分秒毫秒,确保写入的是纯日期 newDate.setHours(0, 0, 0, 0); // 转换为Google Sheets识别的日期序列号 var serialNumber = (newDate.getTime() / 1000 / 86400) + 25569; return [serialNumber]; }); return { range: ranges[i], values }; }); // 以RAW模式写入,确保序列号被正确解析为日期,无额外格式问题 Sheets.Spreadsheets.Values.batchUpdate({ data, "valueInputOption": "RAW" }, ssId); }
关键改动说明
- 改用日期字符串获取:把
valueRenderOption从UNFORMATTED_VALUE换成FORMATTED_VALUE,直接读取Sheets里显示的日期字符串,避免序列号转换时的微小误差导致时间戳残留。 - 直接构造新日期:不再依赖
setMonth方法,而是通过「年份、原月份+1、原日期日」直接构造新日期,彻底规避因月份天数差异导致的日期自动调整问题。 - 强制清零时间:通过
setHours(0,0,0,0)把日期的时间部分完全清零,确保写入Sheets后只显示纯日期,不带任何时间戳。 - RAW模式写入:把
valueInputOption改成RAW,让Sheets直接解析日期序列号,不会因格式识别问题引入额外内容。
内容的提问来源于stack exchange,提问作者Riles
相关产品推荐
相关产品推荐

