电子邮件提醒时间驱动谷歌传播

时间:2014-09-15 12:46:26

标签: email google-apps-script

任何人都可以提供帮助。 我有一个简单的谷歌电子表格,使我能够在不同的场地,不同的时间和日期预约代表到各种课程。 我去年使用了相同的电子表格,由Bob Rashkin亲自设置!当代表预订课程时,它完美地工作并发送电子邮件,并且当课程开始9天左右时自动发送电子邮件提醒。

我已经复制了这个术语的电子表格,但是表单拒绝发送提醒电子邮件,我真的可以在这方面做一点帮助吗?

次要问题是,当脚本发送预订确认电子邮件时,它有时会发送两封电话,这会产生很多电话,询问他们是否预订了两次。

请帮助别人

这是我正在使用的提醒脚本

function Reminder() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var s=ss.getActiveSheet();
  var r1=s.getDataRange().getRow()+1;//Start past the header row!!! Doh!
  var r2=s.getDataRange().getLastRow();
  var mn,m,days,d=new Date(),coursedate=new Date(),dlen=8.64e7,i,course,r,year;//8.64e7
  var subject="Just a gentle reminder that you or colleague(s) from your setting have a Paediatric First Aid course coming up in the next week or so. ";
  var recipient, body, tail="Please be aware that Entrust (formerly Staffs Early Years) will make a charge for non attendance so"; 
  tail+=" please make sure that you familiarise yourself with the times and dates of the course. ";
  tail+="If you need help finding the venue then please follow the link below to find the venue and print off a map if required.";
  tail+="\n\nhttp://www.blithfieldsafety.co.uk/venues/";
  for (r=r1;r<=r2;r++) {
    recipient=s.getRange(r,9).getValue();    
    course=s.getRange(r, 2).getValue();      
    body=subject+"\nCourse Details\n"+course+"\n\nDelegate Name: "+s.getRange(r,4).getValue()+"\n\n"+tail; //changed (r,2) to (r,4)



    mn=course.match(/Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/)[0];
    m=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"].indexOf(mn);
    days=course.match(/(\d{1,2})(st|nd|rd|th)/g);
    year=d.getFullYear();

    for (i in days) {
      coursedate.setMonth(m);
      coursedate.setDate(days[i].slice(0,-2));
      if ((coursedate-d)/dlen<14 && s.getRange(r,16).getValue()!="mail sent") {
        GmailApp.sendEmail(recipient, subject, body);
        s.getRange(r,16).setValue("mail sent");//arbitrarily picked col 15
      }
    }
  }
};

1 个答案:

答案 0 :(得分:0)

看起来直到课程开始的剩余时间用这一行检查:

if ((coursedate-d)/dlen<14 && s.getRange(r,16).getValue()!="mail sent") {

该行正在进行日期计算,并检查单元格的值是否包含“mail sent”文本。如果单元格没有发送邮件并且日期计算为真,则会发送电子邮件。请注意,除数dlen是一个硬编码的值。

var mn,m,days,d=new Date(),coursedate=new Date(),dlen=8.64e7,i,course,r,year;//8.64e7

变量dlen的值设置为常量值8.64e7。但我猜测数学因某种原因不再适用。

dlen的值为86400000。

一天24小时,一小时60分钟,一分钟60秒。

24 * 60 * 60 =一天86,400秒。因此,显然,86,400,000的数字是一天中秒数的倍数。

我猜每个月都有新课程?

您可以在代码中添加Logger.log()语句,然后运行它以查看变量值:

Logger.log('coursedate: ' + coursedate);

如果您在代码中添加该行:

for (i in days) {
  coursedate.setMonth(m);
  Logger.log('coursedate: ' + coursedate);
  coursedate.setDate(days[i].slice(0,-2));

  Logger.log('coursedate: ' + coursedate);
  Logger.log('d: ' + d);

  if ((coursedate-d)/dlen<14 && s.getRange(r,16).getValue()!="mail sent") {

这会告诉您在进行计算时,变量coursedated的值是正确的。

然后你可以想出数学就是这样的原因。要查看Logger.log()输出,请单击查看菜单,然后选择日志菜单项。记录值列表将显示在窗口中。