【问题标题】:How to check if current submission is editing response or a new response如何检查当前提交是编辑回复还是新回复
【发布时间】:2016-09-13 17:11:08
【问题描述】:

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

如果是,该用户正在编辑之前提交的回复,而不是我想将电子表格中的值更改为“是”。

下面是我的代码的 sn-p:

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');

}

【问题讨论】:

  • 我不知道有什么完美的方法可以从表单确定提交是编辑还是新响应。我花了很多时间试图想出一些东西。我希望有办法。我将响应 ID 保存到电子表格中,并在电子表格中查找表单提交的响应 ID。因此,我知道确定它是否是编辑的唯一方法是在表单之外拥有一组数据。在您可以比较旧/新时间戳之前,编辑的时间戳会在表单数据中更新。所以你不能这样想。
  • 另外,编辑后的响应似乎放在了数据的末尾,所以无法比较当前提交的表单是否在数据的末尾。无论是新回复还是编辑过的回复,它始终位于数据的末尾。它似乎是按时间戳排序的。我认为这是 Google 表单中的一个重大缺陷。我可能会将第二组数据保存到一个文本文件中,并将其用作新旧数据的比较。
  • @SandyGood。我刚刚做了一个测试。在我的测试中,当回复被编辑时,回复不会被排序,所以编辑过的回复会保留它的位置。
  • @Rubén 把它放在哪里?显示在表格中的个别回复中?我认为个人响应如何显示在“个人响应”选项卡中,以及从数组中的 FormApp 获取数据可能是两件不同的事情。比如FormApp.getActiveForm().getResponses();,则获取返回的数组的长度,获取最后的响应。这就是您测试获得最后响应的方式吗?如果有办法获取当前响应,然后在数组中找到它的索引,并且它不是最后一个元素,那么它可能会起作用。
  • @SandyGood:对不起,我使用绑定到电子表格而不是表单的脚本进行了测试,所以我的意思是回复保留在回复表上的位置。跨度>

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


【解决方案1】:

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

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

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

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

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

/*
 *
 * 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); 
}

【讨论】:

  • 我目前正在尝试您的解决方案,我会更新任何进展
【解决方案2】:

这并不是真正的答案,而是“提醒”。我发现,如果您重新提交(编辑)未更改的数据的表单,则重新发送未更改的数据。

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

所以你选择苹果和红色并提交表单。 然后你编辑你的回复,然后选择香蕉和 35。

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

我希望/希望现在 car=null 和 age=35 但事实并非如此。 Car=red 仍然显示在目标工作表中更新的行中。

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

【讨论】:

  • 虽然确切的解决方法取决于可用的工具(例如,Javascript、Python),但在数据分析期间出现的建议解决方法(对于您提到的简单情况)将是编写一个脚本来检查对于所选分支(苹果或香蕉),并且只传递该数据(或将相关字段设置为空)。
【解决方案3】:

您可以比较响应长度与行长度(或行中的列数)。除非提交编辑/更改每个字段/响应,否则您知道它应该少于问题总数。

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 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2012-04-19
    • 2012-02-24
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多