【问题标题】:Google Apps Script - How to get email addresses from Sheet2 and send emailGoogle Apps 脚本 - 如何从 Sheet2 获取电子邮件地址并发送电子邮件
【发布时间】:2014-11-19 10:07:13
【问题描述】:

我有一个将任务存储在工作表 1 上的电子表格。任务完成后会发送一封电子邮件。表 2 包含用于发送至、抄送和回复的特定电子邮件地址。我可以遍历表 2 并获取每列的电子邮件地址。我希望能够将这些电子邮件地址添加到我在 MailApp 中发送电子邮件的选项中。我无法从表 2 的循环中获取电子邮件地址。请参阅下面的代码。任何帮助将不胜感激。

var EMAIL_SENT = "EMAIL_SENT";

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheets()[0];
  var sheet2 = ss.getSheets()[1];  

  var startRow = 2;
  var lastRow1 = sheet1.getLastRow()-1;
  var lastCol1 = sheet1.getLastColumn();
  var lastRow2 = sheet2.getLastRow()-1;
  var lastCol2 = sheet2.getLastColumn();

var sh1Range = sheet1.getRange(startRow, 1, lastRow1, lastCol1).getValues();
var sh2Range = sheet2.getRange(startRow, 1, lastRow2, lastCol2).getValues();
var subject = "Test Email";
//sheet2 Email Loop
for (var i = 0; i < sh2Range.length; ++i){
  var emails = sh2Range[i];
  var to = emails[0];
  var cc = emails[1];
  var replyTo = emails[2];
 }
//sheet1 Data Loop and Send Email
for (var j = 0; j < sh1Range.length; ++j){
  var data = sh1Range[j];
  var pName = data[0];
  var pID = data[1];
  var pm = data[2];
  var dd = Utilities.formatDate(new Date(data[3]), "America/New_York", "MMMM dd, yyyy");
  var team1 = data[4];
  var status = data[7];
if (team1 == "Task Completed" && status !== EMAIL_SENT){
  var htmlBody;
  htmlBody = "Project Name: "+pName+"<br>"+"Project ID: "+pID+"<br>"+"Project Manager: "+pm+"<br>"+"Due Date: "+dd+"<br>";
  var optAdvancedArgs = {replyTo: replyTo, cc: cc, name: "Test Email", htmlBody: htmlBody};
  //Logger.log(htmlBody);
  //Logger.log(optAdvancedArgs);
    }
  }
}

【问题讨论】:

  • 问题,sh2Range.length 和 sh1Range.length 是同一个值吗?如果是这样,将其全部构建到一个“for”循环中可能会更容易,否则您将考虑创建对象(或者可能是数组,但我认为这对于命名值是不好的做法。)
  • sh2Range.length 循环 sheet 2 中的值,sh1Range.length 循环 sheet 1 中的值。你是说变量名应该改变吗?您能否展示一个在一个 for 循环中循环通过 sheet1 和 sheet2 的示例?
  • 抱歉,为了澄清,我的意思是,sh2Range 和 sh1Range 的长度相同吗?在我看来,它们应该是这样,如果它们始终如一,那么您将更容易将所有内容都循环一遍。
  • 也许如果您看到样本表,您可以看到我想要实现的目标。 My Sheet

标签: google-apps-script google-sheets


【解决方案1】:

这个问题有点宽泛,有很多方法可以满足您的需求。当您的应用程序的细节不清楚时,很难说您应该选择什么,例如表 2 上将有多少个地址,以及您是否真的需要通过“if”语句,但我会在这里提供两个可能有用的潜在解决方案。

解决方案 1: 我在上面的 cmets 中试图确定的是电子邮件地址列表是否与项目列表的长度相同(例如,如果工作表上有 10 个项目1,这是否意味着表 2) 中有 10 行电子邮件地址。我仍然不清楚,因为您的“抄送”地址中有一个电子邮件地址列表,但“发送至”和“回复”地址中只有一个(因此您实际上不需要遍历整个范围,但也许这是项目的其他部分所必需的)。但是,如果是这种情况,那么您实际上可以在一个“for”循环中完成所有这些操作:

//sheet1 Data Loop and Send Email
for (var j = 0; j < sh1Range.length; ++j){
  var data = sh1Range[j];
  var pName = data[0];
  var pID = data[1];
  var pm = data[2];
  var dd = Utilities.formatDate(new Date(data[3]), "America/New_York", "MMMM dd, yyyy");
  var team1 = data[4];
  var status = data[7];
if (team1 == "Task Completed" && status !== EMAIL_SENT){
  var emails = sh2Range[i];
  var to = emails[0];
  var cc = emails[1];
  var replyTo = emails[2];
  var htmlBody;
  htmlBody = "Project Name: "+pName+"<br>"+"Project ID: "+pID+"<br>"+"Project Manager: "+pm+"<br>"+"Due Date: "+dd+"<br>";
  var optAdvancedArgs = {replyTo: replyTo, cc: cc, name: "Test Email", htmlBody: htmlBody};
  //Logger.log(htmlBody);
  //Logger.log(optAdvancedArgs);
    }
   }

解决方案 2: 否则,您可以在遍历电子邮件地址时将它们放入一个数组中:

 var addresses = [];

for (var i = 0; i < sh2Range.length; ++i){
  var emails = sh2Range[i];
  var to = emails[0];
  var cc = emails[1];
  var replyTo = emails[2];
  addresses.push([to,cc,replyTo])
 }

这将允许您在脚本后面使用括号符号“addresses[0][0]”访问它们:

 var optAdvancedArgs = {replyTo: addresses[0][2], cc: addresses[j][1], name: "Test Email", htmlBody: htmlBody};

这两种解决方案都对您正在做的事情做出很多假设,但它们可能会引导您找到您正在寻找的答案,或者可能让您更具体地了解您要问的问题类型.

【讨论】:

  • 感谢您花时间展示和解释。解决方案 2 似乎几乎对我有用。
  • 您可能会遇到与 var optAdvancedArgs 相关的问题,因为它使用 'cc:addresses[j][1]' 但 for 循环可能会使 'j' 成为更高的数字您拥有的地址数量。要解决这个问题,您需要了解 sheet1 上的项目与 sheet2 上的电子邮件地址之间的关系,而我不知道,因此您可能必须自己逻辑,或更清楚地解释它们之间的关系。
  • 感谢您花时间展示和解释。解决方案 2 似乎几乎对我有用。我正在尝试构建的应用程序的完整说明。我有一个由 10 名用户组成的团队,他们拥有不同的电子邮件地址。他们将填写 A - D 列。每个团队成员将在 E - F 列的下拉菜单中选择一个选项。如果选择“请求已发送”,则选择 H 列将更新为 EMAIL_SENT,并且将发送一封电子邮件至另一个团队。其他成员(主管、经理和团队负责人)必须在此电子邮件中抄送。他们必须回复特定的电子邮件地址。表 2 包含这些电子邮件
  • 抓住了它并将其更改为'cc:addresses[0][1]',但这是我试图通过电子邮件实现的目标。目前,发送to 字段是一个电子邮件地址,但可能更多。同样适用于cc 列。我需要cc 列是(user1@gmail.com, user2@gmail.com, user3@gmail.com, user4@gmail.com)。现在,每封cc 电子邮件都会针对每封电子邮件显示一次。
  • 更新:我所做的是将所有cc 电子邮件地址放入一个单元格并用逗号分隔。这实现了我想要的。谢谢你的帮助:-)
猜你喜欢
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 2021-11-21
  • 2020-12-15
  • 1970-01-01
  • 2013-08-15
相关资源
最近更新 更多