我有一个带有附加 Google Apps 脚本的 Google 表单,我正在其中进行一些高级表单验证,这是 Google 内置验证无法实现的。 问题是,无论脚本内发生什么,响应都会被记录。 脚本是否可以阻止表单提交? 类似于 Javascript 中的
event.preventDefault()
?
更新:这个问题可能没有实际意义,因为我的自定义验证依赖于能够向用户显示一些模式或消息,就像在 GAS for Sheets 中一样。 但显然,Google Forms 不支持这一点。 我会把这个问题留一天,因为我仍然好奇这是否可能。
谢谢大家的评论。 我想结束这个问题,但显然我不能单方面这样做。
无论如何,答案似乎是没有办法阻止以编程方式提交表单,而且,甚至没有任何方法可以向用户显示消息或警报,因此无法在外部进行自定义验证Google 的内置且相当基本的验证。
我正在寻找相同的内容,不幸的是,如果验证失败,则无法向用户显示消息。显然,Google Forms 不支持使用 Javascript 显示弹出窗口的方法,就像 Google Sheet 在 App Script 中所做的那样,如文档中所写:
请注意,在 Google 表单中,用户界面元素仅对以下人员可见 打开表单进行修改的编辑者,而不是打开表单的用户 表格进行回复。虽然无法阻止数据的提交,但
可以在发布新数据后将其删除。我有一个 Google 表单,要求输入一个我不想在提交之间重复的号码;在溢出菜单>脚本编辑器我添加了下面的应用程序脚本:
function onFormSubmit(e) {
// Get the form and its associated spreadsheet
var form = FormApp.getActiveForm();
var destination = form.getDestinationId();
var spreadsheet = SpreadsheetApp.openById(destination);
var sheet = spreadsheet.getSheetByName('TheNameOfTheSheetWhereTheFormAddItsData');
// Get the values from the current submission
var response = e.response;
var itemResponses = response.getItemResponses();
// Find the third module number item (adjust index if needed)
var moduleNumberResponse = itemResponses[2];
var moduleNumber = moduleNumberResponse.getResponse();
console.log('moduleNumber = ' + moduleNumber);
// Get all existing numbers in column B (where my duplicated number could be)
var lastRow = sheet.getLastRow();
var data = sheet.getRange('B2:B' + (lastRow - 1)).getValues();
console.log('data = ' + data);
// Flatten the 2D array and remove empty cells
var existingNumbers = data.flat().filter(function(num) {
return num !== '' && num !== null;
});
console.log('existingNumbers = ' + existingNumbers);
// Check if the number already exists
if (existingNumbers.includes(Number(moduleNumber))) {
// Delete the last row (the duplicate submission)
sheet.deleteRow(lastRow);
console.log('Duplicate!');
// Unfortunately, it works only for the "next" load of the form page :-(
// form.setConfirmationMessage('Duplicate!');
} else {
console.log('Correct!');
// Unfortunately, it works only for the "next" load of the form page :-(
// form.setConfirmationMessage('Correct!');
}
}
然后,在 Apps 脚本中,您必须通过选择 module 作为事件源并选择 on form Submit 作为事件类型,将其分配给 new Activator。 提供权限后,如果用户提交重复的数字(即验证条件失败),新数据(最新行)实际上会被删除。
但是,不会向用户显示任何消息(正如您在代码中看到的,只能更改页面的next刷新的确认消息)...所以您要么必须发送一封电子邮件(其中我不想)或者 Google Forms 不是此范围的工具。