Скрипт приложения Google для группировки данных строки в листе на основе столбца электронной почты - PullRequest
0 голосов
/ 14 июля 2020

У меня есть таблица Google с несколькими проектами. На листе также есть имена руководителей проектов, которые управляют этими проектами. Один руководитель проекта может управлять до 5 проектами на go. Лист выглядит так.

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

Я хотел бы сгруппировать данные каждой строки по столбцу F (электронная почта) и отправить одно электронное письмо каждому руководителю проекта по проектам, которыми они управляют, например, Тим Карри будет получить таблицу, в которой перечислены только проекты, которые он возглавляет. Мой код ниже не подходит для выполнения sh этой задачи, и я буду признателен за помощь в его изменении, чтобы сгруппировать данные и отправить их как HTML.

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 3;  // First row of data to process
  var numRows =  12;   // Number of rows to process                     
 
  
  var dataRange = sheet.getRange(startRow, 1, numRows, 12)  
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  var emails = data.map(function (e) { 
    return e[5]; 
  })
  var uniqueEmails = [...new Set(emails)];
  
  for (var j = 0; j < uniqueEmails.length; j++) {
    var subject = "";
    var body = "Please see if your project is on course, if not foward this email to PMS admin"
    for (var i = 0; i < data.length; i++) {
      if (data[i][5] == uniqueEmails[j]){
        var row = data[i];
        var projectnumber = row[0];
        var startdate = row[1];
        var enddate = row[2];
        var projectname = row[3];
        var projectlead= row[4];
        var email= row[5];
        
        
        var lr = sheet.getLastRow();
        var tableRangeValues=sheet.getRange(2,1, lr-1,6).getDisplayValues();
        
        var htmlTemplate = HtmlService.createTemplateFromFile("Notify") 
        htmlTemplate.projectnumber = projectnumber;
        htmlTemplate.startdate= startdate;
        htmlTemplate.enddate= enddate;
        htmlTemplate.projectname= projectname;
        htmlTemplate.projectlead=projectlead;
        htmlTemplate.email=email;
        var htmlForEmail = htmlTemplate.evaluate().getContent();
        
        if (enddate instanceof Date && enddate.getTime()>= new Date(07/14/20).getTime()) {   
         var emailSent = row[6];           
          if (emailSent != "Y") {
            subject += "Action Required - Project End"; 
          }
        }
        
      }
    }
    if(subject.length > 0){
      
                MailApp.sendEmail({
                to: uniqueEmails[j], 
                cc: "example@gmail.com",
                subject: subject, 
                body: body
              }); 
    }
  }
}

Уведомить HTML Код таблицы:

 <thead>
<tr>
<th><?=projectnumber?></th>
<th><?=startdate?></th>
<th><?=enddate?></th>
<th><?=projectname?></th>
<th><?=projectlead?></th>
<th><?=email?></th>
</tr>
</thead>
<tbody>
<?tableRangeValues.forEach(r=>{?>
<tr>
<td><?=r[0]?></td>
<td><?=r[1]?></td>
<td><?=r[2]?></td>
<td><?=r[3]?></td>
<td><?=r[4]?></td>
<td><?=r[5]?></td>
</tr>
<?})?>
</tbody>
</table>

1 Ответ

1 голос
/ 14 июля 2020

Используйте ... new Set () для извлечения уникальных писем из листа и объединения содержимого писем для строк, соответствующих каждому уникальному электронному письму

Пример:

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 3;  // First row of data to process
  var numRows =  12;   // Number of rows to process                     
  //  var numItems = SpreadsheetApp.getActiveSheet().getRange(startRow,1 numRows, sheet.getLastColumn()).getValues();
  // var numRows = numItems[0]
  
  var dataRange = sheet.getRange(startRow, 1, numRows, 11)  
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  var emails = data.map(function (e) { 
    return e[5]; 
  })
  var uniqueEmails = [...new Set(emails)];
  
  for (var j = 0; j < uniqueEmails.length; j++) {
    var subject = "";
    var body = "Please see if your project is on course, if not foward this email to PMS admin"
    for (var i = 0; i < data.length; i++) {
      if (data[i][5] == uniqueEmails[j]){
        var row = data[i];
        var projectnumber = row[0];
        var startdate = row[1];
        var enddate = row[2];
        var projectname = row[3];
        var projectlead= row[4];
        var email= row[5];
        if (enddate instanceof Date && enddate.getTime()>= new Date(07/14/20).getTime()) {   
         var emailSent = row[6];           
          if (emailSent != "Y") {
            subject += "Action Required - Project: " + projectname + " " + projectnumber + " " ; 
          }
        }
        
      }
    }
    if(subject.length > 0){
      
                 MailApp.sendEmail({
                to: uniqueEmails[j], 
                cc: "admin@example.com",
                subject: subject, 
                body: body
              }); 
    }
  }
}

UPDATE

Если вы хотите сгруппировать строки, например, чтобы передать их вместе al oop в шаблоне html, вы можете использовать функцию Javascript фильтр () .

Пример

Code.gs

var tableRangeValues;

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 3;  // First row of data to process
  var numRows =  12;   // Number of rows to process                       
  var dataRange = sheet.getRange(startRow, 1, numRows, 12)  
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  var emails = data.map(function (e) { 
    return e[5]; 
  })
  var uniqueEmails = [...new Set(emails)];  
  for (var j = 0; j < uniqueEmails.length; j++) {
    var subject = "Action Required - Project End";
    var body = "Please see if your project is on course, if not foward this email to PMS admin";
    
    tableRangeValues = data.filter(function(row){return (row[5] == uniqueEmails[j]);});
    var htmlTemplate = HtmlService.createTemplateFromFile("Notify") ;
    var htmlForEmail = htmlTemplate.evaluate().getContent();
    body += htmlForEmail;
    
    if(filteredData.length > 0){
      Logger.log("body: " + body);  
      MailApp.sendEmail({
        to: uniqueEmails[j], 
        cc: "example@gmail.com",
        subject: subject, 
        htmlBody: body
      }); 
    }
  }
}

Уведомить. html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
     <thead>

</thead>
<tbody>
<?tableRangeValues.forEach(r=>{?>
<tr>
<td><?=r[0]?></td>
<td><?=r[1]?></td>
<td><?=r[2]?></td>
<td><?=r[3]?></td>
<td><?=r[4]?></td>
<td><?=r[5]?></td>
</tr>
<?})?>
</tbody>
</table>
  </body>
</html>
  • Обратите внимание, что вам необходимо объявить tableRangeValues как глобальную переменную, если вы хотите использовать в шаблоне html скриптлеты
  • Обратите внимание, что если вы хотите отправить электронное письмо с htmlBody, вы должны указать его как таковой в пределах MailApp.sendEmail()
...