Google apps script 在不提交表单的情况下执行onSubmit触发器

Google apps script 在不提交表单的情况下执行onSubmit触发器,google-apps-script,google-sheets,google-forms,Google Apps Script,Google Sheets,Google Forms,我创建了一个谷歌表单,链接到一张表单以捕获响应,并添加了一个每次提交表单时都会运行的应用程序脚本。运行了一系列测试,一切都很好-通过提交的onSubmit函数反馈的响应非常好。然而,昨晚我们收到了一些脚本的执行,尽管表单没有提交 查看表单上的回复页面,当我收到通知时,没有提交任何意见。而且,这在我的组织中不是一个公共形式,除了我自己,只有一个人有这个链接。他确认在执行死刑时没有提交表格 Google表单中有两个表单:1>表单响应和2>数据。数据表使用一些QUERY函数从响应表中提取数据,并对其进

我创建了一个谷歌表单,链接到一张表单以捕获响应,并添加了一个每次提交表单时都会运行的应用程序脚本。运行了一系列测试,一切都很好-通过提交的
onSubmit
函数反馈的响应非常好。然而,昨晚我们收到了一些脚本的执行,尽管表单没有提交

查看表单上的回复页面,当我收到通知时,没有提交任何意见。而且,这在我的组织中不是一个公共形式,除了我自己,只有一个人有这个链接。他确认在执行死刑时没有提交表格

Google表单中有两个表单:1>表单响应和2>数据。数据表使用一些
QUERY
函数从响应表中提取数据,并对其进行不同的格式设置(例如,在电话号码中添加连字符,以大写形式呈现某些字段等)。此外,数据表标题的标签与表单问题不同(例如,“homeAdd1”而不是“HomeAddress Line 1”)。这是因为脚本创建了一个PDF,使用表单响应替换模板Google文档上的占位符(“%homeAdd1%”)。然后脚本获取生成的PDF并通过电子邮件发送给提交者

在昨天的测试之前,一切都很顺利。当时我没有意识到这一点,但当我的同事输入随机值来测试表单时,对于家庭地址第2行,他只输入了一个5位数的邮政编码。它生成了一个PDF罚款,并通过电子邮件发送给他,但这导致
QUERY
函数呈现一个#值错误。函数如下所示:

=QUERY(Responses!L2:S,"SELECT UPPER(L) UPPER(M)...
因此,当Sheets看到一个只有5位数的单元格时,它会自动将其呈现为一个数字,
UPPER
对数字值不起作用。我(愚蠢地)没有想到将这两张纸都预先格式化为纯文本,所以出现了这种情况

链接到表单和应用程序脚本的谷歌表单上的#值错误是否会导致
onSubmit
功能失灵?这是我能看到的唯一可能导致它的东西,但它没有意义。我已经修复了格式问题,但我不知道错误的执行是否意味着其他问题

有了额外的提交,脚本一次又一次地发送最新的PDF。在20秒内,它发射了5次,每次都通过电子邮件发送最后一份PDF。查看Stackdriver日志,与我们昨天早些时候测试它时没有什么不同。
console.log
console.info
命令工作正常,它们都是由
onSubmit
功能触发的

以下是脚本:

提交功能:

已执行的函数:

函数newOne(ss、行、电子邮件){
var name=ss.getRange(第4行).getValue();
log('函数开始-'+名称);
var newType=ss.getRange(第6行).getValue();
var copyFile=DriveApp.getFileById('[file id]').makeCopy();
var copyDoc=DocumentApp.openById(copyFile.getId());
var copyBody=copyDoc.getActiveSection();
//用电子表格上的值替换变量
log('Create file start-'+name);
var newInfo=ss.getRange(第1、1、29行).getDisplayValues();
var header=ss.getRange(1,1,1,29).getDisplayValues();
就我所知,onSubmit(e)的工作方式与你期望的不一样

我认为您正在寻找的是onFormSubmit触发器,请尝试使用以下从创建脚本触发器,该触发器在每次有人向链接表单提交响应时执行:

var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("function name")
  .forSpreadsheet(sheet)
  .onFormSubmit()
  .create();
据我所知,onSubmit(e)并没有按照你期望的方式工作

我认为您正在寻找的是onFormSubmit触发器,请尝试使用以下从创建脚本触发器,该触发器在每次有人向链接表单提交响应时执行:

var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("function name")
  .forSpreadsheet(sheet)
  .onFormSubmit()
  .create();
虚假不想要的事件触发器 我遇到过来自onFormSubmit事件触发器的虚假触发器的问题。在我的情况下,它们总是在表单提交的真实触发器发生后立即出现。我发现我可以识别它们,因为我的所有必需问题都没有得到回答。我讨论了它

您可能值得花时间捕获e.values数组,看看是否可以找到一致的方法来防止它们导致处理功能失效。

虚假的意外事件触发器 我遇到过来自onFormSubmit事件触发器的虚假触发器的问题。在我的情况下,它们总是在表单提交的真实触发器发生后立即出现。我发现我可以识别它们,因为我的所有必需问题都没有得到回答。我讨论了它


可能值得您花时间捕获e.values数组,看看您是否能找到一致的方法来防止它们导致处理功能失效。

我安装了一个电子表格和相应的表单,在表单提交事件中,我经常会莫名其妙地重复。这在其他安装中不会发生。如果这是您的情况,您不能只检查事件是否为null,因为要测试它是否为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;
  }
  ...`

我安装了一个电子表格和相应的表单,在表单提交事件中经常会出现重复,这令人费解。在其他安装中不会出现这种情况。如果这是您的情况,您不能只检查事件是否为null,因为要测试它是否为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;
  }
  ...`

我以前在一次提交中多次使用过它(解决方案是等待几秒钟后返回的脚本锁),但从未见过一个完全空的onsubmit