我创建了一个Google表单,链接到捕获响应的表格,并添加了每次提交表单时运行的应用程序脚本。进行了一系列测试,一切都很好 - 表单响应通过,onSubmit
功能效果很好。不过,昨晚,即使没有提交表格,我们也收到了一些脚本的执行。
查看表单本身上的响应页面,当我收到通知时,没有提交内容。另外,这不是我组织中的公开形式,只有另一个人除了我自己之外都有联系。他确认他在处决时没有提交表格。
Google表中有两张纸:1>形式响应和2>数据。数据表使用一些QUERY
功能从响应表中获取数据,以不同的方式格式化(例如,将连字符放入电话号码,在大量情况下呈现一些字段,等等(。同样,数据表标题的标签与表单问题的标签不同(例如'HomeAdd1'而不是" Home Advely Line 1"(。这是因为脚本创建了PDF,使用表单响应来替换模板Google文档上的占位符("%homeadd1%"(。然后,脚本将生成的PDF发送给提交者。
再次,直到昨天的测试都很好。当时我没有意识到这一点,但是当我的同事输入随机值测试表单时,对于家庭地址行2,他只输入了5位邮政编码。它生成了PDF罚款,还将其通过电子邮件发送给他,但这导致QUERY
功能导致#Value错误。功能看起来像这样:
=QUERY(Responses!L2:S,"SELECT UPPER(L) UPPER(M)...
因此,当床单看到只有5位数字的单元格时,它会自动将其呈现为一个数字,而UPPER
在数字值上不起作用。我(愚蠢地(并不认为将所有两张纸都视为纯文本,所以这是发生的。
Google表上的#Value错误会链接到表单和应用程序脚本引起onSubmit
函数的失火吗?这是我唯一可能会引起它的东西,但这没有意义。我已经解决了格式问题,但是我不知道错误执行是否可能意味着其他问题。
随着额外的提交,脚本刚刚一次又一次地发送了最新的PDF。在20秒内,它发射了5次,每次通过电子邮件生成的最后一个PDF。看着堆栈日志,与昨天早些时候对其进行测试时没有什么不同。 console.log
和 console.info
命令工作正常,它们都通过 onSubmit
函数触发的列表。
这是脚本:
提交功能:
function onSubmit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
var list = ss.getRange("A1:A").getValues();
var row = list.filter(String).length;
var email = ss.getRange(row,2).getValue();
var newResponse = ss.getRange(row,3).getValue();
if (newResponse == 'Generate New') {
newOne(ss,row,email);
} else if (newResponse == 'Upload Completed') {
completed(ss,row,email);
} else {
}
}
执行的功能:
function newOne(ss,row,email) {
var name = ss.getRange(row,4).getValue();
console.log('Function Start - ' + name);
var newType = ss.getRange(row,6).getValue();
var copyFile = DriveApp.getFileById('[file id]').makeCopy();
var copyDoc = DocumentApp.openById(copyFile.getId());
var copyBody = copyDoc.getActiveSection();
// Replacing variables with values on spreadsheet
console.log('Create file start - ' + name);
var newInfo = ss.getRange(row, 1, 1, 29).getDisplayValues();
var header = ss.getRange(1, 1, 1, 29).getDisplayValues();
for (var i = 1; i <= 5; i++) {
copyBody.replaceText('%' + header[0][i] + '%', newInfo[0][i].toString());
}
var x;
if (newType == 'Office 1') {
x = 6;
} else if (newType == 'Office 2') {
x = 15;
} else {
}
for (var i = x; i <= (x + 8); i++) {
copyBody.replaceText('%' + header[0][i] + '%', newInfo[0][i].toString());
}
copyBody.replaceText('%' + header[0][26] + '%', newInfo[0][26].toString());
// Create the PDF file, rename it, and delete the doc copy
copyDoc.saveAndClose();
var newFile = DriveApp.createFile(copyFile.getAs('application/pdf'));
newFile.setName('New - ' + name + '.pdf');
copyFile.setTrashed(true);
console.log('Create file finished - ' + name);
//Mails PDF to submitter
console.info('Pre-email log for ' + name);
MailApp.sendEmail(email,'Email Subject','', {
noReply: true,
htmlBody: "<body>Hello, and thank you.</body>",
attachments: [newFile]
});
console.info('Email sent for ' + name);
appFile.setTrashed(true);
}
任何见解/帮助都将不胜感激;谢谢!
josh
虚假的不需要事件触发
我遇到了来自OnFormSubmit事件触发器的虚假触发器的问题。就我而言,在提交表单中发生真正的触发后,它们总是立即出现。我发现我可以识别它们,因为没有回答我所需的问题。我在这里讨论。
可能值得您捕获e.values阵列的时间,看看是否可以找到一种一致的方法来防止它们引起您的处理功能的失火。
据我所知,onsubmit(e(无法按照您期望的方式工作。
我认为您正在寻找的是onformSubmit触发器,请尝试使用Class Everdrysheettriggerbuilder文档中的以下以下内容创建脚本触发器,该脚本触发器每当有人向您的链接表单提交响应时执行的脚本触发器:
var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("function name")
.forSpreadsheet(sheet)
.onFormSubmit()
.create();
我有一个电子表格和相应表格的安装,在该表单上,我经常重复提交事件,这是莫名其妙的。它不会在其他安装中发生。如果这是您的情况,您不能仅仅检查事件是否为null,因为要测试该事件,必须进行测试。如果不确定,您将会遇到错误。因此,如果未定义,则首先测试。尝试此代码:
`function formSubmitted(e) {
// Deal with the unusual case that this is a bogus event
if ((typeof e === "undefined") || (e == null) || (e.length == 0)) {
Logger.log("formSubmitted() received a bogus or empty event");
return;
}
...`