由于本网站上的大量阅读,我成功构建了一个执行我想要的操作的脚本:运行时,脚本会为电子表格中的每个新行发送单独的电子邮件,然后将该行标记为“已发送”。 “耶!
但现在我需要脚本在一封电子邮件中将所有行编译成多个部分。因此,我需要脚本来检查新行,使用模板将每个新行的值添加到单个部分,将所有新部分编译成电子邮件,发送电子邮件,然后将所有新行标记为“已发送”。
我被卡住了,因为我似乎需要让每个新添加的行定义一个相对变量,即第一个未发送的行= 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,
});
}
}
}
答案 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供您参考。