首页 > 解决方案 > 如果满足条件后语句不停止

问题描述

我有这段代码根据我在谷歌表中的列表检查电子邮件的发件人。

假设我的列表有两列(姓名和电子邮件)。

列名,第一行:“Google”
列电子邮件,第一行:“some.one@google.com”。

然后我收到一封来自“some.one@google.com”的电子邮件。
我的脚本将接收该电子邮件,检查我的列表中是否有它,如果有,它将获取此人的姓名,在这种情况下为“Google”。

如果我收到来自某人.else@google.com 的电子邮件,我仍然希望它获得名称“Google”,但现在基于域。

该脚本运行良好,但是如果我添加第二行名称 =“Google 2”和电子邮件 =“random.email@google.com”,并且我收到一封来自“some.one@google.com”的电子邮件,它将在我的列表中找到它,但它会继续到 else if 位,它也会按域找到它。

按域搜索时会找到 Google 和 Google 2。我希望它在第一次满足条件后停止,并使用谷歌。现在,它继续运行并获取最后一个结果,Google 2。我虽然 if/else 语句在第一次满足条件后停止。

如果它通过“if”并且满足条件,我希望它停止,而不是继续“else if”并返回它找到的最后一个结果。

for (let j = 2; j < lastRowMySpreadsheet; j++) {
  let emailInMyList = mySpreadsheet.getRange(j, 2).getValue();
  /// domainInMyList gets the column with the domains ie: "whatever@google.com" would show as only "google" in this column.
  let domainInMyList = mySpreadsheet.getRange(j, 3).getValue();
  if (emailFromGmail === emailInMyList) {
    sourceName = mySpreadsheet.getRange(j, 1).getValue();
    /// do other stuff too

  } else if (onlyEmailDomain === domainInMyList) {
    sourceName = mySpreadsheet.getRange(j, 1).getValue();
    /// do other stuff too
  }
}

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


正如 Jeremy Tille 所说,您可以使用 break;

for (let j = 2; j < lastRowMySpreadsheet; j++) {
  let emailInMyList = mySpreadsheet.getRange(j, 2).getValue();
  let domainInMyList = mySpreadsheet.getRange(j, 3).getValue();

  if (emailFromGmail === emailInMyList) {
    sourceName = mySpreadsheet.getRange(j, 1).getValue();

    break; // Terminate after first find

  } else if (onlyEmailDomain === domainInMyList) {
    sourceName = mySpreadsheet.getRange(j, 1).getValue();
    /// do other stuff too

    break; // If first find is a priorite DO NOT put break here;
  }
}

但是,对于性能问题,我建议一次处理所有行,像这样

var rows = SpreadsheetApp.getDataRange().getValues();

var emailMatched = rows.filter(row => row[1] == emailFromGmail);
var domainMatched = rows.filter(row => row[2] == domainInMyList);

Logger.log(emailMatched) // All matched email rows
Logger.log(domainMatched) // All matched domain rows

Logger.log(emailMatched[0][0]) // First source name matched
Logger.log(domainMatched[0][0]) // First domain name matched

推荐阅读