针对IF语句测试范围值数组的最佳方法

问题描述 投票:0回答:2

作为为我的组织构建电子表格工具的一部分,我需要尽可能多地说明工具,这意味着在允许函数运行之前检查一些条件。我有一个版本的代码运行,但我想知道是否有一种方法来优化它。

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

如果条件为真至少一次,则我们停止循环并提醒用户。如果数组通过检查,那么我们在循环结束时做一些事情。

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

我做了一些研究,但是。考虑到Google Apps脚本中的一系列有价值的数组结构,每个或者。似乎都不会削减它。

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

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
        
      }
      
    }
    
  }
  
}
javascript google-apps-script
2个回答
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

1
投票

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

var condition = check[0] === ''  && check.slice(1).some(function(item) { return item != '';});
© www.soinside.com 2019 - 2024. All rights reserved.