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

Google Apps Script表格时间格式转换异常,需保留24小时制显示求助

解决Google Sheets时间提取后格式丢失问题

我有一份员工打卡信息的电子表格,其中某列时间以24小时制显示(比如"22:00")。但把该列数据提取为数组时,日志里显示的是"Sat Dec 30 22:00:00 GMT-08:00 1899",粘贴到其他表格后只显示"12/30/1899"。

我尝试用map方法重组数据并格式化单元格时间,但没成功,希望能保留原表格里"22:00"这样的显示样式。当前代码如下:

const formatTime = function (time) {
  return Utilities.formatDate(time, "GMT+2", "HH:mm");
}

const correctOrder = filemakerData.map(function(r){
return [
  r[3], // Employee Name
  r[0], // Date
  r[1], // Building
  r[2], // SOR Number
  formatTime(r[4]), // Start Time
  formatTime(r[5]) // End Time
]
});

问题原因与解决方案

问题主要出在时区不匹配和表格自动格式识别两点:

  1. 代码里硬编码了GMT+2时区,但原时间的时区是GMT-08:00,时区偏差会导致格式化结果异常。
  2. 即使格式化出正确的"HH:mm"字符串,写入表格时可能被自动识别为日期类型,从而显示为1899年的日期。

修改方案一:匹配时区+强制文本格式写入

const formatTime = function (time) {
  // 获取脚本/表格的默认时区,避免硬编码偏差
  const timeZone = Session.getScriptTimeZone();
  return Utilities.formatDate(time, timeZone, "HH:mm");
}

const correctOrder = filemakerData.map(function(r){
  return [
    r[3], // Employee Name
    r[0], // Date
    r[1], // Building
    r[2], // SOR Number
    formatTime(r[4]), // Start Time
    formatTime(r[5]) // End Time
  ]
});

// 写入目标表格时,先设置单元格为文本格式
const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("你的目标工作表名");
if (targetSheet) {
  const range = targetSheet.getRange(1, 1, correctOrder.length, correctOrder[0].length);
  range.setNumberFormat("@") // 强制文本格式
       .setValues(correctOrder);
}

修改方案二:给时间字符串加前缀强制文本识别

如果不想全局设置单元格格式,可以在格式化后的时间前加单引号(表格会自动隐藏单引号,只显示时间):

const formatTime = function (time) {
  const timeZone = Session.getScriptTimeZone();
  // 加单引号前缀,让表格将内容识别为纯文本
  return "'" + Utilities.formatDate(time, timeZone, "HH:mm");
}

const correctOrder = filemakerData.map(function(r){
  return [
    r[3], // Employee Name
    r[0], // Date
    r[1], // Building
    r[2], // SOR Number
    formatTime(r[4]), // Start Time
    formatTime(r[5]) // End Time
  ]
});

// 直接写入即可,无需额外设置格式
const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("你的目标工作表名");
if (targetSheet) {
  targetSheet.getRange(1, 1, correctOrder.length, correctOrder[0].length).setValues(correctOrder);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:05:30