Skip to main content
Solved

Data validation with phone numbers. Adding north american area code automatically?


Hey Community!


Here’s my problem: I have users adding phone numbers to records. Problem is, the way the are inputting records doesn’t allow me to have Data validation. I need the number they input in a specific format, and I was hoping there might be a formula that could do this.


Format we need: 1 (XXX) XXX-XXXX


Inputs we might get (because users make mistakes) =



  • 1 xxx xxx xxxx

  • xxx xxx xxxx

  • xxxxxxxxxx

  • 1 (xxx) xxx xxxx

  • (xxx) xxx xxxx


What is important for us is there is the area code, aka, a “1” at the front of every number. I was thinking about creating a formula that adds a “1” at the start, but in the circumstances where a user does what we want, and adds a “1”, I don’t want to add it as it’d break it.


Does anyone know how to put a formula together that’ll do this?


PS,


Bonus points if you can ensure it looks “pretty” by formatting it in this way: 1 (XXX) XXX-XXXX

Best answer by Bill_French


Right, there isn’t unfortunately and if you try to build a formula-only approach, it gets pretty ugly and convoluted. I think I needed three fields to achieve it when I tried it a few years ago. Perhaps there’s a formula geek amongst us that can whip one up.



COMMENTARY: Airtable should make it possible to perform data validation by supporting an option trigger to call into a script block and return the proper format or an error popup…



To get around this, I help clients perform a lot of data cleansing using the new script automation and script block features. Like this …



Script:


/*

   ***********************************************************

   ScriptBloqs - Phone Number Validation Logic

   Copyright (c) 2020 by Global Technologies Corporation

   ALL RIGHTS RESERVED

   *********************************************************** 

*/



output.markdown('# Formatting Phone Numbers');



// get the name of the table

let table = base.getTable("Airdrop");



// get the records from this table

let records = await table.selectRecordsAsync();



// Update the records

for (let record of records.records) {



    if (record.getCellValue("Phone Number"))

    {



        //

        // apply the format

        //

        let thisValue = record.getCellValue("Phone Number");

        // output.inspect(thisValue);



        // remove any + signs if they exist

        thisValue = thisValue.replace("+", "");



        // if the first character is a one, do nothing, otherwise append one (this is north america after all)

        thisValue = (thisValue.toString()[0] === "1") ? thisValue : "1 " + thisValue;



        // regex the number

        thisValue = formatPhoneNumber(thisValue);



        // per the client's request, eliminate the + sign that the regex added

        thisValue = thisValue.replace("+1 ", "1 ");



        await table.updateRecordAsync(record, {

            "Phone Number Formatted" : thisValue

        });

    

    }

}



//

// format phone number

//

function formatPhoneNumber(phoneNumberString) {

  var cleaned = ('' + phoneNumberString).replace(/\D/g, '')

  var match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/)

  if (match) {

    var intlCode = (match[1] ? '+1 ' : '')

    return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('')

  }

  return null

}
View original
Did this topic help you find an answer to your question?

3 replies

  • Inspiring
  • 3264 replies
  • Answer
  • November 10, 2020

Right, there isn’t unfortunately and if you try to build a formula-only approach, it gets pretty ugly and convoluted. I think I needed three fields to achieve it when I tried it a few years ago. Perhaps there’s a formula geek amongst us that can whip one up.



COMMENTARY: Airtable should make it possible to perform data validation by supporting an option trigger to call into a script block and return the proper format or an error popup…



To get around this, I help clients perform a lot of data cleansing using the new script automation and script block features. Like this …



Script:


/*

   ***********************************************************

   ScriptBloqs - Phone Number Validation Logic

   Copyright (c) 2020 by Global Technologies Corporation

   ALL RIGHTS RESERVED

   *********************************************************** 

*/



output.markdown('# Formatting Phone Numbers');



// get the name of the table

let table = base.getTable("Airdrop");



// get the records from this table

let records = await table.selectRecordsAsync();



// Update the records

for (let record of records.records) {



    if (record.getCellValue("Phone Number"))

    {



        //

        // apply the format

        //

        let thisValue = record.getCellValue("Phone Number");

        // output.inspect(thisValue);



        // remove any + signs if they exist

        thisValue = thisValue.replace("+", "");



        // if the first character is a one, do nothing, otherwise append one (this is north america after all)

        thisValue = (thisValue.toString()[0] === "1") ? thisValue : "1 " + thisValue;



        // regex the number

        thisValue = formatPhoneNumber(thisValue);



        // per the client's request, eliminate the + sign that the regex added

        thisValue = thisValue.replace("+1 ", "1 ");



        await table.updateRecordAsync(record, {

            "Phone Number Formatted" : thisValue

        });

    

    }

}



//

// format phone number

//

function formatPhoneNumber(phoneNumberString) {

  var cleaned = ('' + phoneNumberString).replace(/\D/g, '')

  var match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/)

  if (match) {

    var intlCode = (match[1] ? '+1 ' : '')

    return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('')

  }

  return null

}

  • Author
  • Known Participant
  • 11 replies
  • November 13, 2020
Bill_French wrote:

Right, there isn’t unfortunately and if you try to build a formula-only approach, it gets pretty ugly and convoluted. I think I needed three fields to achieve it when I tried it a few years ago. Perhaps there’s a formula geek amongst us that can whip one up.



COMMENTARY: Airtable should make it possible to perform data validation by supporting an option trigger to call into a script block and return the proper format or an error popup…



To get around this, I help clients perform a lot of data cleansing using the new script automation and script block features. Like this …



Script:


/*

   ***********************************************************

   ScriptBloqs - Phone Number Validation Logic

   Copyright (c) 2020 by Global Technologies Corporation

   ALL RIGHTS RESERVED

   *********************************************************** 

*/



output.markdown('# Formatting Phone Numbers');



// get the name of the table

let table = base.getTable("Airdrop");



// get the records from this table

let records = await table.selectRecordsAsync();



// Update the records

for (let record of records.records) {



    if (record.getCellValue("Phone Number"))

    {



        //

        // apply the format

        //

        let thisValue = record.getCellValue("Phone Number");

        // output.inspect(thisValue);



        // remove any + signs if they exist

        thisValue = thisValue.replace("+", "");



        // if the first character is a one, do nothing, otherwise append one (this is north america after all)

        thisValue = (thisValue.toString()[0] === "1") ? thisValue : "1 " + thisValue;



        // regex the number

        thisValue = formatPhoneNumber(thisValue);



        // per the client's request, eliminate the + sign that the regex added

        thisValue = thisValue.replace("+1 ", "1 ");



        await table.updateRecordAsync(record, {

            "Phone Number Formatted" : thisValue

        });

    

    }

}



//

// format phone number

//

function formatPhoneNumber(phoneNumberString) {

  var cleaned = ('' + phoneNumberString).replace(/\D/g, '')

  var match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/)

  if (match) {

    var intlCode = (match[1] ? '+1 ' : '')

    return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('')

  }

  return null

}

Thank you so much for putting this together. This will be incredibly helpful for ensuring our phone number data is usable.


Thank you so much for putting this together!


  • Participating Frequently
  • 15 replies
  • October 7, 2024

You can set up a regex pattern rule in the DataGuard extension to prevent users from entering an incorrect telephone format and keep your data clean.


Reply