Estou criando um Formulário Google via Apps Script e preciso definir um campo para aceitar apenas números de telefone de 10 dígitos dos EUA. Encontrei esta expressão regular que funciona se eu defini-la via Form Editor: ^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$
.
Mas, novamente, preciso que isso funcione no Apps Script. Meu trecho de código é o seguinte:
let form = FormApp.create("new Order");
let phoneNumber = form.addTextItem().setTitle("Textable phone number").setRequired(true);
phoneNumber.setValidation(FormApp.createTextValidation()
.requireTextMatchesPattern("^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$")
.build());
Isso gera Exception: Invalid data updating form.
Quando eu altero para .requireTextMatchesPattern(/^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$/)
o script é executado e concluído, mas então é impossível preencher o formulário porque um número de telefone padrão gera um erro dizendomust match pattern.
Então, como posso definir um padrão de expressão regular no Apps Script que permitirá a entrada corretamente?
Escapando caracteres especiais em regexes
Essa questão se refere ao método que espera uma string
requireTextMatchesPattern()
regex em vez de um objeto. O problema é que strings e regexes Javascript usam a barra invertida para escapar certos caracteres especiais, mas nem todos os escapes têm o mesmo significado nos dois contextos.RegExp
\
Existem muitos caracteres especiais em expressões regulares , incluindo:
O regex na questão usa alguns desses caracteres literalmente, como procurar por uma instância de
+
. Para fazer isso, você deve escapar o caractere especial adicionando um\
prefixo de barra invertida. Isso é fácil de fazer quando você usa um literal de regex JavaScript , mas mais complicado quando você precisa usar um literal de string JavaScript . Notavelmente, para obter uma barra invertida real em um literal de string JavaScript, você precisa escapar dela como em\\
.Como a string regex requer barras invertidas, você precisa dobrar essas barras invertidas na string JavaScript para que elas sejam interpretadas corretamente. Para obter a string regex
^(\+0)$
, onde+
é um literal em vez de um caractere especial, você precisa usar a string JavaScript'^(\\+0)$'
.Para fazer a string regex funcionar, faça o mesmo com todos os caracteres especiais que você precisa escapar na string, assim:
Caso você não esteja trabalhando com literais de string, mas precise escapar todos os caracteres especiais de expressão regular em uma variável de string, por exemplo, na entrada recebida de um usuário, use esta função utilitária:
Veja Usando caracteres especiais em strings .
Nota: a resposta de @doubleunary está correta. Isso é para fornecer informações adicionais sobre o que está acontecendo .
Quando o script é testado, o erro
Exception: Invalid data updating form.
aparece porque o padrão é inválido.Conforme Escaping :
É por isso que mudar de
pattern
para"^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$"
em"^(\\+0?1\\s)?\\(?\\d{3}\\)?[\\s.-]\\d{3}[\\s.-]\\d{4}$"
funcionourequireTextMatchesPattern(pattern)
.Aqui está uma versão modificada do seu script que também aceita
either ########## or ###-###-####
: