我有这个Google表格,其中包含3列,data with three columns数据如下:Data Source我编写了一个脚本来筛选A列和C列何时满足某些条件然后,脚本在工作表“ PharmacyV1”中生成结果。结果已按预期生成,因为此表中有14行。
脚本的下一部分,我基本上过滤出与第一个条件完全相反的内容,本质上是将未过滤到工作表“ Pharmacy V1”的数据抓取,然后将其重写为原始工作表“ V1”。
我的原始V1工作表包含1,631行数据(不包括标题)
我的PharmacyV1工作表过滤出14行数据
但是V1结果最终得到1,575行数据,但我应该期望1631-14 = 1617行。
有人可以指出这种差异的原因或原因吗?
function S02_FilterPharmacy_Copy2NewSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('V1');
var firstRow = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues();
var C1 = firstRow[0].indexOf('TxnUser');
var C2 = firstRow[0].indexOf('Location');
// Filter for IV therapy and pharmacy users using filtered Range:
var rangeVals = sheet.getRange(1,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
var filteredRange = rangeVals.filter(function(val){
return val[C2] === "IV THERAPY" && (val[C1] === "DEOK645"|| val[C1] === "JETH850" ||
val[C1] === "JOON409"|| val[C1] === "THAM1452");
});
var targetSheet = ss.insertSheet('PharmacyV1');
targetSheet.getRange(2,1,filteredRange.length,filteredRange[0].length).setValues(filteredRange);
var sheet = ss.getSheetByName('V1');
targetSheet.getRange(1,1,1,sheet.getLastColumn()).setValues(firstRow);
//Filter and replace original V1
var rangeVals = sheet.getRange(1,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
var filteredRange = rangeVals.filter(function(val){
return val[C2] != "IV THERAPY" && (val[C1] != "JOON409"|| val[C1] != "JETH850" ||
val[C1] != "JOON409"|| val[C1] != "THAM1452");
});
var RANGE = sheet.getDataRange(); RANGE.clearContent();
var newRange = sheet.getRange(1,1,filteredRange.length, filteredRange[0].length);
newRange.setValues(filteredRange);
}
var rangeVals = sheet.getRange(1,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
过滤val[C2] === "IV THERAPY" && (val[C1] === "DEOK645"|| val[C1] === "JETH850" || val[C1] === "JOON409"|| val[C1] === "THAM1452");
的值。1631
的总行中检索未过滤的值时,您的脚本没有返回1631 - 14 = 1617
的行的原因。如果我的理解是正确的,那么这个答案怎么样?请认为这只是几个可能的答案之一。
首先,我想比较两个过滤器以检索filteredRange
。
val[C2] === "IV THERAPY" && (val[C1] === "DEOK645"|| val[C1] === "JETH850" || val[C1] === "JOON409"|| val[C1] === "THAM1452")
val[C2] != "IV THERAPY" && (val[C1] != "JOON409"|| val[C1] != "JETH850" || val[C1] != "JOON409" || val[C1] != "THAM1452")
1631 - 14 = 1617
。[这里,我认为对于第二个过滤器,DEOK645
应该为JOON409
。并且,当您要使用第一个过滤器创建相反的过滤器时,==
和!=
分别被修改为!=
和==
。而且,&&
和||
分别被修改为||
和&&
。在您的脚本中,我认为后者是您遇到问题的原因。
当使用共享电子表格时,以下3种模式返回1617行的值。
在此模式下,使用上面的修改。请进行如下修改。
从://Filter and replace original V1
var rangeVals = sheet.getRange(1,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
var filteredRange = rangeVals.filter(function(val){
return val[C2] != "IV THERAPY" && (val[C1] != "JOON409"|| val[C1] != "JETH850" ||
val[C1] != "JOON409"|| val[C1] != "THAM1452");
});
至://Filter and replace original V1
var rangeVals = sheet.getRange(1,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
var filteredRange = rangeVals.filter(function(val){
return return val[C2] != "IV THERAPY" || (val[C1] != "DEOK645" && val[C1] != "JETH850" && val[C1] != "JOON409" && val[C1] != "THAM1452"); // Modified
});
在此模式下,使用第一个过滤器。请进行如下修改。
从://Filter and replace original V1
var rangeVals = sheet.getRange(1,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
var filteredRange = rangeVals.filter(function(val){
return val[C2] != "IV THERAPY" && (val[C1] != "JOON409"|| val[C1] != "JETH850" ||
val[C1] != "JOON409"|| val[C1] != "THAM1452");
});
至://Filter and replace original V1
var rangeVals = sheet.getRange(1,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
var filteredRange = rangeVals.filter(function(val){
return !(val[C2] === "IV THERAPY" && (val[C1] === "DEOK645"|| val[C1] === "JETH850" || val[C1] === "JOON409"|| val[C1] === "THAM1452")); // Modified
});
在此模式中,已过滤的值和未过滤的值都在一个循环中检索。
var rangeVals = sheet.getRange(1,1,sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
var filteredRange = rangeVals.reduce(function(obj, val){
if (val[C2] === "IV THERAPY" && (val[C1] === "DEOK645"|| val[C1] === "JETH850" || val[C1] === "JOON409"|| val[C1] === "THAM1452")) {
obj.filteredValue.push(val);
} else {
obj.noFilteredValue.push(val);
}
return obj;
}, {filteredValue: [], noFilteredValue: []});
filteredRange.filteredValue
和filteredRange.noFilteredValue
分别是过滤后的值和未过滤后的值。如果我误解了您的问题,而这不是您想要的结果,我深表歉意。