Email 发送一封电子邮件,其中包含电子表格中所有新行的值(Google脚本/GAS)

Email 发送一封电子邮件,其中包含电子表格中所有新行的值(Google脚本/GAS),email,google-apps-script,Email,Google Apps Script,多亏了在这个网站上的大量阅读,我成功地构建了一个脚本,它完成了我想要它做的事情:在运行时,脚本为电子表格中的每一行发送一封单独的电子邮件,然后将该行标记为“已发送”。耶 但现在我需要脚本在一封电子邮件中将所有行编译成多个部分。因此,我需要脚本来检查新行,使用模板将每一新行的值添加到单独的节中,将所有新节编译成电子邮件,发送电子邮件,然后将所有新行标记为“已发送” 我被卡住了,因为我似乎需要让每个新添加的行定义一个相对变量,即第一个未发送的行=sectionOne,第二个=sectionTwo,等

多亏了在这个网站上的大量阅读,我成功地构建了一个脚本,它完成了我想要它做的事情:在运行时,脚本为电子表格中的每一行发送一封单独的电子邮件,然后将该行标记为“已发送”。耶

但现在我需要脚本在一封电子邮件中将所有行编译成多个部分。因此,我需要脚本来检查新行,使用模板将每一新行的值添加到单独的节中,将所有新节编译成电子邮件,发送电子邮件,然后将所有新行标记为“已发送”

我被卡住了,因为我似乎需要让每个新添加的行定义一个相对变量,即第一个未发送的行=sectionOne,第二个=sectionTwo,等等。但是电子邮件的长度和要定义的变量的数量将取决于新行的数量。因此,我真的不知道如何让脚本通过循环,只向电子邮件正文添加(但全部)新内容

这就是我所拥有的,有人知道如何到达目标吗

function sendEmail() {

 //setup function
 var ActiveSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 var StartRow = 3;
 var RowRange = ActiveSheet.getLastRow() - StartRow + 1;
 var WholeRange = ActiveSheet.getRange(StartRow,1,RowRange,11);
 var AllValues = WholeRange.getValues();

 //iterate loop
 for (i in AllValues) {

 //set current row
 var CurrentRow = AllValues[i];

 //set subject line
 var Subject = "Found by " + CurrentRow[1];

 //set HTML template for information
 var message = 
      "<p><b>Title: </b>" + CurrentRow[2] + "</p>" +
      "<p><b>Agency: </b>" + CurrentRow[3] + "</p>" +
      "<p><b>Summary: </b>" + CurrentRow[4] + "</p>" +
      "<p><b>Due: </b>" + CurrentRow[5] + "</p>" +
      "<p><b>Posted: </b>" + CurrentRow[6] + "</p>" +
      "<p><b>Total Funding: </b>" + CurrentRow[7] + "</p>" +
      "<p><b>Announcement Number: </b>" + CurrentRow[8] + "</p>" +
      "<p><b>Useful Links: </b>" + CurrentRow[9] + "</p>";

 //define column to check if sent
 var EmailSent = CurrentRow[11];

 //define who to send grants to 
 var SendTo = "emailaddress1@gmail.com" + "," + "emailaddress2@gmail.com";

 //if row has not been sent, then...  
 if (emailsent != "sent") {

  //set the row to look at
  var setRow = parseInt(i) + startRow;

  //mark row as "sent"
  ActiveSheet.getRange(setRow, 11).setValue("sent");

  //send the actual email  
  MailApp.sendEmail({
      to: SendTo,
      cc: "",
      subject: subject,
      htmlBody: message,
});
}
}
}
函数sendmail(){ //设置功能 var ActiveSheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var StartRow=3; var RowRange=ActiveSheet.getLastRow()-StartRow+1; var WholeRange=ActiveSheet.getRange(StartRow,1,RowRange,11); var AllValues=WholeRange.getValues(); //迭代循环 对于(所有值中的i){ //设置当前行 var CurrentRow=所有值[i]; //设置主题行 var Subject=“由”+CurrentRow[1]发现; //为信息设置HTML模板 var消息= 标题:“+CurrentRow[2]+”

”+ “机构:”+CurrentRow[3]+“

”+ 摘要:“+CurrentRow[4]+”

”+ “到期:”+CurrentRow[5]+“

”+ “发布:“+CurrentRow[6]+”

”+ “资金总额:”+CurrentRow[7]+“

”+ “公告编号:”+CurrentRow[8]+“

”+ 有用的链接:“+CurrentRow[9]+”

”; //定义要检查是否已发送的列 var EmailSent=CurrentRow[11]; //定义向谁发送补助金 变量SendTo=”emailaddress1@gmail.com" + "," + "emailaddress2@gmail.com"; //如果尚未发送行,则。。。 如果(已发送电子邮件!=“已发送”){ //设置要查看的行 var setRow=parseInt(i)+startRow; //将行标记为“已发送” ActiveSheet.getRange(setRow,11).setValue(“已发送”); //发送实际的电子邮件 MailApp.sendmail({ 收件人:SendTo, 抄送:“, 主题:主题,, htmlBody:message, }); } } }
在不过度修改代码的情况下,以下是我为您准备的:

function sendEmail() {

 //setup function
 var ActiveSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 var StartRow = 3;
 var RowRange = ActiveSheet.getLastRow() - StartRow + 1;
 var WholeRange = ActiveSheet.getRange(StartRow,1,RowRange,11);
 var AllValues = WholeRange.getValues();

 var message = "";
 //iterate loop
 for (i in AllValues) {

 //set current row
 var CurrentRow = AllValues[i];

 //define column to check if sent (starts from "0" not "1")
 var EmailSent = CurrentRow[10];

 //if row has been sent, then continue to next iteration
 if (EmailSent == "sent") 
     continue;

 //set HTML template for information
  message +=
      "<p><b>Found by: </b>" + CurrentRow[1] + "</p>" +
      "<p><b>Title: </b>" + CurrentRow[2] + "</p>" +
      "<p><b>Agency: </b>" + CurrentRow[3] + "</p>" +
      "<p><b>Summary: </b>" + CurrentRow[4] + "</p>" +
      "<p><b>Due: </b>" + CurrentRow[5] + "</p>" +
      "<p><b>Posted: </b>" + CurrentRow[6] + "</p>" +
      "<p><b>Total Funding: </b>" + CurrentRow[7] + "</p>" +
      "<p><b>Announcement Number: </b>" + CurrentRow[8] + "</p>" +
      "<p><b>Useful Links: </b>" + CurrentRow[9] + "</p><br><br>";

  //set the row to look at
  var setRow = parseInt(i) + StartRow;

  //mark row as "sent"
  ActiveSheet.getRange(setRow, 11).setValue("sent");
}

 //define who to send grants to 
 var SendTo = "emailaddress1@gmail.com" + "," + "emailaddress2@gmail.com";

 //set subject line
 var Subject = "Grants";


  //send the actual email  
  MailApp.sendEmail({
      to: SendTo,
      cc: "",
      subject: Subject,
      htmlBody: message,
});
}
函数sendmail(){ //设置功能 var ActiveSheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var StartRow=3; var RowRange=ActiveSheet.getLastRow()-StartRow+1; var WholeRange=ActiveSheet.getRange(StartRow,1,RowRange,11); var AllValues=WholeRange.getValues(); var message=“”; //迭代循环 对于(所有值中的i){ //设置当前行 var CurrentRow=所有值[i]; //定义要检查是否已发送的列(从“0”开始,而不是从“1”) var EmailSent=CurrentRow[10]; //若已发送行,则继续下一次迭代 如果(EmailSent==“已发送”) 继续; //为信息设置HTML模板 信息+= 发现者:“+CurrentRow[1]+”

”+ 标题:“+CurrentRow[2]+”

”+ “机构:”+CurrentRow[3]+“

”+ 摘要:“+CurrentRow[4]+”

”+ “到期:”+CurrentRow[5]+“

”+ “发布:“+CurrentRow[6]+”

”+ “资金总额:”+CurrentRow[7]+“

”+ “公告编号:”+CurrentRow[8]+“

”+ 有用的链接:“+CurrentRow[9]+”



”; //设置要查看的行 var setRow=parseInt(i)+StartRow; //将行标记为“已发送” ActiveSheet.getRange(setRow,11).setValue(“已发送”); } //定义向谁发送补助金 变量SendTo=”emailaddress1@gmail.com" + "," + "emailaddress2@gmail.com"; //设置主题行 var Subject=“Grants”; //发送实际的电子邮件 MailApp.sendmail({ 收件人:SendTo, 抄送:“, 主题:主题,, htmlBody:message, }); } 因此,本质上,我们将消息变量的范围更改为for循环之外,以便在每次迭代期间可以使用相同的内容访问它。然后,我们将每个新记录的附加HTML内容附加到消息变量上。我改变了邮件是否已经发送到顶部的检查,这实际上会稍微提高速度,但也不会干扰我们的消息变量。最后,我将电子邮件发送部分移出for循环,因为我们在循环中收集数据

如果我多花一点时间,我可以修改这段代码,使其更易于理解,还可能将HTML内容更改为表格格式,但现在这应该可以完成这项工作


我还没有测试过这段代码,因为我正在进行这项工作,但我相信它应该可以正常工作。如果你需要进一步的帮助,请告诉我

类似的解决方案,但对代码进行了少量清理

/* please edit this function for your message format */
function buildMessageRow(row) {
  return (
    'Name:' + row[0] +
    'Email:' + row[1] + '\n'
  );
}

function sendEmail() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const allValues = sheet.getDataRange().getValues();
  const columnForSentMarker = 5; /*  sent marker column */
  const markerForSentEmail = 'email_fwd';
  var messages = '';
  allValues.forEach(function (row, index) {
    if (index === 0) return; /* skip 1st row for labels */
    if (row[columnForSentMarker - 1] === markerForSentEmail) 
      return;
    messages += buildMessageRow(row);
    sheet.getRange(index + 1, columnForSentMarker).setValue(markerForSentEmail);
  });
  Logger.log(messages); /* TODO: change logging to email sending */
}

我分享给你参考。

你的帮助非常有用!为了便于阅读,我做了一些小小的修改,但我非常感谢你。非常感谢。那它不起作用呢?上面的解决方案更具体地针对发布它的人。也许在你的特定场景中发布一个问题;应更改为CurrentRow[10];数组索引从0开始,但getRange列值从1开始。它不起作用。尽管大多数邮件都已发送,但邮件的内容都是行。简而言之,它不包含未发送内容。请fix@sebas您需要确保将EmailSent设置为已发送标签列的索引。上述解决方案是针对原始问题的。