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

如何正确格式化Google Apps Script从单元格获取的日期值

你遇到的返回1899年日期的问题由以下3个核心错误导致:

  • 调用getDisplayValues()方法获取单个单元格值时,该方法默认返回二维数组,直接写入单元格时会被Google Sheets解析为0值,对应GS起始日期1899年12月30日
  • 自定义函数getFirstEmptyRow()内部调用了getActiveSpreadsheet(),和你前面通过ID打开的表格实例不匹配,会读取到错误的空行位置,甚至读取其他表格的列数据
  • 写入1行2列的范围时使用了setValue()方法,该方法仅支持写入单个值,批量写入多单元格需要用setValues(),且入参需为对应维度的二维数组

修正后的完整代码

// 请提前定义好SpreadsheetID和SheetName变量
function gammaTilt() {
  var ss = SpreadsheetApp.openById(SpreadsheetID);
  var sheet = ss.getSheetByName(SheetName);
  var gt = sheet.getRange("M2").getValue();
  // 给getFirstEmptyRow传入当前表格实例,避免读取错误
  var nextRow = getFirstEmptyRow('N', ss);
  var mDate = sheet.getRange("L2");
  // 单个单元格用getDisplayValue()直接返回字符串,和表格显示的09/20/2021格式完全一致
  var dateString = mDate.getDisplayValue();
  // 用setValues写入二维数组
  sheet.getRange(nextRow, 14, 1, 2).setValues([[gt, dateString]]);
};

// 新增ss参数接收当前表格实例
function getFirstEmptyRow(columnLetter, ss) {
  columnLetter = columnLetter || 'N';
  var rangeN1 = columnLetter + ':' + columnLetter;
  // 用传入的表格实例而非默认激活的表格
  var column = ss.getRange(rangeN1);
  var values = column.getValues();
  var ct = 0;
  while (values[ct][0] != "") {
    ct++;
  }
  return (ct+1);
}

如果需要输出Mon Sep 20 2021格式的日期,可以将获取dateString的代码替换为:

var rawDate = mDate.getValue();
// 若输出日期和表格显示差1天,可将时区参数替换为ss.getSpreadsheetTimeZone()
var dateString = Utilities.formatDate(rawDate, Session.getScriptTimeZone(), "EEE MMM dd yyyy");

该格式在Google Sheets和App Script环境下无兼容问题,直接写入单元格可正常识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:15:01