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]);
}
};
}
我想要一个 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]);
}
};
}