Google 表单应用程序脚本条件语句
Google Forms App Script conditional statements
我正在尝试弄清楚如何使用我现有的表单在 Google 表单中使用应用程序脚本来执行条件语句。我有一个电子邮件字段,它应该从一列(电子邮件列)中的 google sheet 值进行检查。如果在电子邮件字段中输入的内容在电子邮件的 Google sheet 列中存在,则会提示该电子邮件已存在,帮助文本也会显示类似“电子邮件已存在”的消息。如果单击警报提示的确定按钮,用户现在可以返回 Google 表单并将他们的答案编辑到电子邮件字段中,如果输入的电子邮件地址不存在于 Google sheet,没有任何反应,用户可以继续回答表单,最后提交表单。
我已经尝试过文本验证,但文本验证似乎只能回答我想用我的表单做的一部分——显示帮助文本。以下是我的工作应用程序脚本:
var sheet = SpreadsheetApp.openById("IdOfMyGoogleSheet");
function validationTest() {
var data = sheet.getRange("Form Responses 1!F2:F").getValues();
var form = FormApp.openById('formID');
var item = form.getItemById(itemID)asTextItem();;
var textValidation = FormApp.createTextValidation()
.setHelpText("Email already exist")
.requireTextContainsPattern(data)
.build();
item.setValidation(textValidation);
}
提前致谢!
首先要注意的是模式是正则表达式。您还需要使用 requireTextDoesNotMatchPattern
而不是 requireTextContainsPattern
。这是我测试过的:
function setPattern() {
// Get the firm item
const form = FormApp.openById('form ID')
const item = form.getItemById('itemID').asTextItem()
// Get the list of values
const spreadsheet = SpreadsheetApp.openById('Spreadsheet ID')
const sheet = spreadsheet.getSheetByName('Form Responses 1')
const values = sheet.getRange(1, 1, sheet.getLastRow(), 1)
.getValues()
.flat()
// Transform the values into a regex expression (pattern)
const pattern = `^(${values.map(_escapeRegex).join('|')})$`
// Contruct and set validation
const validation = FormApp.createTextValidation()
.setHelpText("Email already exist")
.requireTextDoesNotMatchPattern(pattern)
.build()
item.setValidation(validation)
}
function _escapeRegex(str) {
return str.replace(/[.*+?^${}()|[\]\]/g, '\$&')
}
请注意,这允许用户将非电子邮件地址添加到该字段,但不能重复值。
参考资料
- Is there a RegExp.escape function in JavaScript? - Answer by bobince (Stack Overflow)
- Class TextValidationBuilder (Google Apps Script reference)
- Regular expression (Wikipedia)
我正在尝试弄清楚如何使用我现有的表单在 Google 表单中使用应用程序脚本来执行条件语句。我有一个电子邮件字段,它应该从一列(电子邮件列)中的 google sheet 值进行检查。如果在电子邮件字段中输入的内容在电子邮件的 Google sheet 列中存在,则会提示该电子邮件已存在,帮助文本也会显示类似“电子邮件已存在”的消息。如果单击警报提示的确定按钮,用户现在可以返回 Google 表单并将他们的答案编辑到电子邮件字段中,如果输入的电子邮件地址不存在于 Google sheet,没有任何反应,用户可以继续回答表单,最后提交表单。 我已经尝试过文本验证,但文本验证似乎只能回答我想用我的表单做的一部分——显示帮助文本。以下是我的工作应用程序脚本:
var sheet = SpreadsheetApp.openById("IdOfMyGoogleSheet");
function validationTest() {
var data = sheet.getRange("Form Responses 1!F2:F").getValues();
var form = FormApp.openById('formID');
var item = form.getItemById(itemID)asTextItem();;
var textValidation = FormApp.createTextValidation()
.setHelpText("Email already exist")
.requireTextContainsPattern(data)
.build();
item.setValidation(textValidation);
}
提前致谢!
首先要注意的是模式是正则表达式。您还需要使用 requireTextDoesNotMatchPattern
而不是 requireTextContainsPattern
。这是我测试过的:
function setPattern() {
// Get the firm item
const form = FormApp.openById('form ID')
const item = form.getItemById('itemID').asTextItem()
// Get the list of values
const spreadsheet = SpreadsheetApp.openById('Spreadsheet ID')
const sheet = spreadsheet.getSheetByName('Form Responses 1')
const values = sheet.getRange(1, 1, sheet.getLastRow(), 1)
.getValues()
.flat()
// Transform the values into a regex expression (pattern)
const pattern = `^(${values.map(_escapeRegex).join('|')})$`
// Contruct and set validation
const validation = FormApp.createTextValidation()
.setHelpText("Email already exist")
.requireTextDoesNotMatchPattern(pattern)
.build()
item.setValidation(validation)
}
function _escapeRegex(str) {
return str.replace(/[.*+?^${}()|[\]\]/g, '\$&')
}
请注意,这允许用户将非电子邮件地址添加到该字段,但不能重复值。
参考资料
- Is there a RegExp.escape function in JavaScript? - Answer by bobince (Stack Overflow)
- Class TextValidationBuilder (Google Apps Script reference)
- Regular expression (Wikipedia)