更改脚本以将非重复值发送到新的 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);
}
我有一个脚本遍历 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);
}