【问题标题】:Google Sheets - email with dynamic message tagsGoogle 表格 - 带有动态消息标签的电子邮件
【发布时间】:2021-09-22 05:28:56
【问题描述】:

我正在使用 Google 表格发送电子邮件通知(此处不提供 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");}}}

Notified 值可防止我们一遍又一遍地向同一个人发送电子邮件。消息内容如下:

您好name variable,这封电子邮件是为了通知您,在您的下一个班主任课程期间,您与一位教授(teacher variable)有约会。在第三个小时后立即与您的班主任教授(instructor variable)签到,然后在接到通知后立即前往teacher1 variable 的房间。

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

PS - 我也非常希望在电子邮件中只使用他们的名字,而不是 Last, First Middle。有没有办法做到这一点?我的编码技能很弱,所以我不知道很多。非常感谢任何帮助!

【问题讨论】:

    标签: email google-apps-script google-sheets google-sheets-formula


    【解决方案1】:

    我相信你的目标如下。

    • 您希望通过从单元格“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("&lt;name&gt;",name)...message 被第一个循环覆盖。这样,在第二次循环之后,messaeg 不会更新。我认为这可能是您的问题的原因。
    • 而且,当使用getValues 时,处理成本会降低。

    参考资料:

    【讨论】:

      【解决方案2】:

      你快到了

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

      【讨论】:

      • 谢谢你,这很好用!不过,我又遇到了一个错误。我使用公式根据 A2:A 中提供的名称从电子邮件目录中查找 E2:E 中的电子邮件地址。我尝试将第 8 行更改为: if(AND(data[i][5] == "",NOT(isblank(data[i][0])))){ ,但这带来了一个“AND is not defined “ 错误。我也试过 if(AND(data[i][5] == "",data[i][0"")){ ,但这导致了意外的令牌错误。
      • if(AND(data[i][5] == "",NOT(isblank(data[i][0])))) 在 appscript 中不起作用。它将在工作表中工作。您必须使用 && 而不是 AND ---- 例如 if(data[i][5] == "" && data[i][0] !=="" ) { do something} 将起作用。如果您可以共享具有公共编辑权限的工作表链接,我可以轻松为您提供解决方案。您需要的是工作表中的查找公式。或者您想在应用程序脚本中执行此操作,您需要一个 for 循环来查找电子邮件地址。我不确定
      猜你喜欢
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多