发送包含电子表格中所有新行值的单个电子邮件(Google Script / GAS)

时间:2016-04-05 00:46:00

标签: email google-apps-script

由于本网站上的大量阅读,我成功构建了一个执行我想要的操作的脚本:运行时,脚本会为电子表格中的每个新行发送单独的电子邮件,然后将该行标记为“已发送”。 “耶!

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

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

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

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

2 个答案:

答案 0 :(得分:4)

如果没有太多修改你的代码,这就是我得到的东西:

<?php

$conn = mysqli_connect("phpmyadmin.cvw71h2krjrb.us-east-1.rds.amazonaws.com", "phpmyadmin", "phpmyadmin", "Products");

$Category = $_POST["Category"];

//$sql_query = "select Product_Category from Products where Product_Category     like '$Category'";

$sql_query = "select concat(Product_Owner_Email,'_',Product_Name,'_',     Product_Key_Code) as productkeyword from table where <Product_Category like     '$Category'>";

$result = mysqli_query($conn, $sql_query);

if(mysqli_num_rows($result) > 0 ){

$row = mysqli_fetch_assoc($result);
$Product_Owner_Email =  $row['Product_Owner_Email'];
$Product_Name =  $row['Product_Name'];
$Product_Key_Code =  $row['Product_Key_Code'];

}

mysqli_close($conn);

echo $ProductKeyWord;
?>

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

如果我花了一点时间,我可以改变这些代码,使其更容易理解,也可能将HTML内容更改为表格格式,但这应该可以完成。

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

答案 1 :(得分: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 */
}

我分享了my test document供您参考。