Google 表格 - 带有动态消息标签的电子邮件

Google Sheets - email with dynamic message tags

我正在使用 Google Sheet 发送电子邮件通知(Google 表单不是此处的选项)。我的消息文本有问题。

本质上,电子表格根据用户数据添加了新行。它添加了五列:

目标是电子表格随后向每个学生发送一封电子邮件,告诉他们在哪里报告。它应该只向每个学生发送一次电子邮件,但对于每封电子邮件,姓名、学院教师和请求教师字段应该是动态的。

有效方法: 如果您只有一行数据(或 行),它会发送正确的信息,并且他们收到通知的日志。无论是向一个人还是多人(一个新行或许多人)发送电子邮件,它至少会发送一条消息,并记录该消息已发送。

什么不起作用:如果您有不止一行的新数据,它会向所有人发送电子邮件,但姓名、学院教师和请求教师变量在每封电子邮件中仅引用第一行新数据。所以,Harry、Seamus 和 Hermione 都收到了电子邮件到他们正确的地址,但是电子邮件的文本都是相同的,并且反映了 Harry 的会面,而不是每个人都是动态的。同样,如果只添加了一个新行,则不存在此问题。

我不想使用 onEdit 标签,我知道这可以解决问题。数据输入错误时有发生,人们可能会改变主意。我宁愿将功能设置为每 10 分钟触发一次。

这是我根据我见过的其他编码拼凑而成的代码:

function SendEmail() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet1=ss.getSheetByName('ConcatenatedReport');
var subject = sheet1.getRange(2,7).getValue();
var message = sheet1.getRange(2,9).getValue();
var n=sheet1.getLastRow();
for (var i = 2; i < n+1 ; i++ ) {
var name=sheet1.getRange(i,1).getValue();
var teacher=sheet1.getRange(i,4).getValue();
var instructor=sheet1.getRange(i,3).getValue();
var teacher1=sheet1.getRange(i,4).getValue();
var emailAddress = sheet1.getRange(i,5).getValue();
var emailstatus = sheet1.getRange(i,6).getValue();
if(emailstatus == ""){ 
message=message.replace("<name>",name).replace("<teacher>",teacher).replace("<instructor>",instructor).replace("<teacher1>",teacher1);
MailApp.sendEmail(emailAddress, subject, message);
sheet1.getRange(i,6).setValue("Notified");}}}

通知值使我们不会一遍又一遍地向同一个人发送电子邮件。留言内容如下:

Hello name variable, This email is to inform you that you have an appointment with one of your professors (teacher variable), during your next homeroom class. Check in with your homeroom professor (instructor variable) immediately after your third hour, then go straight to teacher1 variable's room as soon as you're told to do so.

我哪里错了?我如何让电子邮件适合每个学生?

PS - 我也非常喜欢在电子邮件中只使用他们的名字,而不是姓氏、名字、中间名。有什么办法吗?我的编码技能很弱,所以有很多我不知道。非常感谢任何帮助!

我相信你的目标如下。

  • 您想通过检索单元格“A2:F”中的值来发送电子邮件。并且,当“F”列为空时,您想发送电子邮件。

在这种情况下,下面的修改脚本怎么样?

修改后的脚本:

function SendEmail() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet1 = ss.getSheetByName('ConcatenatedReport');
  var [subject,,message] = sheet1.getRange(2, 7, 1, 3).getValues()[0];
  var lastRow = sheet1.getLastRow();
  var values = sheet1.getRange("A2:F" + lastRow).getValues();
  values.forEach(([name,,instructor,teacher,emailAddress,emailstatus]) => {
    if (emailstatus == "") {
      var temp = message;
      var teacher1 = teacher;
      temp = temp.replace("<name>", name).replace("<teacher>", teacher).replace("<instructor>", instructor).replace("<teacher1>", teacher1);
      MailApp.sendEmail(emailAddress, subject, temp);
    }
  });
  sheet1.getRange("F2:F" + lastRow).setValue("Notified");
}
  • 在您的脚本中,message=message.replace("<name>",name)...message 被第一个循环覆盖。这样,在第二个循环之后,messaeg 不会更新。我认为这可能是您遇到问题的原因。
  • 而且,当使用getValues时,工艺成本会变低。

参考文献:

你快到了

function SendEmail() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet1=ss.getSheetByName('ConcatenatedReport');
var data = sheet1.getDataRange().getValues();
var subject = data[1][6]
//var message = sheet1.getRange(2,9).getValue();
 for (i=1; i<data.length; i++) {
  if(data[i][5] == ""){ 
     message="Hello " + data[i][1]+", This email is to inform you that you have an appointment with one of your professors " + data[i][2]+", during your next homeroom class. Check in with your homeroom professor " + data[i][3]+" immediately after your third hour, then go straight to " + data[i][4]+"'s room as soon as you're told to do so.";
     MailApp.sendEmail(data[i][4], subject, message);
     sheet1.getRange((i+1),6).setValue("Notified");
  }
 }
}