如何检查当前提交是编辑响应还是新响应

How to check if current submission is editing response or a new response

我正在通过应用程序脚本处理 google 表单。我想确定当前提交的表单是处于编辑模式还是新响应?我如何在 onSubmit 事件中检查它。

如果是,则该用户正在编辑之前提交的回复,我想将我的价差 sheet 中的值更改为 "yes"。

下面是我的代码片段:

function testExcel2() {

  var email = "email";
  var s = SpreadsheetApp.openById("id");
  var sheet = s.getSheets()[0];
  var headers = sheet.getRange(1,1,1,sheet.getLastColumn() - 1).getValues()[0]; 
  var datarow = sheet.getRange(sheet.getLastRow(),1,1,sheet.getLastColumn() - 1).getValues()[0];
  var message = "";

  for(var i in headers)
  {
    message += "" + headers[i] + " : " + datarow[i] + "\n\n";
  }

  MailApp.sendEmail(email, "Submitted Data Test", message); 

  var af = FormApp.getActiveForm();
  //af.setCustomClosedFormMessage("The form is currently processing a submission, please refresh the page.");
  af.setConfirmationMessage('Thanks for responding!')
  //af.setAcceptingResponses(false);
  var rowKey = "o" + sheet.getLastRow();
  var editCell = sheet.getRange(rowKey).setValue('no');

}

Google 表单表单提交事件没有可以帮助了解响应是新响应还是响应编辑的字段。正如 Sandy 已经通过问题评论所说,Form Servicer 类 和方法,以及响应值都不包含对此有帮助的内容。

另一方面,Google 表格提交事件有一个范围字段可以提供帮助。以下脚本绑定到 Google 电子表格记录响应行:

function onFormSubmit(e){
  var response = e.range;
  Logger.log(response.getRow());
}

以上内容可用于保持更新的列以保存修订计数器。如果相应的单元格为空,则响应为新响应,否则为响应编辑。

以下脚本将其绑定到接收表单响应的电子表格。它需要一个表单提交可安装触发器。其他改编说明包含在脚本注释中。

/*
 *
 * Global Variables
 *
 */

/*
 * Sheet name used as destination of the form responses
 */
var sheetName = 'Form Responses';

/*
 * Name of the column to be used to hold the response revision counter 
 * It should match exactly the header of the related column, 
 * otherwise it will do nothing.
 */
var revisionsColumn = 'Rev';

/*
 * Responses starting row
 */
var startRow = 2;

function setRevisionCounts(e){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues(); 
  var revisionsIndex = headers[0].indexOf(revisionsColumn);
  var data = sheet.getDataRange().getValues();
  var response = e.range;
  var rowIndex = response.getRow()-1;
  var rev = data[rowIndex][revisionsIndex]+1;
  sheet.getRange(rowIndex+1, revisionsIndex+1).setValue(rev); 
}

这不是真正的答案,而是 'heads up'。我发现如果您重新提交(编辑)一个表单,则未更改的数据将被原封不动地重新发送。

为什么这很重要?假设您的表单中有一个分支,例如您喜欢苹果还是香蕉?如果你喜欢苹果,那么下一个问题可能是你的车是什么颜色的?假设 'red' 如果你喜欢香蕉,下一个问题可能是你多大了?假设 35.

因此您选择苹果和红色并提交表格。 然后您编辑回复并选择香蕉和 35。

重新提交表单时,新数据仍然显示 car=red 并且(如预期的那样)age=35。

我会 expect/hope 现在 car=null 和 age=35 但事实并非如此。 Car=red 仍然出现在目标 sheet.

中更新的行中

我希望这对您有用,也许有人会建议解决方法。

您可以比较响应长度与行长度(或行中的列数)。除非提交 edits/changes 每 field/response 那么你知道它应该少于问题总数。

function onFormSubmit(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()

const response = (e.range)
const responseValues = response.getValues()
const responseRow = Number(response.getRow())

const rowValues = sheet.getRange(responseRow, 1, 1, sheet.getLastColumn()).getValues()


if(responseValues.length < rowValues.length){
//edited submission
}else{
//likely new submission 
}