Search code examples
google-apps-scriptfilterv8

Filter column on multiple criteria and copy to different sheet


I want to move filtered data from one sheet to a different sheet.

I can do this for a single filtered value ex: Money but I want to filter on multiple values from an array ex: ["Money", "Society", "Impacts"]

I can not figure out how to loop through the filterValues array and collect all the values from the different filterValues.

I just get the filtered values of rawData for the last value in filterValues

I can do this a different way but I am trying to get a better understanding of filtering

function myFunction() {
  var filterValues = ["Money", "Society"]; //filter values.
  var col = 5; // column "E".
  var sheetName = "Elements";

  var ss      = SpreadsheetApp.getActiveSpreadsheet();
  var sht     = ss.getSheetByName(sheetName);
  var rng     = sht.getDataRange();
  var rawData = rng.getDisplayValues();
  
  var out = rawData.filter(dataFilter);
  
  function dataFilter(arr) {
      return arr[col-1]== filterValues;
  }

  const osh=SpreadsheetApp.getActive().getSheetByName("A"); 
  osh.clear();
  osh.getRange(1,1,out.length,out[0].length).setValues(out);
};

tried this

for (var i = 0; i <= filterValues.length-1; i++) {
  var out = rawData.filter(dataFilter);
  
  function dataFilter(arr) {
      return arr[col-1]== filterValues[i];
    }
   }

Solution

  • You can use array.includes() to check if the current row column e value is listed in your filterValues for your array filter function.

    Sample code:

    function myFunction() {
      var filterValues = ["Money", "Society"]; //filter values.
      var col = 5; // column "E".
      var sheetName = "Elements";
    
      var ss      = SpreadsheetApp.getActiveSpreadsheet();
      var sht     = ss.getSheetByName(sheetName);
      var rng     = sht.getDataRange();
      var rawData = rng.getDisplayValues();
    
      var out = rawData.filter(dataFilter);
      
      function dataFilter(arr) {
        return filterValues.includes(arr[col-1]);
      }
      Logger.log(out);
      const osh=SpreadsheetApp.getActive().getSheetByName("A"); 
      osh.clear();
      osh.getRange(1,1,out.length,out[0].length).setValues(out);
    };
    

    What it does?

    1. Get the data range values
    2. Filter the 2-d array values if column E value was found in your filterValues array.
    3. Write the filtered array on the destination sheet.

    Output:

    Source Sheet: Elements

    enter image description here

    Destination Sheet: A

    enter image description here