Скрипт оповещения по электронной почте для проверки наличия уведомлений у пользователя — Google AppScript

#javascript #loops #google-apps-script

#javascript #циклы #google-apps-script

Вопрос:

Я нашел много полезного на этом форуме. Я новичок в GAS и JS-кодировании в целом, и я не могу найти способ решить то, в чем я уверен, это NBD.

Сначала я прикрепляю код:

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

  // getting data from spreadsheet
  var url = SpreadsheetApp.getActiveSpreadsheet().getUrl();
  var sheet = SpreadsheetApp.openByUrl(url).getSheetByName("Assignments");
  var resultssn = SpreadsheetApp.openByUrl(url).getName();

//Emails addresses
  var emailJonDoe = "example@example.com"
  var emailEmilyDoe = "example@example.com"
  
  var duedatesRange = sheet.getRange("H5:H9");  
  var duedates = duedatesRange.getValues();
  var actionitRange = sheet.getRange("C5:C9"); 
  var actionit = actionitRange.getValues();
  var prjsRange = sheet.getRange("B5:B9"); 
  var prjs = prjsRange.getValues();
  var whosRange = sheet.getRange("D5:D9"); 
  var whos = actionitRange.getValues();


  //looping through all of the rows
  for (var i = 0; i < duedates.length;   i) {
    var row = duedates[i];
    
  for (var i = 0; i < actionit.length;   i) {  
    var assignmenttext = actionit[i];
    
  for (var i = 0; i < prjs.length;   i) {     
    var project = prjs[i];
  
  for (var i = 0; i < whos.length;   i) {      
    var user = whos[i];

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

    // email information
    var subject = '';
    var message =
      " One of your action items is due today. "  
      'n'  
      'n'  
      ' Project: '  
      project[i]  
      'n'  
      'n'  
      ' Action Item: '  
      assignmenttext[i]  
      'n'   
      'n'  
      'Check the Tracker now !!'   
      'n'  
      url;

    //expiration date information
    var expireDateMonth = new Date(row[i]).getMonth()   1;
    var expireDateDay = new Date(row[i]).getDate();
    Logger.log("Expire date is:"   expireDateDay);

    //check for JD and send email to him if true
    if (
      user[i] === "JD" amp;amp;
      expireDateMonth === todayMonth amp;amp;
      expireDateDay === todayDay
    ) {
      var subject =
        'FEG AAAAAAManagement - An action item is due today!! : '   assignmenttext[i];
      MailApp.sendEmail(emailJonDoe, subject, message);
      Logger.log('todayyyy!');
    }
    
    //check for ED and send email to him if true
    if (
      user[i] === "ED" amp;amp;
      expireDateMonth === todayMonth amp;amp;
      expireDateDay === todayDay
    ) {
      var subject =
        'FEG DDDDDManagement - An action item is due today!! : '   assignmenttext[i];
      MailApp.sendEmail(emailEmilyDoe, subject, message);
      Logger.log('todayyyy!');
    }
    }
 }
 }
}
}
 

введите описание изображения здесь

Это простой фрагмент, который отправляет электронные письма для каждой строки, содержащей сегодняшнюю дату в столбце H.

У меня уже работает аналогичный, но я хотел бы реализовать функцию «user». Короче говоря, я хочу, чтобы код:

  1. Проверьте для каждой строки, содержащей сегодняшнюю дату в столбце H.
  2. Для каждой из приведенных выше строк проверьте содержимое соответствующей ячейки в столбце D. Если он содержит JD, отправьте электронное оповещение на электронную почту JD. Если он содержит ED, отправьте электронное оповещение на электронную почту ED.
  3. Электронное письмо должно содержать соответствующую ячейку строки для столбца C (assignmenttext) и столбца B (project).

AFAIK, этот код не слишком тяжелый на стороне сервера, поскольку я только «getRange» в начале, и большая часть кода выполняется на стороне клиента (это правильно?).

Я не уверен, какую функцию цикла использовать в этом случае и как реализовать ее с помощью моего кода.

Я открыт для любых комментариев или предложений. Заранее спасибо всем, кто потратит некоторое время, чтобы помочь мне. (:

Комментарии:

1. Забавно, что вы должны сказать, что вы не можете найти такое решение в Stack Overflow, потому что вопросы электронной почты являются одними из самых распространенных в Stack Overflow. Мое первое впечатление было бы, что вы, вероятно, не слишком усердствовали.

2. Привет, Купер. Я просмотрел темы функций электронной почты на этом форуме. Проблема скорее в циклах, а не в функции отправки электронной почты.

Ответ №1:

Это то, что я бы сделал. По общему признанию, вам должно быть удобно работать с массивами, но это создает приятный компактный код.

Два объекта email и prefix предоставляют место для ввода новых пользователей в одном месте и упрощают код, позволяя использовать одну команду отправки.

 function emailAlert() { 
  const sentcolumn=45;//I recommend adding some column to contain and indication of when an email is already been sent.
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName("Assignments");
  const vA=sh.getRange(5,1,5,sentcolumn).getValues();//your data went from row 5 to row 9 that is five rows  
  const dt=new Date();
  const today=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();//this is a number
  const emails={"JD":"jd@example.com","ED":"ed@example.com"};//emails
  const prefix={"JD":"FEG AAAAAAManagement - An action item is due today!! : ","ED":"FEG DDDDDManagement - An action item is due today!! : "};//subject prefixes
  vA.forEach(function(r,i){
    let x=new Date(r[7]);
    let duedate=new Date(x.getFullYear(),x.getMonth() 1,x.getDate()).valufOf();//this is a number
    var body=Utilities.formatString('One of your action items is due today. nn Project: %s nn Action Item: %snnCheck the Tracker now !!n%s',r[1],R[2],ss.getUrl());
    let subject=prefix[r[3]]   r[2];
    if(today==duedate amp;amp; r[sentcolumn-1]!='Sent') {
      GmailApp.sendEmail(emails[r[3]],subject,body);
      sh.getRange(i 5,sentcolumn).setValue('Sent');//adding something like this would keep you from sending duplicate emails by mistake
    }
  });
}
 

Ответ №2:

Это можно сделать с помощью одного цикла for, проверяя данные в каждой строке:

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

  // getting data from spreadsheet
  var url = SpreadsheetApp.getActiveSpreadsheet().getUrl();
  var sheet = SpreadsheetApp.openByUrl(url).getSheetByName("Assignments");
  var resultssn = SpreadsheetApp.openByUrl(url).getName();

  //Emails addresses
  var emailJonDoe = "example@example.com"
  var emailEmilyDoe = "example@example.com"
  
  var lastRow = sheet.getLastRow();
  var dataRange = sheet.getRange(2,1,lastRow,8).getValues();

  //looping through all of the rows
  for (var i = 0; i < lastRow-1; i  ) {
    var project = dataRange[i][1];
    var assignmenttext = dataRange[i][2];
    var user = dataRange[i][3];
    var row = dataRange[i][7]; 
    
    //expiration date information
    var expireDateFormat = Utilities.formatDate(new Date(row),'ET','MM/dd/yyyy');
    var expireDateMonth = new Date(row).getMonth()   1;
    var expireDateDay = new Date(row).getDate();
    Logger.log("Expire date is:"   expireDateDay);
    
    //check for expiry date
    if (expireDateMonth === todayMonth amp;amp; expireDateDay === todayDay) {
      var subject =
        'FEG AAAAAAManagement - An action item is due today!! : '   assignmenttext;
          // email information
      var message =
          " One of your action items is due today. "  
          'n'  
          'n'  
          ' Project: '  
          project  
          'n'  
          'n'  
          ' Action Item: '  
          assignmenttext  
          'n'   
          'n'  
          'Check the Tracker now !!'   
          'n'  
          url;
      if (user === 'JD') {
        MailApp.sendEmail(emailJonDoe, subject, message);
      }
      if (user === 'ED') {
        MailApp.sendEmail(emailEmilyDoe, subject, message);
      }
    }
  }

}
 

Выполнение этого на листе примеров возвращает:

введите описание изображения здесь

введите описание изображения здесь

Обратите внимание, что я не отправлял электронные письма, вместо этого я просто регистрировал значения в своем тестовом коде.