我正在通过应用程序脚本使用谷歌表单。我想确定当前提交的表单是否处于编辑模式或新响应?我如何在 onSubmit 事件中检查这一点。
如果是,该用户正在编辑之前提交的响应,那么我想将电子表格中的值更改为“是”。
下面是我的代码片段:
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 Form 表单提交事件没有可以帮助了解响应是新响应还是响应编辑的字段。正如桑迪已经通过问题评论所说的那样,表单服务程序类和方法以及响应值都不包含对此有所帮助的内容。
另一方面,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);
}
这并不是真正的答案,而是一个“注意事项”。我发现,如果您重新提交(编辑)表单,则未更改的数据将按原样重新发送。
为什么这很重要?假设您的表单中有一个分支,例如您喜欢苹果还是香蕉?如果您喜欢苹果,那么下一个问题可能是您的汽车是什么颜色?假设您喜欢香蕉,那么下一个问题可能是您多大了?假设是 35。
因此您选择苹果和红色并提交表格。 然后您编辑回复并选择香蕉和 35。
重新提交表单后,新数据仍然显示 car=red 且(如预期)age=35。
我期望/希望现在 car=null 且age=35,但事实并非如此。 Car=red 仍然出现在目标表中更新的行中。
我希望这对您有用,也许有人会建议解决方法。
您可以比较响应长度与行长度(或行中的列数)。除非提交内容编辑/更改了每个字段/响应,否则您知道它应该少于问题总数。
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
}
来自 Excel 的业余爱好者 丑陋但有效,这是一个简单的版本 - 查找注释 - 选择该行,更新第二张纸上的值并删除注释。
function mody() {
const sh = SpreadsheetApp.getActiveSpreadsheet();
const mn = sh.getSheetByName('Form Responses 1');
const puty = sh.getSheetByName('putter');
var lst = mn.getLastRow();
var dd = puty.getLastRow();
dd=dd+1
//replace row with edited form response if any
for (var z = 2;z< lst+1;z++){
var nts = mn.getRange(z,2,1,6).getNotes()
var ttt = ((nts.join()).length)
if (ttt>5){
mn.getRange(z,2,1,6).clearNote() //removes the notes on the modified
row
dd = z
lst = z
}
}
puty.getRange(dd,1,1,5).setValues(mn.getRange(lst,1,1,5).getValues());
}
我看到表单中经过编辑的回复会通过谷歌脚本自动创建“注释”。
注释显示“响应者更新了此值。”
因此您可以使用函数 getNotes() 或 getNote() 检查笔记的范围。