首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保表单提交触发器只运行一个工作表

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

Stack Overflow用户
提问于 2016-06-15 13:23:57
回答 1查看 708关注 0票数 1

我在一个特定的电子表格中有两个表格,它们都有与它们相关的表单提交。第一个表单/表单应该发送一封包含表单提交数据的电子邮件(原始表单是由Agarwal创建的,这里是一个历史性的环节)。第二个表单/工作表没有做什么特别的事情,因为它只是从表单中收集数据。所讨论的脚本被设置为On表单提交触发器。

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

代码语言:javascript
复制
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];

我认为这两行应该能做到这一点:

代码语言:javascript
复制
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Sheet1');

我认为脚本认为Sheet2是活动的(如果打开电子表格,情况可能是这样)。肯定有办法解决/完成这件事,我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-06-15 15:05:16

对于提交给电子表格的所有表单,都将调用Sheets表单提交触发器。很久以前,只有一个表单可以与电子表格相关联,但是现在,由于可能存在多个表单关联,您需要允许这种可能性。您不能指定触发器函数用于哪个表单,但是可以检查事件的源并作出适当的响应。

这样做的一种有效方法是使用指导函数,它将接收所有表单提交事件,并根据收到响应的工作表的不同,将它们定向到唯一的触发函数。

这里,我们将“表单响应1”与SendConfirmationMail()相关联,并假设“表单响应2”有自己的表单提交处理程序handleForm2()。(如果没有该表单的处理程序,则可以删除特定的情况,提交的结果将在default情况下结束。)

代码语言:javascript
复制
/**
 * 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的上下文之外调用的,因此任何用户在电子表格中所做的操作都不会对其产生任何影响。相反,“活动”工作表与正在处理的提交事件相关。无论如何,引用事件对象本身是一个更好的主意,而不是依赖“正常”操作。测试和调试确实变得更加困难,但并不是非常困难。有关测试触发器函数的更多信息,请参见如何测试气体中的触发功能?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37836780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档