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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:32:30