我在特定的电子表格中有两张表格,这两张表格都附有表单提交。第一张表格/表格应该发送一封包含表格提交数据的电子邮件(原件是由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处于活动状态(如果我打开电子表格可能就是这种情况)。当然有办法解决/完成这个,我缺少什么?
答案 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?