Google Scripts表单日期格式化报错:参数不匹配方法签名
问题分析与解决方案
错误原因
你碰到的Exception: The parameters (String,String,String) don't match the method signature报错,核心问题是**Utilities.formatDate()要求第一个参数必须是Date类型的对象**,但你从e.values[1]获取的signDate是一个字符串(日志里的20/05/2020),并非Date对象,导致方法参数类型不匹配,从而触发报错。
解决方法:将字符串转为Date对象再格式化
表单提交的日期是DD/MM/YY格式的字符串,我们需要先拆分它的日、月、年部分,再手动构造Date对象(直接用new Date("20/05/2020")可能存在跨环境兼容性问题,手动拆分更可靠)。修改后的代码如下:
var signDateStr = e.values[1]; // 获取表单提交的日期字符串,例如"20/05/2020" // 拆分字符串为日、月、年三部分 var dateParts = signDateStr.split('/'); // 注意:JavaScript的Date对象中月份从0开始计数,所以要将月份值减1 var signDate = new Date(dateParts[2], dateParts[1] - 1, dateParts[0]); // 现在可以正常调用formatDate进行格式化 var formatSignDate = Utilities.formatDate(signDate, Session.getScriptTimeZone(), "dd MMMM yyyy"); body.replaceText('{{Execution Date}}', formatSignDate);
这里推荐用Session.getScriptTimeZone()代替硬编码的"GMT+1",它会自动匹配脚本所在时区,避免手动设置时区带来的误差。
关于表格单元格日期的格式化
完全可以直接用表格单元格的日期来格式化!如果表单响应数据存储在Google Sheets中,且对应单元格设置为日期格式,那么直接从单元格获取的值本身就是Date类型对象,无需额外转换,就能直接用Utilities.formatDate()处理:
// 假设表单响应表名为"表单响应1",日期位于第2列(索引从1开始) var responseSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("表单响应1"); var lastSubmittedRow = responseSheet.getLastRow(); // 直接获取单元格的Date对象 var signDate = responseSheet.getRange(lastSubmittedRow, 2).getValue(); // 格式化日期 var formatSignDate = Utilities.formatDate(signDate, Session.getScriptTimeZone(), "dd MMMM yyyy"); body.replaceText('{{Execution Date}}', formatSignDate);
这种方式更稳妥,无需处理字符串转Date的兼容性问题,直接利用Sheets对日期的原生支持即可。
内容的提问来源于stack exchange,提问作者nmbzn
相关产品推荐
相关产品推荐

