Email 发送一封电子邮件,其中包含电子表格中所有新行的值(Google脚本/GAS)
多亏了在这个网站上的大量阅读,我成功地构建了一个脚本,它完成了我想要它做的事情:在运行时,脚本为电子表格中的每一行发送一封单独的电子邮件,然后将该行标记为“已发送”。耶 但现在我需要脚本在一封电子邮件中将所有行编译成多个部分。因此,我需要脚本来检查新行,使用模板将每一新行的值添加到单独的节中,将所有新节编译成电子邮件,发送电子邮件,然后将所有新行标记为“已发送” 我被卡住了,因为我似乎需要让每个新添加的行定义一个相对变量,即第一个未发送的行=sectionOne,第二个=sectionTwo,等等。但是电子邮件的长度和要定义的变量的数量将取决于新行的数量。因此,我真的不知道如何让脚本通过循环,只向电子邮件正文添加(但全部)新内容 这就是我所拥有的,有人知道如何到达目标吗Email 发送一封电子邮件,其中包含电子表格中所有新行的值(Google脚本/GAS),email,google-apps-script,Email,Google Apps Script,多亏了在这个网站上的大量阅读,我成功地构建了一个脚本,它完成了我想要它做的事情:在运行时,脚本为电子表格中的每一行发送一封单独的电子邮件,然后将该行标记为“已发送”。耶 但现在我需要脚本在一封电子邮件中将所有行编译成多个部分。因此,我需要脚本来检查新行,使用模板将每一新行的值添加到单独的节中,将所有新节编译成电子邮件,发送电子邮件,然后将所有新行标记为“已发送” 我被卡住了,因为我似乎需要让每个新添加的行定义一个相对变量,即第一个未发送的行=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设置为已发送标签列的索引。上述解决方案是针对原始问题的。