我在一个特定的电子表格中有两个表格,它们都有与它们相关的表单提交。第一个表单/表单应该发送一封包含表单提交数据的电子邮件(原始表单是由Agarwal创建的,这里是一个历史性的环节)。第二个表单/工作表没有做什么特别的事情,因为它只是从表单中收集数据。所讨论的脚本被设置为On表单提交触发器。
我遇到的问题是,脚本有时从表单/sheet2 2运行。我想指定脚本需要从哪个工作表/表单上触发才能运行。我创建的修改代码是基于大量的环顾四周。下面是片段:
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是活动的(如果打开电子表格,情况可能是这样)。肯定有办法解决/完成这件事,我错过了什么?
发布于 2016-06-15 15:05:16
对于提交给电子表格的所有表单,都将调用Sheets表单提交触发器。很久以前,只有一个表单可以与电子表格相关联,但是现在,由于可能存在多个表单关联,您需要允许这种可能性。您不能指定触发器函数用于哪个表单,但是可以检查事件的源并作出适当的响应。
这样做的一种有效方法是使用指导函数,它将接收所有表单提交事件,并根据收到响应的工作表的不同,将它们定向到唯一的触发函数。
这里,我们将“表单响应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的上下文之外调用的,因此任何用户在电子表格中所做的操作都不会对其产生任何影响。相反,“活动”工作表与正在处理的提交事件相关。无论如何,引用事件对象本身是一个更好的主意,而不是依赖“正常”操作。测试和调试确实变得更加困难,但并不是非常困难。有关测试触发器函数的更多信息,请参见如何测试气体中的触发功能?。
https://stackoverflow.com/questions/37836780
复制相似问题