通过电子邮件应用程序脚本在一封电子邮件中发送多个值

问题描述

我想设置一个Google脚本,只需按一下按钮,便会向列表中的每个用户发送一封电子邮件。我已经设置了按钮,但是我需要将一个用户的所有值合并到一封邮件中的帮助,而不是向同一个人发送具有一个值的多封电子邮件

例如:

Table example

我基本上需要罗丝(Rose)收到一封电子邮件,其中将这些项目逐项列出:

pens
printer
sketchpad
ink and toners

以此类推。

这是我到目前为止拥有的脚本,并且电子邮件中还有HTML正文:

function myFunction() {
  var name = 0;
  var email = 1;
  var objects = 2
  var emailTemp = HtmlService.createTemplateFromFile("body")
  var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  var data = ws.getRange("A2:D" + ws.getLastRow()).getValues();
  data.forEach(function(row){
    emailTemp.fn = row[name];
    emailTemp.site = row[objects];
    var htmlMessage = emailTemp.evaluate().getContent();
    GmailApp.sendEmail(row[email],"No objects ordered","Blabla",{htmlBody: htmlMessage})

  });
  
}

解决方法

一种简单的方法是通过减少一组唯一的名称/电子邮件

例如,这可以完成使用this函数:

function onlyUnique(value,index,self) {
  return self.indexOf(value) === index;
}
  • 然后您可以遍历所有唯一值
  • 找到包含它们的所有行
  • 将对应的对象推入数组
  • 根据需要在"body.html"中进行数组操作。

示例:

var unique = ws.getRange("A2:A" + ws.getLastRow()).getValues().flat().filter(onlyUnique);
  unique.forEach(function(person){
    var row_objects =[];  
    var mail = "";
    data.forEach(function(row){
      if(row[name] == person){
        row_objects.push(row[objects]);
        mail = row[email];
      }
    });
    Logger.log(row_objects);
      emailTemp.fn = person;
    emailTemp.site = row_objects;
    var htmlMessage = emailTemp.evaluate().getContent();
    GmailApp.sendEmail(mail,"No objects ordered","Blabla",{htmlBody: htmlMessage})
  })