Google Apps Script为何将输入时间自动增加33分钟?
时间偏移问题原因分析
需求与问题现象
需求:当在Google表格A列或B列输入时间时,通过Google Apps Script脚本将输入时间替换为「当前日期+输入时间」的组合值。
使用的脚本代码:
function onEdit(e) { var sheet = e.source.getActiveSheet(); var range = e.range; if (range.getColumn() === 1 || range.getColumn() === 2) { var time = range.getValue(); if (typeof time === 'object') { var hours = time.getHours(); var minutes = time.getMinutes(); var date = new Date(); date.setHours(hours); date.setMinutes(minutes); date.setSeconds(0); // Обнуляем секунды var formattedDate = Utilities.formatDate(date, Session.getScriptTimeZone(), 'dd.M HH:mm'); sheet.getRange(range.getRow(), range.getColumn()).setValue(formattedDate); } } }
实际运行异常:
- 输入
14:00后,单元格先显示11.25.2023 14:00,随后立刻变为11.25.2023 14:33; - 修改代码中
date.setMinutes(minutes)为date.setMinutes(minutes - 33)后,单元格显示11.25.2023 13:27(即输入时间减33分钟)。
问题核心原因
1. 脚本时区与表格显示时区不匹配
代码中使用Session.getScriptTimeZone()获取脚本运行的时区,但Google表格本身有独立的显示时区设置。输入时间时,表格先按自身时区解析时间,脚本读取后用脚本时区格式化输出,两个时区的差值(此处为33分钟)直接导致了时间偏移。
2. 日期对象的时区转换叠加
当输入纯时间(如14:00),Google表格会默认将其关联到「1899年12月30日」这个基准日期。脚本读取该Date对象时,会自动转换为脚本时区的时间;之后用当前日期替换基准日期并保留时分,再用脚本时区格式化后写回表格,表格又会将这个字符串按自身时区重新解析为日期对象,两次时区转换的叠加放大了偏移问题。
3. 字符串写入后的自动解析问题
用setValue(formattedDate)将格式化后的字符串写入单元格时,表格会自动将该字符串解析为日期时间类型,解析时使用的是表格的显示时区而非脚本时区,这再次引入了时区差,最终导致显示时间与预期不符。
内容的提问来源于stack exchange,提问作者Ликсеич
相关产品推荐
相关产品推荐

