Apps脚本过滤器功能未再现预期结果

问题描述 投票:0回答:1

我有这个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);
 
}
google-apps-script google-sheets filter gas
1个回答
0
投票
  • 您想用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");的值。
  • 您要检索过滤后的值。 (在您的共享电子表格中,共有14行)
  • 您要检索未过滤的值。 (在您的共享电子表格中,共有1617行)
  • 您想知道从1631的总行中检索未过滤的值时,您的脚本没有返回1631 - 14 = 1617的行的原因。

如果我的理解是正确的,那么这个答案怎么样?请认为这只是几个可能的答案之一。

问题:

首先,我想比较两个过滤器以检索filteredRange

  1. val[C2] === "IV THERAPY" && (val[C1] === "DEOK645"|| val[C1] === "JETH850" || val[C1] === "JOON409"|| val[C1] === "THAM1452")

    • 这将返回14行。
  2. val[C2] != "IV THERAPY" && (val[C1] != "JOON409"|| val[C1] != "JETH850" || val[C1] != "JOON409" || val[C1] != "THAM1452")

    • 此将返回1576行。这不是1617,即1631 - 14 = 1617

[这里,我认为对于第二个过滤器,DEOK645应该为JOON409。并且,当您要使用第一个过滤器创建相反的过滤器时,==!=分别被修改为!===。而且,&&||分别被修改为||&&。在您的脚本中,我认为后者是您遇到问题的原因。

解决方案和解决方法:

当使用共享电子表格时,以下3种模式返回1617行的值。

模式1:

在此模式下,使用上面的修改。请进行如下修改。

从:
//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
});

模式2:

在此模式下,使用第一个过滤器。请进行如下修改。

从:
//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
});

模式3:

在此模式中,已过滤的值和未过滤的值都在一个循环中检索。

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.filteredValuefilteredRange.noFilteredValue分别是过滤后的值和未过滤后的值。

参考:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

© www.soinside.com 2019 - 2024. All rights reserved.