Google Apps Script日期格式化报错求助:参数不匹配
解决Google Apps Script中Utilities.formatDate参数不匹配报错
报错原因
Utilities.formatDate()方法要求第一个参数必须是Date类型对象,但你的脚本中date2(首次提醒日期)或date3(第二次提醒日期)从单元格读取到的是字符串格式(比如单元格被设置为文本格式,或日期被自动转换为字符串),导致参数类型不匹配,触发The parameters (String,String,String) don't match the method signature错误。
解决方案
在调用Utilities.formatDate()前,先将读取到的日期值转换为Date对象,并处理空值或无效日期的情况:
- 检查原始日期值类型,若为字符串则用
new Date()转换为Date对象 - 验证转换后的Date对象是否有效(避免无效日期导致的NaN)
- 对无效日期或空值设置默认显示文本(比如“未发送”)
修改后的完整脚本
//Email to Manager for incomplete Internal Audit Register Review function sendManagerInternalAuditRegisterEmails() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName("Internal Audit Register"); var lastRow = sheet.getLastRow(); var message = spreadsheet.getSheetByName("Email Alerts").getRange(17,1).getValue(); //Cell A17 for (var i = 3;i<=lastRow;i++){ //From row 3 to the last row var auditorEmail = sheet.getRange(i, 12).getValue(); //Column L - 审计员邮箱 var managerEmail = sheet.getRange(i, 14).getValue(); // 假设经理邮箱在N列,可根据实际调整 var firstName = sheet.getRange(i, 11).getValue(); //Column K var managerName = sheet.getRange(i, 13).getValue(); //Column M var todaysDate = sheet.getRange(1, 14).getValue(); //Cell N1 var date = sheet.getRange(i, 7).getValue(); //Column G - date added to spreadsheet // 处理首次提醒日期date2 var date2Raw = sheet.getRange(i, 15).getValue(); var date2 = typeof date2Raw === 'string' ? new Date(date2Raw) : date2Raw; var formattedDate2 = date2 instanceof Date && !isNaN(date2) ? Utilities.formatDate(date2, "GMT+1300", "dd MMMMM yyyy") : "未发送"; // 处理第二次提醒日期date3 var date3Raw = sheet.getRange(i, 16).getValue(); var date3 = typeof date3Raw === 'string' ? new Date(date3Raw) : date3Raw; var formattedDate3 = date3 instanceof Date && !isNaN(date3) ? Utilities.formatDate(date3, "GMT+1300", "dd MMMMM yyyy") : "未发送"; var formattedDate = Utilities.formatDate(date, "GMT+1300", "dd MMMMM yyyy") var type = sheet.getRange(i, 1).getValue(); //Column A var id = sheet.getRange(i, 2).getValue(); //Column B var title = sheet.getRange(i, 3).getValue(); //Column C var reason = sheet.getRange(i, 4).getValue(); //Column D var messageBody = message.replace("{Name}",firstName) .replace("{Manager}",managerName) .replace("{Type}",type) .replace("{ID}",id) .replace("{Title}",title) .replace("{Reason}",reason) .replace("{Date}",formattedDate) .replace("{Date2}",formattedDate2) .replace("{Date3}",formattedDate3); var subject = "Incomplete Internal Audit Review Task"; var sendDate = sheet.getRange(i, 17).getValue(); //Column Q - 向经理发送邮件的日期 // 处理sendDate的类型转换 var sheetDate = typeof sendDate === 'string' ? new Date(sendDate) : sendDate; if (!(sheetDate instanceof Date) || isNaN(sheetDate)) continue; // 无效日期则跳过当前行 var Sdate = Utilities.formatDate(todaysDate,"GMT+1300","dd MMMM yyyy") var SsheetDate = Utilities.formatDate(sheetDate,"GMT+1300", "dd MMMM yyyy") if (Sdate == SsheetDate){ subject = "Reminder - Internal Audit Review Task"; // 原脚本发送给审计员,若需发送给经理请使用managerEmail MailApp.sendEmail(managerEmail, subject, messageBody); } } }
额外优化提示
- 避免在循环中反复调用
getRange(),建议一次性读取整个工作表数据到数组,提升脚本运行效率:var data = sheet.getDataRange().getValues(); // 然后通过data[i][colIndex]获取值,注意列索引从0开始 - 确保工作表中日期列的格式设置为“日期”类型,而非文本,减少类型转换问题。
内容的提问来源于stack exchange,提问作者McChief
相关产品推荐
相关产品推荐

