【问题标题】:Ensure form submission trigger runs only one sheet确保表单提交触发器只运行一张表
【发布时间】:2016-06-15 13:23:57
【问题描述】:

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

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

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 处于活动状态(如果我打开电子表格可能就是这种情况)。当然有办法解决/完成这个,我错过了什么?

【问题讨论】:

  • Amit 更新了最初包含该代码的博客条目,现在它描述了安装和使用他的 Google 表单插件。回程机器中该帖子的最旧版本有代码,不过:here

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


【解决方案1】:

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

一种有效的方法是使用 director 函数,该函数将接收所有表单提交事件,并根据收到响应的工作表将它们定向到唯一的触发器函数。

在这里,我们将“Form Responses 1”与SendConfirmationMail()相关联,并假设“Form Responses 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;
  }
}

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

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

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

【讨论】:

  • 谢谢你 - 这非常有帮助
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2021-07-04
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
相关资源
最近更新 更多