应用程序脚本 - 根据剩余天数发送电子邮件 - 无法让脚本发送 X 天数 代码:示例数据:示例输出:注意:

问题描述

我正在使用这个电子表格 Here

当距离特定日期还剩 3 天时,我尝试向特定收件人“[email protected]”发送电子邮件。 每一行代表一个人,我希望发送的电子邮件向我发送一封电子邮件,告知每个离职日期(今天的日期正好是 3 天)的人。

这是我的输出Email received

这是我正在使用的脚本:

function Offboarding_Reminder() {
  // get the spreadsheet object
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // set the first sheet as active
  SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);
  // fetch this sheet
  var sheet = spreadsheet.getActiveSheet();

  // figure out what the last row is
var lastRow = sheet.getLastRow();
 
// the rows are indexed starting at 1,and the first row
// is the headers,so start with row 
var startRow = 2;

// grab column 11 (the 'days left' column) 
var range = sheet.getRange(2,12,lastRow-startRow+1,1 );
var numRows = range.getNumRows();
var days_left_values = range.getValues();
 
// Now,grab the user name column
range = sheet.getRange(2,1,1);
var reminder_name = range.getValues();

var warning_count = 0;
var msg = "";
 
// Loop over the days left values
for (var i = 0; i < numRows - 1; i++) {
  var days_left = days_left_values[i][0];
  if(days_left == 3) {
    // if it's exactly 3,do something with the data.
    var user_name = reminder_name[0][i];
     
   msg ="Reminder:"+reminder_name+" offboarding is due in "+days_left+" days.\n";
      warning_count++;
  }
}
if(warning_count) {
    MailApp.sendEmail("[email protected]","Reminder Offboarding",msg)
  }
   
};

我不明白的两件事:

  1. 为什么我发送的电子邮件给了我所有的用户电子邮件,而不是只有 days_left == 3 的那些?
  2. 自动化这个脚本,一旦它工作,我应该只向 appscript 添加一个触发器吗?

感谢您的帮助!

解决方法

我实际上修改了你的代码,因为它没有优化。它有很多多余和不必要的行。

变化如下:

  • 一次获取从 user 列到 days_left 列的范围,而不是单独提取
  • 创建数组来存储符合条件的用户
  • 格式化电子邮件以使其看起来更好。

代码:

function offboardingReminder() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // set active sheet to first sheet
  spreadsheet.setActiveSheet(spreadsheet.getSheets()[0]);
  var sheet = spreadsheet.getActiveSheet();
  // figure out what the last row is
  var lastRow = sheet.getLastRow();
  var startRow = 2;
  // grab all data from user to days left
  var range = sheet.getRange(startRow,1,lastRow - startRow + 1,12);
  var values = range.getValues();
  var users = [];

  // loop all data per row
  values.forEach(function(row) {
    // if days left is 3
    if(row[11] == 3) {
      // add user if 3 days left
      users.push(row[0]);
    }
  });

  // if users has elements
  if(users) {
    // Formatted the message as html to look nicer
    var message = "<html><body><h1>Reminder!!!</h1><p>The following user/s offboarding is due in 3 days:</p>";
    // created bulleted list for list of users
    var emails = "<ul>";
    users.forEach(function(user){
      emails = emails + "<li>" + user + "</li>";
    });
    emails += "</ul>";
    message = message + emails + "</body></html>";
    MailApp.sendEmail("[email protected]","Reminder Offboarding","",{htmlBody: message,noReply: true});
  }
}

示例数据:

sample data

示例输出:

output

注意:

  • 您可以改为在脚本中计算剩余天数,但如果工作表中已经需要它,那么重用它就可以了。
  • 我通过公式 =DAYS(C2,TODAY()) 填充了第 2 行的剩余天数列(拖动其他行)