首页 > 解决方案 > if语句块执行错误的逻辑错误

问题描述

我的程序从同一个电子表格的 2 个选项卡中提取数据;但是,它一直从错误的“if”语句块执行。例如var region = ss.getRange(i,5);contains[us, ca, de, br, mx] 和var user1 =bs.getRange(i,1);contains[us, ca, de]。我希望我的 if 语句比较用户 1 是否包含任何区域值然后执行,如果它不执行第二个“if”语句,以便它可以将其发送到 user2CC。在这个例子中,看起来我的程序继续基于“决定”而不是区域是否 == 或!= 到 user1。
另外,对于我在这里可能遇到的任何格式问题,我深表歉意,我很新,正在学习。感谢您抽出时间阅读并研究此内容。

我还注意到,如果我包含另一个 if 语句decision == "wrong",包括user1 == region但不包含另一个像user1 != region && decision == "wrong"它执行正常的附加语句?

function sendEmails() {

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Main").activate();

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lr = ss.getLastRow();

  var bs = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Regions").activate();
  var lRow = bs.getLastRow();


  // Fetches templates for email
  var Acceptable = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Templates").getRange(1, 1).getValue();
  var Wrong = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Templates").getRange(2, 1).getValue();


  var user1CC = "main@email.com" + ',' + "user1@email.com";
  var user2CC = "main@email.com" + ',' + "user2@email.com";


  // loops through "Main" spreadsheet to check if email has been sent and pull necessary data to construct email
  for (var i = 2; i <= lr; i++) {

    var cBox = ss.getRange(i, 13).getValue();
    var region = ss.getRange(i, 5).getValue();
    var type = ss.getRange(i, 6).getValue();
    var decision = ss.getRange(i, 15).getValue();

    // loops through "Regions" tab in spreadsheet to get specific regions by person(column)
    for (var j = 2; j <= lRow; j++) {
      var user1 = bs.getRange(j, 1).getValues();

      if (cBox == false) {

        if ((user1.includes(region[j]) && (decision == "Acceptable") {
          var check = ss.getRange(i, 13).setValue("Yes");
          var time = ss.getRange(i, 14).setValue(new Date());
          var currentEmail = ss.getRange(i, 2).getValue();   
          var decision = ss.getRange(i, 15).getValue();
          
          var messageBody = Acceptable.replace("{Decision}", decision);
          Logger.log(messageBody);
          var subjectLine = "subject";

          MailApp.sendEmail(currentEmail, subjectLine, messageBody, {
            cc: user1CC
          });
          break;

        }


        if ((user1.indexOf(region[j] == -1) && (decision == "Acceptable") {

            var check = ss.getRange(i, 13).setValue("Yes");
            var time = ss.getRange(i, 14).setValue(new Date());

            var currentEmail = ss.getRange(i, 2).getValue();
            var decision = ss.getRange(i, 15).getValue();
            var messageBody = Acceptable.replace("{Decision}", 
             decision);
            var subjectLine = "subject";
            MailApp.sendEmail(currentEmail, subjectLine, messageBody, {
              cc: user2CC
            });
            Logger.log(messageBody);
            break;
          }

        } //ends cBox statement
      } // ends 'for' loops that iterates cBox and 'if' statements
    }
  }

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


我能够最终复制您的代码,问题在于您在 if 语句中放置的条件。在下面的代码片段中:

if((user1 == region)  && (decision == "Acceptable") && (type == "Video"))

您正在尝试将作为值数组 ["us", "ca", "de"] 的 user1 与作为另一个数组[ " us", "ca", "de", "br", “mx”]。您不能简单地使用user1 == region放置和比较这两个数组,因为该语句将始终返回False,因为它们作为数组的值不同。

如果要比较数组之间的值,则应使用它们的索引(例如 region[j])按项目访问它们。此外,您可以尝试使用 javascript 的 include() 函数来检查数组中是否包含特定值。您可以通过重写 if 语句来尝试它,如下所示:

if((user1.includes(region[j]))  && (decision == "Acceptable") && (type == "Video"))

至于第二个 if 语句,您可以将if替换为else if以防止代码在满足第一个条件时运行该语句。此外,您可以使用 javascript 函数indexOf()来评估该区域值是否在user1中不存在。如果被评估的数组中不存在传递的值,则 indexOf() 函数返回-1 请看下面的示例代码:

if((user1.indexOf(region[j]) == -1) && (decision == "Acceptable"))

推荐阅读