Forms 在不同的表单提交后触发不同的Google脚本函数

Forms 在不同的表单提交后触发不同的Google脚本函数,forms,google-apps-script,google-sheets,google-forms,Forms,Google Apps Script,Google Sheets,Google Forms,我目前有五个不同的表单连接到同一个谷歌表单。我的最终目标是,在有人提交了对任何表单的回复后,他们将收到一封包含回复的电子邮件 我知道GoogleForms可以通过回复收据实现这一功能,但这不是可选的。如果我打开了这个功能,他们就不能在不填写电子邮件的情况下提交表格(即使他们不想要收据) 我目前掌握的代码是: function ActivityFunction() { var spreadsheet = SpreadsheetApp.openById("FORM ID"); Spreads

我目前有五个不同的表单连接到同一个谷歌表单。我的最终目标是,在有人提交了对任何表单的回复后,他们将收到一封包含回复的电子邮件

我知道GoogleForms可以通过回复收据实现这一功能,但这不是可选的。如果我打开了这个功能,他们就不能在不填写电子邮件的情况下提交表格(即使他们不想要收据)

我目前掌握的代码是:

function ActivityFunction() {
  var spreadsheet = SpreadsheetApp.openById("FORM ID");
  SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[4]);
  var sheet = spreadsheet.getActiveSheet();

  var lastRow = sheet.getLastRow();

  //Email Info

  //Name
  var range = sheet.getRange(lastRow,2,1,1);
  var Name = range.getValues();

  //Email Address
  var range = sheet.getRange(lastRow,7,1,1);
  var Email = range.getValues();

  //Date
  var range = sheet.getRange(lastRow,3,1,1);
  var Day = range.getValues();

  //Time
  var range = sheet.getRange(lastRow,4,1,1);
  var ExerciseTime = range.getValues();

  //Activity
  var range = sheet.getRange(lastRow,5,1,1);
  var Activity = range.getValues();

  //Intensity
  var range = sheet.getRange(lastRow,6,1,1);
  var Intensity = range.getValues();

  var msg = "Hello "+Name+"!
  Thank you for filling out today's activity form. Here are your responses.
  Name: "+Name+"\n\Date: "+Day+"\n\Time: "+ExerciseTime+"\n\Activity: "+Activity+"\n\Intensity: "+Intensity+"\n\n\Have a great day!"

  MailApp.sendEmail(Email, 
                    "Activity Form: "+Day, msg);
}
当我打开一个表单提交触发器时,这段代码可以工作,但是,如果有人使用另一个表单提交(该表单将路由到同一谷歌电子表格中的另一个工作表),它将不会向他们发送新提交的表单

我在某处发现了一条注释,其代码如下:

function FormSubmitFunction() {
  var form = FormApp.openById('FORM ID');
 ScriptApp.newTrigger('ActivityFunction')
     .forForm(form)
     .onFormSubmit()
     .create();
}
但每次它运行时我都会出错

TL;DR如何将活动电子表格设置为用户表单发送到的工作表,并触发其各自的功能


谢谢

传递“表单提交”触发函数,此事件依次包含响应表中表单提交的范围。然后,您可以使用查找所写回复表的名称以及提交内容的来源。

根据我面前的答案,我还建议您仔细阅读。我不喜欢并想在代码中指出的一点是,无论您想完成什么,以下几行都是胡说八道:

SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[4]);
var sheet = spreadsheet.getActiveSheet();
这就像给别人50美元,让他们借给你50美元。这两条线都是完全相同的

var sheet = spreadsheet.getSheets()[4]
有了这些,就这么过去了

//Email Address
var range = sheet.getRange(lastRow,7,1,1);
var Email = range.getValues();
这意味着无论使用何种形式,您都希望电子邮件地址始终位于最后一行第7列。相反,通过使用事件对象,您可以通过使用
函数ActivityFunction(event)
和触发器在表单submit上启动此函数,然后仅访问
event.range
来获取新提交的范围


此外,我还看到很多
var range=sheet.getRange(lastRow,2,1,1)
因此,首先,我建议在开始时声明1个var,然后将新值赋给它。这使得在更改变量名等时更容易发现问题,
.getRange(lastRow,2,1,1)
也与编写
.getRange(lastRow,2)
相同,因此您也在编写非必要的代码。虽然这本身不是问题,但它确实会让你更容易犯错误。

这可能会帮助你更好地理解。每当事件(onFormSubmit、onOpen..等)触发google函数时,都会将事件对象作为参数传递给它(下例中的参数“e”)。此事件对象具有如下所述可访问的属性:

提交表单时会触发下面的函数(下面是触发器设置的详细信息),我们使用values属性访问表单中提交的值(再次参考上面的链接)

现在,为了设置触发器,请确保上述代码是在接受表单的电子表格的脚本编辑器中编写的。并在表单提交时从资源>当前项目触发器>添加>来自电子表格>中为活动功能设置触发器

提交哪个表单无关紧要,它将创建一个事件对象“e”,应该包含您想要的所有细节,您不必担心访问表单以获得响应

以下代码设置触发特定于给定表单(.forForm)的特定设置,因此仅在提交该特定表单时触发,因此在提交其他表单时不会触发您的代码:

function FormSubmitFunction() {
  var form = FormApp.openById('FORM ID');
 ScriptApp.newTrigger('ActivityFunction')
     .forForm(form)  //This sets the trigger for a specific form.
     .onFormSubmit()
     .create();
}

你介意在这一点上再扩展一下吗?我对如何实施你的建议有点茫然。
function FormSubmitFunction() {
  var form = FormApp.openById('FORM ID');
 ScriptApp.newTrigger('ActivityFunction')
     .forForm(form)  //This sets the trigger for a specific form.
     .onFormSubmit()
     .create();
}