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, '\$&')
}

请注意,这允许用户将非电子邮件地址添加到该字段,但不能重复值。

参考资料