Google Apps Script中如何将表单日期转为指定英文长格式?
解决Google表单日期转"MMMM d, yyyy"格式的问题
问题出在表单提交的日期可能被识别为纯文本,而setNumberFormat()只对日期/数值类型的单元格生效,对文本格式的内容不起作用。下面给你两种针对性的解决方案:
方案1:处理表单提交的单个日期(适合触发器场景)
既然你是在处理表单提交的响应(用了e.values),直接把获取到的文本日期转成日期对象,再格式化后写入单元格:
function onFormSubmit(e) { var sheet = SpreadsheetApp.getActiveSheet(); // 获取表单提交的日期文本 var memoDateText = e.values[3]; // 把文本转成日期对象 // 注意:如果是两位年份(比如18),需要补全为四位 var dateParts = memoDateText.split("/"); var year = dateParts[2].length === 2 ? "20" + dateParts[2] : dateParts[2]; var memoDate = new Date(year, dateParts[0] - 1, dateParts[1]); // 月份是0-based // 格式化为"March 15, 2018"样式 var formattedDate = Utilities.formatDate( memoDate, Session.getScriptTimeZone(), // 或者指定具体时区如"America/New_York" "MMMM d, yyyy" ); // 写入到对应的单元格(比如最后一行的D列) sheet.getRange(sheet.getLastRow(), 4).setValue(formattedDate); }
方案2:批量转换已有文本日期
如果需要处理D列已有的所有文本日期,可以遍历单元格批量转换:
function convertDateFormat() { var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet.getLastRow(); var dateRange = sheet.getRange("D2:D" + lastRow); var values = dateRange.getValues(); var formattedValues = values.map(function(row) { if (!row[0]) return [row[0]]; // 空单元格跳过 // 拆分日期文本并转成日期对象 var parts = row[0].split("/"); var year = parts[2].length === 2 ? "20" + parts[2] : parts[2]; var date = new Date(year, parts[0]-1, parts[1]); // 格式化后返回 return [Utilities.formatDate(date, Session.getScriptTimeZone(), "MMMM d, yyyy")]; }); // 把格式化后的值写回单元格 dateRange.setValues(formattedValues); // 可选:如果希望单元格是日期类型而非文本,用下面的代码替代上面的setValues // dateRange.setNumberFormat("MMMM d, yyyy").setValues( // values.map(row => row[0] ? [new Date(row[0])] : row) // ); }
关键注意事项
- 时区问题:
Session.getScriptTimeZone()会使用脚本的默认时区,如果你需要特定时区,直接替换成时区字符串(比如"UTC"或"Asia/Shanghai")。 - 两位年份处理:如果表单返回的是两位年份(如
3/15/18),一定要补全为四位(2018),否则new Date()可能会识别成1918年。
内容的提问来源于stack exchange,提问作者Chris Cline US - ADVS
相关产品推荐
相关产品推荐

