复制过滤条件谷歌脚本的值

时间:2021-01-08 16:34:00

标签: google-apps-script google-sheets filter

是否可以在应用过滤器后复制值? 我想忽略隐藏的值。 我需要过滤超过 2000 行的工作表,如果我使用循环需要很长时间。 然后,我用这个:

var filteredRangefec = range.createFilter()
.setColumnFilterCriteria(6,filterCriteria)
.setColumnFilterCriteria(9, filterCriteriafecha)
.getRange();//range.getFilter().remove();
}

但是当我使用 GetValues 取所有值时,过滤而不是过滤

2 个答案:

答案 0 :(得分:0)

这样就可以了。您只需将范围传递给 removeFilteredData() 函数,它就会返回过滤后的数组。

/**
 * @param {SpreadsheetApp.Spreadsheet.Range} range
 * @returns {Array<Array>}
 */
function removeFilteredValues(range) {

  const values = range.getValues();
  const firstRow = range.getRow();
  const sheet = range.getSheet();

  const filteredValues = values.filter((row, i) => {
    return !(sheet.isRowHiddenByFilter(i + firstRow));
  });

  return filteredValues;
}

function main() {
  const range = SpreadsheetApp
    .getActiveSpreadsheet()
    .getActiveSheet()
    .getDataRange();
  
  const result = removeFilteredValues(range);
}

答案 1 :(得分:0)

如果您想检索数据并在 Google Apps 脚本中对其进行操作,您可以创建临时工作表,使用 method:copyTo() 和 copyPasteType PASTE_NORMAL 将过滤后的数据复制到临时工作表并使用 method:getDataRange()method:getValues() 检索数据。

示例数据:

Sample Data

我复制了 TheMaster 答案 here 并添加了一些功能:

function getFilteredValues(){
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var newSheet = activeSpreadsheet.getSheetByName("Temporary");
  //check if existing, delete if yes
  if (newSheet != null) {
    activeSpreadsheet.deleteSheet(newSheet);
  }
  //create new sheet with name Temporary
  newSheet = activeSpreadsheet.insertSheet();
  newSheet.setName("Temporary");

  var dataSheet = activeSpreadsheet.getSheetByName("Sheet1");
  var toFilter = dataSheet.getDataRange();
  var filter = toFilter.createFilter();

  //create criteria
  var criteria = SpreadsheetApp.newFilterCriteria();
  criteria.whenNumberGreaterThan(1200);

  //filter first column using the criteria above
  filter.setColumnFilterCriteria(1, criteria.build());

  //copy filtered data to temporary sheet
  var sourceRange = dataSheet.getFilter().getRange();
  sourceRange.copyTo(
    newSheet.getRange('A1'),
    SpreadsheetApp.CopyPasteType.PASTE_NORMAL,
    false); 

  Logger.log(newSheet.getDataRange().getValues());
  activeSpreadsheet.deleteSheet(newSheet);   
}

输出:

Google Apps Script Logs

注意:您也可以使用它来将数据粘贴到工作表中。