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

时间:2017-02-01 02:07:20

标签: forms google-apps-script google-sheets google-form

我目前有五种不同的表单连接到同一Google表格。我的最终目标是,在有人向任何表单提交回复后,他们会收到一封包含回复的电子邮件。

我知道Google表单通过回复收据具有该功能,但它不是可选的。如果我有这个功能,他们无法在不填写电子邮件的情况下提交表格(即使他们不想收据)。

我目前的代码是:

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);
}

当我有表单提交触发器时,此代码有效,但是,如果有人提交另一个表单(路由到同一个Google电子表格中的另一个工作表),它将不会向他们发送新的提交。

我在某个地方发现了一条评论,其代码如下:

function FormSubmitFunction() {
  var form = FormApp.openById('FORM ID');
 ScriptApp.newTrigger('ActivityFunction')
     .forForm(form)
     .onFormSubmit()
     .create();
}

但每次运行都会出错。

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

谢谢!

3 个答案:

答案 0 :(得分:0)

“on form submit”触发器函数传递an event,此事件又包含响应表中表单提交的范围。然后,您可以使用range.getSheet().getName()查找写入的回复表的名称,以及提交来自哪个表单。

答案 1 :(得分:0)

根据我之前的答案,我还建议您阅读event objects。我不喜欢并希望在您的代码中指出的一点是,无论您想要实现什么,以下几行都是无稽之谈:

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列。相反,通过使用事件对象,您可以获得范围通过function ActivityFunction(event)和触发器在表单提交时启动此功能,然后只访问event.range

另外,我看到很多var range = sheet.getRange(lastRow,2,1,1)所以首先,我建议在开头声明1 var,然后只为它分配新值。如果您更改变量名称等,则可以更轻松地找到问题。.getRange(lastRow,2,1,1)也与编写.getRange(lastRow,2)相同,因此您也在编写无用的代码。虽然本身不​​是问题,但它确实更容易犯错误。

答案 2 :(得分:0)

这可能会帮助您更好地理解。每当一个事件(onFormSubmit,onOpen ..etc)触发google函数时,它就会传递一个事件对象作为参数(下例中的参数“e”)。此事件对象具有可按如下所述访问的属性:https://developers.google.com/apps-script/guides/triggers/events

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

function ActivityFunction(e) {

  //Name
  var Name = e.values[2];
  //value 2 represent the second field entered in your form.

  //Email Address
  var Email = e.values[7];
  //similarly, value 7 represent the seventh field entered in your form.

  //Date
  var Day = e.values[3];

  //Time
  var ExerciseTime = e.values[4];

  //Activity
  var Activity = e.values[5];

  //Intensity
  var Intensity = e.values[6];

  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);
}

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

提交哪种表单无关紧要,它将创建一个事件对象“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();
}