【问题标题】:Email Remainder for every 20 days after the start date till the End date从开始日期到结束日期后每 20 天发送一次电子邮件提醒
【发布时间】:2025-12-20 10:50:14
【问题描述】:

我是编码新手,我想为从开始日期到结束日期每 20 天的电子邮件剩余部分编写一个谷歌应用脚​​本代码。

function emailAlert() {
  var sheet = SpreadsheetApp.getActiveSheet();
  lastRow = sheet.getLastRow();
  lastCol = sheet.getLastColumn();
  var dataRange = sheet.getRange( 2, 1, lastRow-1, lastCol);
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var date = new Date(row[3]); // make the sheet value a date object
    //Logger.log('original value = '+date);
    //Logger.log('method 1 : '+new Date(date.getTime()+5*3600000*24));
    twentyDaysFromStartDate = new Date(date.setDate(date.getDate()+20));
    var formattedtwentyDaysFromStartDate = Utilities.formatDate(new Date(twentyDaysFromStartDate), "ET", "dd/MM/yyyy");
    Logger.log (formattedtwentyDaysFromStartDate);
    var expireDateFormat = Utilities.formatDate(
      new Date(row[4]),
      'ET',
      'dd/MM/yyy'
    );
    Logger.log (expireDateFormat);
    var subject = '';
    var message =
      ' Controllare documenti Progetto Formativo ' +
      '\n' +
      ' CODICE FISCALE: ' +
      row[0] +
      '\n' +
      ' NOME: ' +
      row[1] +
      '\n' +
      ' COGNOME: ' +
      row[2] +
      '\n' +
      ' DATA INIZIO: ' +
      row[3] +
      '\n' +
      ' DATA FINE: ' +
      expireDateFormat;
      var today = Utilities.formatDate(
      new Date(),
     'ET',
     'dd/MM/yyyy',
      );
      Logger.log(today);
      if(formattedtwentyDaysFromStartDate!== expireDateFormat)
      {
      if(formattedtwentyDaysFromStartDate === today)
        {
          var subject =
          'Progetto formativo' +
          row[0] +
          ' - ' +
          expireDateFormat;
          MailApp.sendEmail('mail@gmail.com', subject, message);
        }
     }
  }
}

此代码适用于自开始日期起每 20 天的电子邮件剩余部分。但它甚至会在过期日期之后发送电子邮件剩余部分。请有人帮我解决这个问题?

【问题讨论】:

    标签: email google-apps-script google-sheets


    【解决方案1】:

    您可以调用此函数来查看今天是否是应该发送电子邮件的日子之一:

    function everyNDays(n, startDate, currentDate, terminationDate) {
        const day = 86400000;
        const t1 = new Date(startDate).valueOf();
        const t2 = new Date(currentDate).valueOf();
        const t3 = new Date(terminationDate).valueOf();
        if (t2 > t3) {
          return false;
        }
        const d = Math.abs(t2 - t1);
        const days = Math.floor(d / day);
        return days % n == 0;
    }
    

    像这样使用它:

      const now = new Date();
      if (everyNDays(20, '2021-01-02', now, '2021-12-31')) {
        // send email
      }
    

    您可以每天使用time-driven trigger 运行一次电子邮件发送功能。

    【讨论】: