Google apps script 为什么forSpreadsheet(ss).onFormSubmit()触发器会运行太多次(即多次=7)
我对google脚本非常陌生(对stackoverflow也相当陌生),所以请原谅给我带来的不便 我修改了这个指南,最后在底部找到了代码 我的最终目标是简单地接收一些数字,对它们进行计算,并从不同的用户返回一些数字 在代码中,我使用电子表格并创建表单,当提交响应时,代码应向用户返回电子邮件。一切正常,但发送了7封电子邮件,而不是1封 我简化了代码,它每次发送相同的电子邮件,但在这个更容易阅读的版本中,仍然发送相同的电子邮件(发送7封电子邮件) 提前谢谢Google apps script 为什么forSpreadsheet(ss).onFormSubmit()触发器会运行太多次(即多次=7),google-apps-script,Google Apps Script,我对google脚本非常陌生(对stackoverflow也相当陌生),所以请原谅给我带来的不便 我修改了这个指南,最后在底部找到了代码 我的最终目标是简单地接收一些数字,对它们进行计算,并从不同的用户返回一些数字 在代码中,我使用电子表格并创建表单,当提交响应时,代码应向用户返回电子邮件。一切正常,但发送了7封电子邮件,而不是1封 我简化了代码,它每次发送相同的电子邮件,但在这个更容易阅读的版本中,仍然发送相同的电子邮件(发送7封电子邮件) 提前谢谢 function onOpen() {
function onOpen() {
var menu = [{name: 'Set up conference', functionName: 'setUpConference_'}];
SpreadsheetApp.getActive().addMenu('Butten', menu);
}
function setUpConference_() {
if (ScriptProperties.getProperty('calId')) {
Browser.msgBox('Your conference is already set up. Look in Google Drive!');
}
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName('but');
var range = sheet.getDataRange();
var values = range.getValues();
setUpForm_(ss, values);
ScriptApp.newTrigger('onFormSubmit').forSpreadsheet(ss).onFormSubmit()
.create();
ss.removeMenu('Butten');
}
function setUpForm_(ss, values) {
var form = FormApp.create('Conference Form');
var header = form.addSectionHeaderItem().setTitle('Bilgileriniz');
form.addTextItem().setTitle('Name').setRequired(true);
form.addTextItem().setTitle('Email').setRequired(true);
form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId());
var header = form.addSectionHeaderItem().setTitle('Pratik notlariniz');
for (var i = 1; i < values.length; i++) {
var session = values[i];
var ders = session[0].toString();
var item = form.addTextItem().setTitle(ders);
var textValidation = FormApp.createTextValidation()
.setHelpText('0 le 100 arasinda bir sayi olmali')
.requireNumberBetween(0, 100)
.build();
item.setValidation(textValidation);
}
}
function onFormSubmit(e) {
MailApp.sendEmail({
to: 'exp@gmail.com',
subject: 'exp',
body: 'exp'});
}
函数onOpen(){
var菜单=[{name:'设置会议',functionName:'设置会议}];
SpreadsheetApp.getActive().addMenu('Butten',菜单);
}
功能设置会议(){
if(ScriptProperties.getProperty('calId')){
Browser.msgBox('您的会议已经设置好。请在Google Drive中查找!');
}
var ss=SpreadsheetApp.getActive();
var sheet=ss.getSheetByName('but');
var range=sheet.getDataRange();
var values=range.getValues();
设置格式(ss、值);
ScriptApp.newTrigger('onFormSubmit')。用于预览表(ss).onFormSubmit()
.create();
ss.移除菜单(“Butten”);
}
函数设置表单(ss,值){
var form=FormApp.create(“会议形式”);
var header=form.addSectionHeaderItem().setTitle('Bilgileriniz');
form.addTextItem().setTitle('Name').setRequired(true);
form.addTextItem().setTitle('Email').setRequired(true);
form.setDestination(FormApp.DestinationType.SPREADSHEET,ss.getId());
var header=form.addSectionHeaderItem().setTitle('Pratik notlariniz');
对于(变量i=1;i功能设置会议({
var ss=SpreadsheetApp.getActive();
var triggerId=ScriptApp.newTrigger(“onFormSubmit”)
.前页(ss)
.onFormSubmit()
.create()
.getUniqueId();
Logger.log(“新ID:+triggerId”);
var allTriggers=ScriptApp.getProjectTriggers();
对于(var i=0;i
可能是因为您没有检查“设置会议”菜单选项被单击的次数。您可以添加此检查,或者在创建新的表单之前删除onFormSubmit
触发器。请注意,表单提交触发器不指定哪个表单发送了数据,只指定哪个电子表格接收了数据。因此,您只需要一个onsubmit触发器(尽管您可能需要逻辑来确定调用哪个相关方法来处理特定的表单响应)。还要注意的是,即使您的电话会议已经设置好,您仍然会为它创建一个新的触发器。谢谢你们两位,可能是因为我不熟练,我只能实现@Kos建议的想法。然而,尽管我在添加新触发器之前在链接中添加了代码,但触发器的数量并不完全是1。我的第一次试用向我发送了4封电子邮件,然后我从编辑>所有触发器中手动删除触发器,现在我没有收到任何电子邮件。有没有一个一劳永逸的办法来解决这个问题?我甚至不需要花哨的菜单选项。如果失败了,我将尝试将数据硬编码到代码中,并直接在谷歌表单上实现它。而不是像这里这样从表格中获取数据。感谢ScriptApp.getProjectTriggers
目前没有为其他用户检索触发器:因此,您的代码仍然可以为同一事件创建多个触发器。
function setUpConference_() {
var ss = SpreadsheetApp.getActive();
var triggerId = ScriptApp.newTrigger("onFormSubmit")
.forSpreadsheet(ss)
.onFormSubmit()
.create()
.getUniqueId();
Logger.log("New ID: "+triggerId);
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
if (allTriggers[i].getUniqueId() != triggerId) {
Logger.log("Delete ID: "+allTriggers[i].getUniqueId());
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
ss.toast("already done.", "TriggerBuilder");
}