首页 > 解决方案 > 谷歌表格电子邮件提醒,如果到期日期

问题描述

我有一个包含 8 列日期的表格。如果它们要过期,我需要跟踪它们,但对于其中的 3 个,我需要在 3 个月前发出警报,而对于其余列,在 6 个月前发出警报。

我认为我使用下面的代码走在正确的轨道上,但仍然没有做需要做的事情。

我从一开始的一个月开始。有人可以帮助我吗?

function emailAlert() {
  // today's date information
  var today = new Date();
  var todayMonth = today.getMonth() + 1;
  var todayDay = today.getDate();
  var todayYear = today.getFullYear();

  var newToday = new Date()
  var oneMonthFromToday = new Date(newToday.setMonth(newToday.getMonth()+1));
  var oneMonthMonth = oneMonthFromToday.getMonth() + 1;
  var oneMonthDay = oneMonthFromToday.getDate();
  var oneMonthYear = oneMonthFromToday.getFullYear();

  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2; 
  var numRows = 100; 
  var dataRange = sheet.getRange(startRow, 1, numRows, 999);
  var data = dataRange.getValues();

  //looping through all of the rows
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];

    var expireDateFormat = Utilities.formatDate(
      new Date(row[6]),
      'ET',
      'MM/dd/yyyy'
    );
    var subject = '';
    var message = ' You have expiring pass. ' + '\n';
    MailApp.sendEmail('lubomira.petkova88@gmail.com', subject, message);
  } 

标签: google-apps-scriptgoogle-sheets

解决方案


您的帖子尚不清楚,但下面的代码假设只需要检查 1 列。随意调整条件,但这应该是您代码的主要思想。

代码:

function checkPasswordExpiry() {
  // today's date information
  var today = new Date();
  today.setHours(0,0,0,0);
  // 3 months before
  var prev3Months = new Date();
  prev3Months.setMonth(today.getMonth() - 3);
  prev3Months.setHours(0,0,0,0);
  // 6 months before
  var prev6Months = new Date();
  prev6Months.setMonth(today.getMonth() - 6);
  prev6Months.setHours(0,0,0,0);

  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;
  // get number of rows/columns in sheet instead of manually setting it
  var numRows = sheet.getLastRow();
  var numCols = sheet.getLastColumn();
  var dataRange = sheet.getRange(startRow, 1, numRows, numCols);
  var data = dataRange.getValues();

  //looping through all of the rows
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];

    var expireDateFormat = Utilities.formatDate(
      new Date(row[6]),
      'ET',
      'MM/dd/yyyy'
    );

    var date = new Date(row[6]);
    date.setHours(0,0,0,0);
    
    var subject = 'Password Expiry';
    var message = 'Hi ' + row[0] + ', \nYour password is expiring';
    var email = 'lubomira.petkova88@gmail.com';

    if(date.getTime() === prev6Months.getTime()) {
      message += " in 6 months. ( " + expireDateFormat + " )";
      MailApp.sendEmail(email, subject, message);
    }
    else if(date.getTime() === prev3Months.getTime()) {
      message += " in 3 months. ( " + expireDateFormat + " )";
      MailApp.sendEmail(email, subject, message);
    }
    else if(date.getTime() === today.getTime()) {
      message += " today. ( " + expireDateFormat + " )";
      MailApp.sendEmail(email, subject, message);
    }
  }
}

上面的代码会检查 G 列是否已经是今天之前的 6 个月、今天之前的 3 个月或确切的日期。如果您需要检查多个列,只需替换里面的条件,它应该仍然有效。

电子邮件示例:

样本输出

请注意,上面的代码应该每天触发,以便它可以每天检查数据。

代码:

function createTimeDrivenTriggers() {
  ScriptApp.newTrigger('checkPasswordExpiry')
      .timeBased()
      .everyDays(1)
      .atHour(0)
      .create();
}

函数createTimeDrivenTriggers只需要运行一次。请参阅下面的参考。

参考:

如果我无法为您提供您希望的答案,我深表歉意。请随时在下面评论需要进行哪些更改。


推荐阅读