如何从同一onFormSubmit触发器获取多个不需要的事件块?

时间:2019-02-22 20:40:43

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

我今天早上创建了一个一个问题表格,因为我想亲自看看事件块。但是,这个过程对我来说是出乎意料的。我的描述如下:

我正在使用以下代码记录onFormSubmit事件:

function testFormSubmission(e) {
  var lock=LockService.getUserLock();
  try{
      if(lock.tryLock(30000)) {
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getSheetByName('LogSheet');
      var tA=[Utilities.formatDate(new Date(), Session.getScriptTimeZone(),"d/M/yyyy HH:mm:ss")];
      tA=tA.concat(e.values);
      tA.splice(tA.length-1,1,e.triggerUid,e.range.rowStart,e.range.columnEnd,JSON.stringify(e.values));
      sh.appendRow(tA);
      lock.releaseLock();
    }
  }
  catch (e){throw("Couldn\'t get lock for 30 seconds");return;};
}    

我下面有两个电子表格图像:

实际上e.value中只有两列,一列是日期,一列是问题的答案,即“绿色”或“蓝色”。空白列来自以下事实:我先提出三个问题并收集电子邮件,但为了简化起见决定删除其中两个,因为我自己生成了提交。

无论如何,都不应该在C列中包含绿色或蓝色的答案。 J列只是JSON.stringify(e.values),似乎表明e的值不正确在里面...我想吗?是/否

这是电子表格的图像。 (其中一些)

这是表单响应1表:

enter image description here

这是LogSheet:

enter image description here

  
    

所以我的问题很简单,日志表中多余的附加行是从哪里来的?

  

我更新了标题问题,因为我认为我不会收到多次提交,否则我希望在Form Responses 1工作表中有多行。

对于您的信息,LogSheet中的columnH是rowStart,因此很容易找出Form Response 1中的哪一行相关。

2 个答案:

答案 0 :(得分:7)

获取虚假的onFormSubmit触发器

@ J.G。指出每次提交表单,我得到的不仅仅是一个触发器。

通过将e.values记录到电子表格中,我注意到我没有得到任何答案。因此,为了消除这些不必要的触发器,我只使用了以下逻辑。

if(e.values && !e.values[1]){return;},其中e.values[1]是必填问题。

我的日志:

enter image description here

C列中没有值的行是不需要的触发器。

答案 1 :(得分:0)

我认为您的代码证明了某些触发器是虚假的和不需要的,因此Google不应生成这些触发器。我针对类似问题向Google提交了反馈项目。

在不需要的触发器中,我仅获取e.range.getRow()来确定更改了哪一行,然后转到该行进行所需的计算。在我的情况下,该行包含所有虚假触发器的正确​​信息(可能是因为第一个正确地将数据记录在电子表格中)。

您的代码是阻止代码运行的强大后盾,但是我有太多的表格和触发器要介绍。将这些代码放在所有这些地方会很痛苦。希望Google能够尽快解决此问题,并且不会再出现任何虚假触发器。