Forms 我的google sheets函数在从编辑器运行时执行此任务,但在表单提交触发时会给出不同的结果

Forms 我的google sheets函数在从编辑器运行时执行此任务,但在表单提交触发时会给出不同的结果,forms,google-apps-script,google-sheets,triggers,Forms,Google Apps Script,Google Sheets,Triggers,我有一个谷歌表格和一张收集回复的表格,当然这些回复总是出现在底部。我一直在使用下面的脚本将最后一个响应(始终位于响应表表单Responses 2的最后一行)复制到另一个表单All Responses的第二行。当在窗体上由触发器运行脚本时,脚本将一个空白行插入所有响应,然后将复制的值转换为空白行上方的另一行。请你帮助我,告诉我为什么和如何改变脚本,这样空白行不被添加: function CopyLastrowformresponse () { var ss = SpreadsheetApp.get

我有一个谷歌表格和一张收集回复的表格,当然这些回复总是出现在底部。我一直在使用下面的脚本将最后一个响应(始终位于响应表表单Responses 2的最后一行)复制到另一个表单All Responses的第二行。当在窗体上由触发器运行脚本时,脚本将一个空白行插入所有响应,然后将复制的值转换为空白行上方的另一行。请你帮助我,告诉我为什么和如何改变脚本,这样空白行不被添加:

function CopyLastrowformresponse () {
var ss = SpreadsheetApp.getActive();
var AR = ss.getSheetByName("All Responses");
var FR = ss.getSheetByName("Form responses 2");
var FRlastrow = FR.getLastRow();

AR.insertRowBefore(2);
FR.getRange(FRlastrow, 1, FRlastrow, 22).copyTo(AR.getRange("A2"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  }

这里可能会发生一些事情

你得到的行数等于FRlastrow,而我认为你只想得到一行。 应用程序脚本具有onFormSubmit触发器的错误行为,因此您可能需要检查重复的触发器,请参阅。 脚本未充分利用onFormSubmit提供的。具体来说,您可以使用e.values,这是相同的数据,而不是从一张图纸中获取最后一行。 我会将脚本更改为如下内容:

function CopyLastrowformresponse (e) {
  if (e.values && e.values[1] != "") { // assuming e.values[1] (the first question) is required
    SpreadsheetApp.getActive()
      .getSheetByName("All Responses")
      .insertRowBefore(2)
      .getRange(2, 1, 1, e.values.length)
      .setValues([e.values]);
  }
}
但是,最终,如果你想做的只是简单地颠倒结果的顺序,那么我会完全放弃应用程序脚本,只使用函数

=SORT('Form responses 2'!A:V, 'Form responses 2'!A:A, FALSE)

是的,重复触发器是我的第一个想法,但似乎不是问题所在。我只需要将复制的单元格设置为值,这样它们就可以更改,这样排序就不会对我起作用。我会尝试你的建议-谢谢你只是补充。。。我需要将值从“响应2”复制到“所有响应”,而不仅仅是在同一个服务器上sheet@RogerPollard正当我的脚本版本基本上就是这么做的。这不是重新排列工作表上的值。@RogerPollard“Responses 2”上的值是否与表单响应完全相同,或者是否已被修改?是的,重复触发器是我的第一个想法,但似乎不是问题:您确定吗?“问题跟踪程序”中当前存在关于提交重复表单的问题。你的问题可能与此有关。另外,正如@Diego所说,我认为您不希望复制的行数等于FRlastrow,而是1。这有什么原因吗?