【问题标题】:Switch statement disregarding input and doing all casesSwitch 语句无视输入并执行所有情况
【发布时间】:2021-09-24 13:05:46
【问题描述】:

我正在尝试使用谷歌表格和谷歌应用脚​​本创建一个杂货成本划分系统来创建它。我在尝试使用嵌套在 for 循环中的 switch 语句时遇到问题,该循环遍历与特定购买相关的所有人员并根据他们的姓名进入案例,然后将值添加到另一个包含总购买量的工作表。

for (var i = 1; i < 6; i++) {
    people.push(data[i][0]);
    values.push(data[i][1]);
    if(values[i-1] != 0.0){
      var splits = (data[i][2]);
      splits = splits.split(',');
      var splitprice = values[i-1].toFixed(2);
      Logger.log(`Values: ${values[i-1]} splits: ${splits} split length: ${Object.keys(splits).length} Split Price: ${splitprice}`);
        switch (people[i-1]) {
          case 'Aiden':
            Logger.log('In Aiden case: '+splits);
            Aiden(splits,splitprice);
            return;
            
          case 'Ben':
            Logger.log('In Ben case: '+splits);
            Ben(splits,splitprice);
            break;
            

          case 'Joe':
            Logger.log('In Joe case: '+splits);
            Joe(splits,splitprice);
            break;

          case 'Malcolm':
            Logger.log('In Macolm case: '+splits);
            Malcolm(splits,splitprice);
            break;
            
          case 'Marcel':
            Logger.log('In Marcel case: '+splits);
            Marcel(splits,splitprice);
            return;
        } 
    }
  }

在此代码中,它会检查与购买者对应的单元格,并通过 switch 语句根据人输入正确的函数。


function Aiden(splitbtwn,total){
  for(var j=0; j <= splitbtwn.length + 1; j++) {
            var splitprice = (total/(splitbtwn.length + 1)).toFixed(2);
            switch (splitbtwn[j]) {

              case "All": 
              splitbtwn = "Ben,Joe,Malcolm,Marcel";
              splitprice = (total/5);

              case "Ben":
              for(var k = 3; k < 1000; k++) {
                var Ben2Aid = ('Payables!F' + k)
                var checker = sheet.getRange(Ben2Aid).isBlank();
                if (checker) {                
                  SpreadsheetApp.getActiveSpreadsheet().getRange(Ben2Aid).setValue(splitprice);
                break;
                }
              }
              case "Joe":
              for(var k = 3; k < 1000; k++) {
                var Joe2Aid = ('Payables!K' + k)
                var checker = sheet.getRange(Joe2Aid).isBlank();
                if (checker) {
                SpreadsheetApp.getActiveSpreadsheet().getRange(Joe2Aid).setValue(splitprice);
                break;
                }
              }
              case "Malcolm":
              for(var k = 3; k < 1000; k++) {
                var Mal2Aid = ('Payables!P' + k)
                var checker = sheet.getRange(Mal2Aid).isBlank();
                if (checker) {
                SpreadsheetApp.getActiveSpreadsheet().getRange(Mal2Aid).setValue(splitprice);
                break;
                }
              }
              case "Marcel":
              for(var k = 3; k < 1000; k++) {
                var Mar2Aid = ('Payables!U' + k)
                var checker = sheet.getRange(Mar2Aid).isBlank();
                if (checker) {
                SpreadsheetApp.getActiveSpreadsheet().getRange(Mar2Aid).setValue(splitprice);
                return;
                }
              }
              
            }
          }
}

每个人都有自己的函数,该函数使用参数调用,以查看分配给谁。我的问题是它在第二个函数中执行每个单独的 switch 案例,而不是根据 splitbtwn 变量执行与案例相对应的案例,该变量是一个数组,拥有其拆分对象的名称。任何帮助将不胜感激。

【问题讨论】:

  • checker 是否曾经true?
  • Checker 在被选中放置 splitprice 值的单元格为空时为真,否则为假。这用于确保它不会覆盖现有单元格。

标签: javascript google-apps-script google-sheets switch-statement


【解决方案1】:

请将break移到case语句的末尾

function Aiden(splitbtwn,total){
      for(var j=0; j <= splitbtwn.length + 1; j++) {
                var splitprice = (total/(splitbtwn.length + 1)).toFixed(2);
                switch (splitbtwn[j]) {
    
                  case "All": 
                  splitbtwn = "Ben,Joe,Malcolm,Marcel";
                  splitprice = (total/5);
    
                  case "Ben":
                  for(var k = 3; k < 1000; k++) {
                    var Ben2Aid = ('Payables!F' + k)
                    var checker = sheet.getRange(Ben2Aid).isBlank();
                    if (checker) {                
                      SpreadsheetApp.getActiveSpreadsheet().getRange(Ben2Aid).setValue(splitprice);
                    }
                  }
                  break;
                  case "Joe":
                  for(var k = 3; k < 1000; k++) {
                    var Joe2Aid = ('Payables!K' + k)
                    var checker = sheet.getRange(Joe2Aid).isBlank();
                    if (checker) {
                    SpreadsheetApp.getActiveSpreadsheet().getRange(Joe2Aid).setValue(splitprice);
                    }
                  }
                  break;
                  case "Malcolm":
                  for(var k = 3; k < 1000; k++) {
                    var Mal2Aid = ('Payables!P' + k)
                    var checker = sheet.getRange(Mal2Aid).isBlank();
                    if (checker) {
                    SpreadsheetApp.getActiveSpreadsheet().getRange(Mal2Aid).setValue(splitprice);
                    }
                  }
                  break;
                  case "Marcel":
                  for(var k = 3; k < 1000; k++) {
                    var Mar2Aid = ('Payables!U' + k)
                    var checker = sheet.getRange(Mar2Aid).isBlank();
                    if (checker) {
                    SpreadsheetApp.getActiveSpreadsheet().getRange(Mar2Aid).setValue(splitprice);
                    }
                  }
                }
              }
    }

【讨论】:

  • 这并没有解决问题,如果我将break语句放在for循环之外,它会进入无限循环。
【解决方案2】:

尝试将break 放在循环之外:

case "Ben":
  for(var k = 3; k < 1000; k++) {
    var Ben2Aid = ('Payables!F' + k)
    var checker = sheet.getRange(Ben2Aid).isBlank();
    if (checker) {                
      SpreadsheetApp.getActiveSpreadsheet().getRange(Ben2Aid).setValue(splitprice);
    }
  }
  break;
...

【讨论】:

  • 这并没有解决问题,如果我将break语句放在for循环之外,它会进入无限循环。
  • 好吧伙计,检查器什么时候是 === true?
  • 检查器用于查看将表示 splitprice 变量的单元格是否为空,如果选择的单元格为空,.isBlank() 返回 true,否则返回 false。感谢您的帮助,我只是不明白为什么这不起作用。
  • 这几乎就像它只是忽略案例并按顺序执行它们。从上面名为 Aiden 的函数中,它只是按照它们所在的顺序遍历这些案例。
  • splitbtwn 数组里面有什么(你在第二个函数中循环遍历那个数组,所以可能有问题)?
猜你喜欢
  • 2014-03-27
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 2018-05-28
  • 1970-01-01
相关资源
最近更新 更多