首页 > 解决方案 > Google Apps 脚本 -- 创建过滤器超时

问题描述

我有一张有 18000 行和 27 列的工作表,所以略低于 500K 行。那里有许多公式派生列。某些列是基于其他派生列派生的。所有这些工作正常。

我想根据三列中的值过滤行。该列中的值为 0 或 1,非常简单。下面是代码,我得到的错误是这样的超时:

例外:访问 ID 为 1NoBj4H7ZpLYJzDSXRfFaMnbHbxtp214vnL 的文档时,服务电子表格超时。

function applyFilter(){  
  var ss = SpreadsheetApp.getActive();
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var filterCriteria=SpreadsheetApp.newFilterCriteria().setHiddenValues(['1']).build();
  var lastRow = sheet.getLastRow(); 
  var lastCol = sheet.getLastColumn(); 
  var range = sheet.getRange(1,1, lastRow, lastCol);
  var filteredRange = range.createFilter().setColumnFilterCriteria(24,filterCriteria).getRange();
  //.setColumnFilterCriteria(25,filterCriteria).setColumnFilterCriteria(27, filterCriteria)
} 

正如你所看到的,我什至尝试在 1 列上设置过滤器,但即使这样它也失败了。我按照建议使用范围,当我从 UI 手动执行时,它可以在一秒钟内进行过滤。

更新 :

我的意图是将此行为作为过滤视图,但是我的任何尝试都没有帮助我实现这一目标。

我采纳了您的想法并尝试使用此代码将过滤后的结果复制到新工作表中

function applyFilter(){  
  var ss = SpreadsheetApp.getActive();
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var filterCriteria=SpreadsheetApp.newFilterCriteria().whenNumberEqualTo(1).build();
  var lastRow = sheet.getLastRow(); 
  var lastCol = sheet.getLastColumn(); 
  var range = sheet.getRange(1,1, lastRow, lastCol);
  //var filteredRange = range.createFilter().setColumnFilterCriteria(24,filterCriteria).setColumnFilterCriteria(25,filterCriteria).setColumnFilterCriteria(27, filterCriteria).getRange();
  var filteredRows = range.getValues().filter(function(row){return (row[23] == 1 && row[24] == 1 && row[26] == 1);});
  SpreadsheetApp.getUi().alert(filteredRows);
  var filteredSheet= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('filteredData');
  if(filteredSheet != null) { 
    SpreadsheetApp.getActiveSpreadsheet().deleteSheet(filteredSheet);
  }
  filteredSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(); 
  filteredSheet.setName("filteredData"); 
  filteredSheet.appendRow(sheet.getRange(1,1,1,lastCol).getValues()[0]);
  filteredRows.forEach(function(r,i){
       filteredSheet.appendRow(r);
  });
  
}  

这很慢,但它奏效了。

标签: google-apps-scriptgoogle-sheets

解决方案


推荐阅读