【问题标题】:Copy values of filter criteria google script复制过滤条件谷歌脚本的值
【发布时间】:2021-04-14 09:18:48
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    示例数据:

    我复制了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);   
    }
    

    输出:

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

    【讨论】:

    • 这里发生了很多不必要的事情
    • @DmitryKostyuk 这个方法很可能比你的更快
    • @TheMaster 从什么时候开始创建和删除新工作表比在没有不必要的 API 调用的情况下过滤数组更快?
    • @DmitryKostyuk 这样想:创建工作表、copyTo、getValues、删除工作表 - 4 个 API 调用。在您的回答中,根据行数,api 调用的数量是无限的。每个isRowHiddenByFilter 都会调用一次api。
    • @TheMaster 随意在这里运行测试和报告 :) 认真,创建和删除工作表很快吗?
    【解决方案2】:

    这样就可以了。您只需将范围传递给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);
    }
    

    【讨论】:

    • 您好,我想这对我也有帮助,我会尽快尝试。谢谢
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多