更改脚本以将非重复值发送到新的 sheet 而不是重复值

Changing script to send non-duplicate values to a new sheet instead of duplicate values

我有一个脚本遍历 2 个传播sheets,在 A 列中找到重复值,然后将这些重复值的行附加到另一个 sheet。

我实际上希望这个脚本做类似的事情,但附加的是不重复的行而不是重复的行。我如何更改它以便将非重复项发送到 "New Students" sheet"?我尝试将 == 更改为 !==。但这会发送整个列表。我一直在寻找一段时间后,我知道这可能很容易解决。
非常感谢! 布兰登

function compareandupdate() { 
  var s1 = SpreadsheetApp.openById("XXXXXX-vvxyewdki0J9tGqJl9_f-wZE0zOboQRIscLAA").getSheetByName('Updated Student List');
  var s2 = SpreadsheetApp.openById("XXXXXX-yB9Xm1J5RKWS7NF23vD-NTUeIgspbctj3leW4").getSheetByName('Master Student List');
  var s3 = SpreadsheetApp.openById("XXXXXX-yB9Xm1J5RKWS7NF23vD-NTUeIgspbctj3leW4").getSheetByName('New Students');

  var values1 = s1.getDataRange().getValues();
  var values2 = s2.getDataRange().getValues();
  var resultArray = [];

for(var n=0; n < values1.length ; n++){
    var keep = false;
    for(var p=0; p < values2.length ; p++){
      Logger.log(values1[n][0]+' =? '+values2[p][0]);
      if( values1[n][0] == values2[p][0]){
        resultArray.push(values1[n]);
        Logger.log('true');
        break ;// remove this if values are not unique and you want to keep all occurrences...
      }
    }
  }  
  s3.getRange(+1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
}

你可以试试这个

function contains(array, entry) {
  for(var p=0; p < array.length ; p++){
    if(array[p][0] === entry){
      return true;
    }
  }
  return false;
}

for(var n=0; n < values1.length ; n++) {
  if(!contains(values2, values1[n][0])) {
    resultArray.push(values1[n]);
  }
}

如果您更愿意保留现有结构 (我想我之前写过 ;-) 并且顺便说一句有一个不必要的变量(保留)!) 您可以使用这个您的代码的修改版本:

function compareAndUpdate() { 
  var s1 = SpreadsheetApp.openById("XXXXXX-vvxyewdki0J9tGqJl9_f-wZE0zOboQRIscLAA").getSheetByName('Updated Student List');
  var s2 = SpreadsheetApp.openById("XXXXXX-yB9Xm1J5RKWS7NF23vD-NTUeIgspbctj3leW4").getSheetByName('Master Student List');
  var s3 = SpreadsheetApp.openById("XXXXXX-yB9Xm1J5RKWS7NF23vD-NTUeIgspbctj3leW4").getSheetByName('New Students');

//  var definition for easier testing purpose  
//  var s1 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
//  var s2 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[1];
//  var s3 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[2];

  var values1 = s1.getDataRange().getValues();
  var values2 = s2.getDataRange().getValues();
  var resultArray = [];

  for(var n=0; n < values1.length ; n++){
    var keep = true;
    for(var p=0; p < values2.length ; p++){
      Logger.log(values1[n][0]+' =? '+values2[p][0]);
      if( values1[n][0] == values2[p][0]){
        keep = false;// if same value in first column in s2 then don't keep (you can modify this condition to your needs, extend to whole row or other columns for example )
        break;
      }
    }
    if(keep){
      resultArray.push(values1[n]);// keep only values from s1 that are not in s2
    }  
  }
  s3.getRange(+1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
}