【问题标题】:App Script - Send Email based on days left to date - Can't make script send it X days left to date应用程序脚本 - 根据截止日期发送电子邮件 - 无法让脚本发送它 X 天截止日期
【发布时间】:2021-03-05 12:10:09
【问题描述】:

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

当某个特定日期还剩 3 天时,我正尝试向特定收件人“email@myemail.com”发送一封电子邮件。 每行代表一个人,我希望发送的电子邮件能够为每个离职日期的人发送一封电子邮件 - 今天的日期正好是 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, lastRow-startRow+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@myemail.com","Reminder Offboarding",msg)
  }
   
};

两件事我不明白:

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

感谢您的帮助!

【问题讨论】:

    标签: google-apps-script google-sheets spreadsheet google-developer-tools


    【解决方案1】:

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

    以下是更改:

    • 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@myemail.com", "Reminder Offboarding", "", {htmlBody: message, noReply: true});
      }
    }
    

    样本数据:

    样本输出:

    注意:

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

    【讨论】:

    • 酷!真是个巫师!那为我解决了!非常感谢您急需的改进!
    • 嗨@ManelVeloso,我很高兴它对你有用。如果我们回答了您的问题,请点击接受按钮。通过这样做,社区中可能与您有同样担忧的其他人将知道他们的问题可以得到解决。如果您无法使用接受按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
    • 是的!谢谢 :) 我没有看到答案旁边的接受按钮,可能是因为我是新用户吗?
    • 随着您所做的新更改,我有点不知所措:D
    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多