如何正确格式化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
相关产品推荐
相关产品推荐

