根据IF语句测试范围值数组的最佳方法

时间:2019-04-13 11:16:54

标签: javascript google-apps-script

作为为我的组织构建电子表格工具的一部分,我需要尽可能多地证明所述工具的安全,这意味着在允许功能运行之前检查一些条件。我正在运行一个版本的代码,但我想知道是否有一种方法可以对其进行优化。

在下面的代码中,我使用一个for循环来检查Col B中的行是否具有空值,同时在同一行的Col C,D,E或F中是否具有某个值。

如果条件至少满足一次,则我们停止循环并警告用户。如果数组通过了检查,那么我们将在循环结束时执行一些操作。

我们可以完全避免循环吗?如何优化代码?

我做了一些研究,但考虑到Google Apps脚本中一系列值的数组结构,.every或.every似乎并没有削减它。

这是我感兴趣的部分的代码摘要:

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 个答案:

答案 0 :(得分:1)

“一些”是方法。条件看起来像

var condition = check[0] === ''  && check.slice(1).some(function(item) { return item != '';});

答案 1 :(得分:1)

仅当先前的数据不影响后续的数据并且您编辑数据时才可以使用代码,而不管循环何时中断。

在这种情况下,您可以通过尽早保留嵌套条件来简化代码的外观:

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