简体   繁体   English

使用可变过滤器过滤二维阵列

[英]Filtering 2D Array with a Variable Filter

I am trying to break out an array into several different arrays to paste information across several sheets. 我试图将一个数组分解为几个不同的数组,以将信息粘贴到几张纸上。 I am having trouble filtering my main data array (bigArray) dynamically with a separate array (sheetCheck). 我在使用单独的数组(sheetCheck)动态过滤主数据数组(bigArray)时遇到麻烦。 If I type a static filter ie "02A" the filter works. 如果我键入一个静态过滤器,即“ 02A”,则该过滤器可以工作。 How can I modify my filter to accept variable information? 如何修改过滤器以接受变量信息?

function testArray (){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  //Get full array of Budget Pricing Breakdown Sheet
  var originalArray = ss.getRangeByName('XxTestRange').getValues();
  //Delete unused columns from array. Only Leaves sheetNumber, description, qty, UM, unitCost
  var newArray = originalArray.map(function(row){return[row[0],row[5],row[6],row[7],row[10]];});
  //Delete unused rows that have a value of X in the sheetNumber
  var bigArray = newArray.filter(function(item){return item[0] != "X";});

  //Get array of Applicable Tabs
  var originalSheetsArray = ss.getRangeByName('XxTestRange2').getValues();
  //Remove unused column
  var newSheetsArray = originalSheetsArray.map(function(row){return[row[0],row[2]];});
  //Delete not applicable rows
  var sheetCheckBad = newSheetsArray.filter(function(item){return item[1] != "Not Applicable"});
  //Separate just appicable trades
  var sheetCheck = sheetCheckBad.map(function(row){return[row[0]];});

  for (var i=0; i<sheetCheck.length;i++){
    var sheetNumber = sheetCheck[i];
    //Logger.log(sheetNumber)
    var pasteArray = bigArray.filter(function(item, sheetNumber){return item[0] == sheetNumber})
    //var pasteArray = bigArray.filter(filterSheetLogic)
    Logger.log(sheetNumber);
    Logger.log(pasteArray);
  }
}

//Pull individual Arrays based on sheet numbers
var filterSheetLogic = function(item, sheetNumber){
  if (item[0] == sheetNumber){
    return true;
  } else {
    return false;
  }
}

You can't call that 你不能打电话

 bigArray.filter(function(item, sheetNumber) ...

Because the callback of the filter get its own arguments. 因为过滤器的回调有自己的参数。 In this case sheetNumber always equals the array's index 0 , 1 , 2 etc. 在这种情况下sheetNumber总是等于阵列的索引012等。

My case is building a fabric to generate a valid callback. 我的情况是构建一个结构以生成有效的回调。 For an example 举个例子

/**
 * The big array filter's builder. It's a fabric
 * @param {string} sheetNumber
 * @returns {object} The filter's callback
 */
var filterBuilder_ = function(sheetNumber) {
  return function(item, _, __) {
    return item[0] == sheetNumber;
  };
};

After this change your main loop to 之后,将您的主循环更改为

for (var i = 0; i < sheetCheck.length; i++) {
  var sheetNumber = sheetCheck[i][0];
  var bigArrayfilter = filterBuilder_(sheetNumber);
  var pasteArray = bigArray.filter(bigArrayfilter);
  Logger.log(sheetNumber);
  Logger.log(pasteArray);
}

I apologize if I do not understand the task correctly. 如果无法正确理解任务,我深表歉意。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM