首页 > 解决方案 > 保存 Google 表单响应 URL - 逻辑问题

问题描述

此脚本旨在将编辑响应 URL 保存到响应表 - 此脚本的触发器设置为在表单提交上运行。它在大多数情况下运作良好。

我遇到的问题是一旦用户编辑他们的响应并点击提交,这个脚本就会运行并覆盖最后一行的编辑响应 URL。

现在才遇到这个问题,没有太多时间想解决办法。想在这里提出这个问题,因为这似乎是一个相当有趣的逻辑挑战。

这是我正在使用的脚本:

function onFormSubmit(e) {
var editResponseURL = FormApp.getActiveForm().getResponse(e.response.getId()).getEditResponseUrl();
var sheet = SpreadsheetApp.openById("SHEET_ID_HERE").getSheetByName("Form responses 1");
    sheet.getRange(sheet.getLastRow(), sheet.getLastColumn(), 1, 1).setValue(editResponseURL);
    }

我解决这个问题的想法是找到一个独特的识别价值。可能像时间戳和电子邮件地址这样的东西来生成一个唯一的键来搜索行,如果找到,则设置编辑响应 URL 的值。(例如,如果值为 null,则只需写入最后一行 - 例如,当完成新提交时。)

我将继续用新的想法更新这篇文章。有兴趣了解社区有什么想法。

更新:向脚本添加了一些新逻辑 - 它解决了上述问题。遗憾的是,它仍然无法工作,因为 Google App Script 的表单提交触发器不可靠。(在某些情况下触发器将无法触发而没有错误警告。)*

这是更新的脚本。(希望这对将来的某人有所帮助。)

function onFormSubmit(e) {

var recordExists = false;

var editResponseURL = FormApp.getActiveForm().getResponse(e.response.getId()).getEditResponseUrl();

var sheet = SpreadsheetApp.openById("SPREADSHEET_ID_HERE").getSheetByName("Form responses 1");
var responseURLs = sheet.getRange(2, sheet.getLastColumn(), sheet.getLastRow(), 1).getValues();

for (var i = 0; i < responseURLs.length; i++){
if (responseURLs[i].indexOf(editResponseURL) !== -1){
recordExists = true
break;
}

}

if(recordExists === false){
sheet.getRange(sheet.getLastRow(), sheet.getLastColumn(), 1, 1).setValue(editResponseURL);
}
else {sheet.getRange(i +2, sheet.getLastColumn(), 1, 1).setValue(editResponseURL);
}
}

标签: javascriptgoogle-apps-script

解决方案


我能够使用以下代码解决逻辑问题。

function onFormSubmit(e) {

var recordExists = false;

var editResponseURL = FormApp.getActiveForm().getResponse(e.response.getId()).getEditResponseUrl();

var sheet = SpreadsheetApp.openById("SPREADSHEET_ID_HERE").getSheetByName("Form responses 1");
var responseURLs = sheet.getRange(2, sheet.getLastColumn(), sheet.getLastRow(), 1).getValues();

for (var i = 0; i < responseURLs.length; i++){
if (responseURLs[i].indexOf(editResponseURL) !== -1){
recordExists = true
break;
}

}

if(recordExists === false){
sheet.getRange(sheet.getLastRow(), sheet.getLastColumn(), 1, 1).setValue(editResponseURL);
}
else {sheet.getRange(i +2, sheet.getLastColumn(), 1, 1).setValue(editResponseURL);
}
}

请注意,此解决方案仍然存在问题。在尝试获取“最后一行”时,表单写入输出表之间的延迟可能会导致问题。

当我想出更好的解决方案时会更新这个答案。


推荐阅读