Неверная ссылка на ячейки

#javascript #google-apps-script #google-sheets #formatting #number-formatting

Вопрос:

Я кодирую форматер телефонных номеров для большой базы данных. Все работает, но происходит непоследовательная печать пустых ячеек. Большинство ячеек прочитаны и правильно отформатированы, но некоторые из них показывают пустые выходные данные в неправильных ячейках.

Я попытался исправить это, сбросив переменную Clean number в пустую строку, но это просто создало еще одну проблему в строке 33 с помощью indexOf().

 function myFunction() {
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // connects sheet to code
  var startRow = 18;
  var endRow = 41;
  for (var i = startRow; i <= endRow; i  ) {     // i = currnet row | row to end at | add 1 to count each time
    var workingCell = activeSheet.getRange(i, 2).getValue();
    Logger.log("Original number: "   workingCell)
    //If blank, move to next row
    exit: if (workingCell.length == 0.0) {
      var blank = "";
      activeSheet.getRange(i, 3).setValue(blank);
      Logger.log("This row is blank")
      //break exit;
    }
    // cleanNumber if it isn't formatted already 
    else if (isNaN(workingCell)) { // runs if active cell is not a preformatted number 
      var cleanNumber = workingCell.replace(/D/g, '');  // removes all non-numeric values
      activeSheet.getRange(i, 3).setValue(cleanNumber);
      Logger.log("Extra char's removed: "   cleanNumber)
    }
    // runs if active cell is already preformatted 
    else {
      activeSheet.getRange(i, 3).setValue(workingCell);
      Logger.log("No need for formatting: "   workingCell)
    }
    // If cleanNumber has a country code( 1), remove it
    if ((cleanNumber.indexOf("1")) == 0) {
      cleanNumber = cleanNumber.substring(1); //removes first character = "1"
      activeSheet.getRange(i, 3).setValue(cleanNumber);
      Logger.log("Country code removed: "   cleanNumber);
    }
    // If number is longer than 10 characters, create an extension variable - with entire number, remove 10 characters from front
    if (cleanNumber.length > 10.0) {
      var extension = cleanNumber.substring(10, 15);
      var phoneNumber = cleanNumber.substring(0, 10);
      var formatted = phoneNumber.slice(0, 3)   "-"   phoneNumber.slice(3, 6)   "-"   phoneNumber.slice(6, 15);
      var finalPhoneNumber = formatted   " ext. "   extension;
      activeSheet.getRange(i, 3).setValue(finalPhoneNumber);
      Logger.log("This number is in its final ext. format: "   finalPhoneNumber);
    }
    //if number doesnt have an extension, put it into final format
    else if (cleanNumber.length = 10.0) {
      var frontFinal = cleanNumber.substring(0, 3);
      var midFinal = cleanNumber.substring(3, 6);
      var endFinal = cleanNumber.substring(6, 10);
      var finalNumber = frontFinal   "-"   midFinal   "-"   endFinal;

      activeSheet.getRange(i, 3).setValue(finalNumber);
      Logger.log("This number is in its final format: "   finalNumber);
    }
    //if number is less than 10 numbers
    else {
      Logger.log("This number is shorter than 10 numbers"   cleanNumber);
    }
    cleanNumber = " ";
  }
}
 

Предварительно отформатированные числа находятся слева, а выходные данные-в правом столбце.

[1]: https://i.stack.imgur.com/bMCNc.png

Вот некоторые примеры данных, пожалуйста, учтите, что проблема, по-видимому, связана с пустыми строками.

Неформатированный
1999-111-1111
1 2222-222222
4444444444 доб. 223
9738094395
9172609107
866.786.6682
973 330 2212
(631)563-4000 доб. 234

Я с нетерпением жду решения этой проблемы, спасибо вам за помощь 🙂

Комментарии:

1. Было бы полезно, если бы вы могли поместить неформатированные числа в таблицу.

2. Да, но я не могу копировать и вставлять, поэтому я даже не собираюсь пытаться его отлаживать.

3. Это всего лишь образец формы для тестирования, фактические данные находятся на другом листе. В официальном листе Google есть более 600 000 телефонных номеров, которые нуждаются в форматировании, и они находятся в этом формате.

4. о, хорошо, я понимаю, дай мне попробовать

5. @Cooper Я создал для вас таблицу с некоторыми образцами данных. Пожалуйста, дайте мне знать, если вам понадобится что-нибудь еще. Просто для справки, проблема, похоже, возникает, как только она считывает пустую строку.

Ответ №1:

Вы можете сделать это с ARRAYFORMULA помощью регулярного выражения или использовать его в своем сценарии.

 =ArrayFormula(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(TO_TEXT(A2:A),"D",),"^(?:1)?(d{3})(d{3})(d{4})(d{0,5}).*$","$1-$2-$3 ext. $4")," ext. $",))
 

Рекомендуется использовать пакетные операции

 const values = [
  ['1999-111-1111'],
  ['1 2222-222222'],
  ['4444444444 ext. 223'],
  [9738094395],
  [9172609107],
  ['866.786.6682'],
  ['973 330 2212'],
  ['(631)563-4000 ext. 234'],
  ['973-809-4395'],
  ['']
];

const results = [];
for (const value of values) {
  const cleanNumber  = value[0].toString().replace(/D/g, '');
  const m = cleanNumber.match(/^(?:1)?(d{3})(d{3})(d{4})(d{0,5}).*$/);
  if (m) {
    let finalNumber = `${m[1]}-${m[2]}-${m[3]}`;
    if (m[4]) { finalNumber  = ` ext. ${m[4]}`; }
    results.push([finalNumber]);
  }
  else {
    results.push(value);
  }
}
console.log(results.flat()); 

Комментарии:

1. Спасибо! Это так помогло.