Лучший способ проверить массив значений диапазона по сравнению с оператором IF - PullRequest
0 голосов
/ 13 апреля 2019

как часть создания инструмента для работы с электронными таблицами для моей организации, мне нужно как можно больше проверить этот инструмент, что означает проверку нескольких условий, прежде чем разрешить выполнение функции.У меня работает версия кода, но мне интересно, есть ли способ ее оптимизировать.

В приведенном ниже коде я использую цикл for, чтобы проверить, имеет ли строка в столбце B пустое значение, а в столбце C, D, E или F есть значение в той же строке.

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

Можем ли мы вообще избежать цикла?Как оптимизировать код?

Я провел какое-то исследование, но .every или .some, похоже, не урезают его, учитывая структуру массива диапазона значений в Google Apps Script.

Вот краткое описание кода для частиЯ заинтересован в:

function myFunc() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet(),
      bench = sheet.getSheets()[0].getRange('B1:F14').getValues();
  
  for (var c = 0; c < bench.length; c++) {
    
    var check = bench[c];
    
    if (check[0] === '' && ((check[1] || check[2] || check[3] || check[4]) != '')) { // check if a row in Col B as an empty value while having a value in Col C,D,E or F
      
      SpreadsheetApp.getUi().alert("line " + (c + 1) + " has no company name");
      break;
      
    } else { // everything pitchy
      
      if (c == (bench.length - 1)) {
        
        //Function run normaly
        
      }
      
    }
    
  }
  
}

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

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

В этом случае вы можете упростить внешний вид вашего кода, оставив вложенные условия как можно раньше:

function myFunc() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var bench = sheet
    .getSheets()[0]
    .getRange('B1:F14')
    .getValues();
  var client = bench[1][0];

  if (client === '') {
    // check if client name is not empty
    SpreadsheetApp.getUi().alert('client is empty');
    return;
  }

  for (var c = 0; c < bench.length; c++) {
    var check = bench[c];

    if (
      check[0] === '' &&
      [check[1], check[2], check[3], check[4]].join('') !== ''
    ) {
      // check if a row in Col B as an empty value while having a value in Col C,D,E or F

      SpreadsheetApp.getUi().alert('line ' + (c + 1) + ' has no company name');
      break;
    }
    // everything pitchy

    if (c == bench.length - 1) {
      // Function run normaly
    }
  }
}

В противном случае лучше заранее проверить данные и работать с допустимым массивом:

function myFunc() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var bench = sheet
    .getSheets()[0]
    .getRange('B1:F14')
    .getValues();
  var client = bench[1][0];

  if (client === '') {
    // check if client name is not empty
    SpreadsheetApp.getUi().alert('client is empty');
    return;
  }

  var chcker = bench
    .filter(function(check) {
      return (
        check[0] === '' &&
        [check[1], check[2], check[3], check[4]].join('') !== ''
      );
    })
    .map(function(_, i) {
      return 'line ' + (i + 1) + ' has no company name';
    });
  if (chcker.length) {
    SpreadsheetApp.getUi().alert(chcker.join('\n'));
    return;
  }

  for (var c = 0; c < bench.length; c++) {
    if (c == bench.length - 1) {
      // Function run normaly
    }
  }
}

Если вы не хотите зацикливать все, вы можете добавить findIndex polyfill

var chcker = bench
    .findIndex(function(check) {
      return (
        check[0] === '' &&
        [check[1], check[2], check[3], check[4]].join('') !== ''
      );
    });
if(chcker !== -1) { // The data invalid
1 голос
/ 13 апреля 2019

«некоторые» - это метод.Условие будет выглядеть примерно так:

var condition = check[0] === ''  && check.slice(1).some(function(item) { return item != '';});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...