google-apps-script - 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);
});
}
这很慢,但它奏效了。
解决方案
推荐阅读
- c - 使用以下代码将 50 MHz 信号频率缩放至 1MHz。发生“endmodule”错误
- java - 无法使用 JMF 播放视频
- visual-studio-code - VS CODE 终端无法使用代理
- python - 如何使用 NumPy 创建一个 3 X 3 矩阵
- javascript - 删除 .txt 文档的前 25 行
- javascript - 当我在 vue 路由器中传递一个对象时,我得到了 [object Object]
- linux - 系统管理员将 vm 迁移到 azure
- android - 如果 Android Service 不是线程,为什么说它在后台运行?
- python - 为什么我只能得到谷歌地图的第 6 个结果(刮)?
- eslint - WebStorm 不会自动修复 ESLint 规则