【问题标题】:Send single email with values from all new rows in a spreadsheet (Google Script / GAS)发送一封电子邮件,其中包含电子表格中所有新行的值(Google Script / GAS)
【发布时间】:2016-04-05 00:46:00
【问题描述】:

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

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

我被卡住了,因为似乎我需要让每个新添加的行定义一个相对变量,即第一个未发送的行 = 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,
});
}
}
}

【问题讨论】:

    标签: email google-apps-script


    【解决方案1】:

    无需过多修改您的代码,这就是我为您准备的:

    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,
    });
    }
    

    因此,本质上我们将消息变量的范围更改为 for 循环之外,以便在每次迭代期间可以使用相同的内容访问它。然后,我们将每个新记录的附加 HTML 内容附加到 message 变量中。我更改了检查电子邮件是否已经发送到顶部,这实际上会稍微提高速度,但也不会干扰我们的消息变量。最后,我将电子邮件发送部分移出 for 循环,因为我们在循环内收集了数据。

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

    我还没有测试过这段代码,因为我在旅途中这样做,但我相信它应该没有问题。如果您需要进一步的帮助,请告诉我。

    【讨论】:

    • 您的帮助非常有帮助!为了便于阅读,我做了一些细微的修改,但我非常感谢你。谢谢!
    • 它不起作用怎么办?上面的解决方案更具体地针对发布它的人。也许就您的具体情况提出问题。
    • CurrentRow[11];应改为 CurrentRow[10];数组索引从 0 开始,但 getRange 列值从 1 开始。
    • 它不起作用。尽管大多数已发送,但电子邮件的内容都是行。简而言之,它不包含未发送的内容。请修复
    • @sebas 您需要确保将 EmailSent 设置为已发送标签列的索引。上面的解决方案是针对原始海报问题的。
    【解决方案2】:

    类似的解决方案,但稍微清理了代码。

    /* 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 */
    }
    

    我分享了@98​​7654321@供你参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 2021-10-11
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多