Google 表单脚本在 6 个月后向受访者发送电子邮件

Google Forms Script sends emails to respondents 6 months later

我想要一个 Google 表单来向受访者发送邮件,但不是在它之后。我希望邮件在 6 个月后发送。 这是一封发送第二次客户满意度调查的邮件,评估我的企业的服务是否真的对长期有帮助。

我的主要问题是:我不能直接拿邮件,所以我们提交表格后它甚至不会发送邮件。

我学的是Google脚本教程,所以发图的代码这里只是为了测试代码。

function sendMap(event) {
  var map = Maps.newStaticMap().addMarker("76 pth Ave, New York");
  var mail = e.values[1];
  MailApp.sendEmail(mail, 'Map', 'See below.', {attachments:[map]});
}

我已经正确设置了项目的触发器,但每次提交表单时,我都会收到失败通知:

ReferenceError: e is not defined (ligne 35, fichier "Code")

对于基于时间的触发器,我看到了这段代码,但我什至不确定如何将它插入到我的代码中:

function myFunction() {
 // Creates a trigger that runs 5 minutes later
ScriptApp.newTrigger("myFunction")
  .timeBased()
  .after(5 * 60 * 1000) // 5 minutes plus tard
  .create();
}

预先感谢您的帮助。

ReferenceError: e is not defined (ligne 35, fichier "Code")

暗示您正在尝试手动 运行 函数,如果您的代码包含 event object, see 以获取更多信息,则无法执行此操作。

你可以给事件参数起任何名字,但是函数参数的名字和函数内部的名字必须是一样的。因此,如果您定义 sendMap(event) - 那么它也应该是 var mail = event.values[1]; 而不是 var mail = e.values[1];

您可以做的是:

  • 有一个绑定到 installable onFormSubmit 触发器的函数
  • 当新表单数据填充脚本绑定到的电子表格时,将自动调用此函数
  • 在此函数中创建触发器 - 并检索触发器的 unique Id
  • 从第一个函数中调用第二个函数,该函数将创建一个 time-driven 触发器 使用script properties保存每个触发事件对应的事件对象
  • 当您的触发函数被调用时 - 检索与触发事件对应的脚本属性
  • 执行所需的功能(例如发送电子邮件)
  • Delete old triggers鉴于允许的触发器数量有限

样本

function sendMap(event) {
  var mail = event.values[1];
  var triggerUid = event.triggerUid;
  var trigger = ScriptApp.newTrigger("myFunction")
  .timeBased()
//change to .after(6 * 30 * 24 *60 * 60 * 1000) for approx 6 month or calculate the exact date
  .after(5 * 60 * 1000) // 5 minutes plus tard
  .create();  
  var id = trigger.getUniqueId();
  PropertiesService.getScriptProperties().setProperty(id, mail);
}

function myFunction(event) {
  var id = event.triggerUid;
  var mail = PropertiesService.getScriptProperties().getProperty(id);
   var map = Maps.newStaticMap().addMarker("76 pth Ave, New York");
  MailApp.sendEmail(mail, 'Map', 'See below.', {attachments:[map]});
  PropertiesService.getScriptProperties().deleteProperty(id);
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if(triggers[i].getUniqueId() == id){
      ScriptApp.deleteTrigger(triggers[i]);
    }
  };
}