确保表单提交触发器仅运行一个工作表

时间:2016-06-15 13:23:58

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

我在特定的电子表格中有两张表格,这两张表格都附有表单提交。第一张表格/表格应该发送一封包含表格提交数据的电子邮件(原件是由Amit Agarwal创建的,这里是an historic link)。第二张表格/表格没有做任何特别的事情,因为它只是从表格中收集数据。相关脚本设置为 On Form Submit 触发器。

我遇到的问题是脚本有时会从form / sheet2运行。我想指定需要触发哪个表单/表单才能运行。我创建的修改后的代码基于大量的环顾四周。这是片段:

function Initialize() {

 var triggers = ScriptApp.getProjectTriggers();

for (var i in triggers) {
ScriptApp.deleteTrigger(triggers[i]);
}

ScriptApp.newTrigger("SendConfirmationMail")
.forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
.onFormSubmit()
.create();

}

function SendConfirmationMail(e) {

try {

var ss, bcc, sendername, subject, columns;
var message, value, textbody, sender;

 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var s = ss.getSheetByName('Help Request Tickets');
 var rowNumber = s.getActiveRange().getRowIndex();
 var row = e.range.getRow();
// This is your email address and you will be in the BCC
bcc = "email", "email";

// This will show up as the sender's name
sendername = "sendername";

// Optional but change the following variable
// to have a custom subject for Google Docs emails
subject = "subject"

// This is the body of the auto-reply
message = "message"


ss = SpreadsheetApp.getActiveSheet();
columns = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];

这两条线我应该完成这个:

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Sheet1');

我认为脚本认为Sheet2处于活动状态(如果我打开电子表格可能就是这种情况)。当然有办法解决/完成这个,我缺少什么?

1 个答案:

答案 0 :(得分:2)

将为提交到电子表格的所有表单调用表格表单提交触发器。曾几何时,只有一个表单可以与电子表格相关联,但现在,可能有多个表单关联,您需要考虑这种可能性。您无法指定触发器功能的形式,但您可以检查事件的来源并做出适当的响应。

执行此操作的一种有效方法是使用 director 函数,该函数将接收所有表单提交事件,并根据收到响应的工作表将其引导至唯一的触发器函数。

在这里,我们正在关联"表单回复1"使用SendConfirmationMail(),并假设"表单回复2"有自己的表单提交处理程序handleForm2()。 (如果该表单没有处理程序,则可以删除特定情况,并且提交将以default情况结束。)

/**
 * This director function should be used as the "top level" form submission trigger
 * function for spreadsheets accepting responses from multiple forms. Events are
 * directed to the appropriate trigger sub-functions according to the name of the
 * sheet which received the current response.
 * 
 * From: https://stackoverflow.com/a/37839189/1677912
 */
function formSubmitted(e) {
  var sheetName = e.range.getSheet().getName();
  switch (sheetName) {
    case "Form Responses 1":
      SendConfirmationMail(e);
      break;
    case "Form Responses 2":
      handleForm2(e);
      break;
    default:
      // do nothing
      break;
  }
}

如果您使用表单表单提交触发器,则可以完全避免这种情况,因为目标电子表格不是直接考虑因素。

  

我认为脚本认为Sheet2处于活动状态(如果我打开电子表格可能就是这种情况)

不完全。触发器函数在任何电子表格UI的上下文之外调用,因此任何用户在电子表格中执行的操作都不会对其产生影响。相反,"活跃"工作表与正在处理的提交事件有关。无论如何,引用事件对象本身是一个更好的主意,而不是依赖于" normal"操作。测试和调试确实变得更加棘手,但并非如此。有关测试触发器功能的更多信息,请参阅How can I test a trigger function in GAS?