首页 > 解决方案 > 如何更正代码以使循环在数据匹配时停止

问题描述

我们每天都会使用 XML 将新条目拉入 Google 工作表(工作表 1)。我们正在使用下面的代码将这些条目提取到最终用户的单独 Google 表格中(表格 2)。然后最终用户可以编辑数据。我们正在尝试比较工作表 1 和工作表 2 中的 ID 号。每次运行代码时,工作表 1 中与工作表 2 中不匹配的 ID 号应添加到工作表 2。如果工作表 1 中的 ID 号表 2 中已存在,应跳过该 ID 号。它不是跳过比赛。相反,每次我们运行代码时它都会将所有内容添加到 Sheet 2,而 Sheet 2 现在包含重复项。


  for(var i = 1; i < slateDT.length; i ++) {
    var bannerid = slateDT[i][0];
    var match = "No Match";
    var j = 1;


    while(j < gradingDT.length && match == "No Match") {
      var matchID = gradingDT[j][1].trim();

      if(bannerid.trim() != matchID){ 
        j++;
      } else {
        match = "Match"; 
      }
    }

    if(match == "No Match"){ 
      additions.push(moveColumns(slateDT[i]));
    }
  }
    if(additions.length > 0) {
    gradingSS.getRange(gradingDT.length + 1, 2, additions.length, additions[0].length).setValues(additions);

     gradingDT = getDataValues(gradingSS.getName());
    var sortRng = gradingSS.getRange(2, 1, gradingDT.length, gradingDT[0].length);
    sortRng.sort(3);
  }

function moveColumns(studentRow) {
studentRow.splice(17, 3);

var v = checkDefined(studentRow.splice(20, 1));
  studentRow.splice(10, 0, v.join());

 v = checkDefined(studentRow.splice(18, 1));
  studentRow.splice(13, 0, v.join());

  v = checkDefined(studentRow.splice(20));
  studentRow.splice(14, 0, v.join());

  return studentRow;
}

标签: for-loopgoogle-apps-scriptgoogle-sheets

解决方案


好的,我假设您奇怪的 moveColumns 函数可以满足您的要求,并且根据我上面的问题,列号不匹配。用这个替换你的 for 循环:

for (var i = 0; i < slateDT.length; i++) {
    var oldID = slateDT[i][0].trim();
    var matchID = 0;
    for (var j = 1; j < gradingDT.length; j++) {    
        var newID = gradingDT[j][1].trim();
        if (oldID == newID) {
            matchID = j;
            break; //ends the j loop when it meets the match
        } 
    } //for [j] loop
    if (matchID == 0) {
        additions.push(moveColumns(slateDT[i]));
        Logger.log("No match was found for " + i);
    } else {
        Logger.log("A match was found for " + i + " at " + j);
    }
} //for [i] loop

这与您尝试对 while 循环执行的操作非常相似,但在某些情况下无法设法从不增加 J。

一旦您确定它正在工作,请注释掉两条记录器行以提高性能。


推荐阅读