基本上,我想应用一个或多个过滤器,然后选择所有可见的内容并删除选定的行,所有这些都必须通过脚本来完成。但是,我在任何地方都看不到这样的选项(Excel具有特殊的功能,仅选择可见)。例如,一个会话可能从第7行开始,我可以从第7行开始记录宏,然后向下...但是,如果另一个数据集显示了从2开始的可见行,这将如何受到影响?有没有一种简单的方法可以选择所有可见的内容?
答案 0 :(得分:0)
尝试一下:
我不使用过滤器,所以我以前从未做过此事,但是也许这会给您一个开始。
function runOne() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var sr=2;//starting row
var rg=sh.getRange(sr,1,sh.getLastRow()-sr+1,sh.getLastColumn());
var vs=rg.getValues();
var d=0;//deleted row counter
vs.forEach(function(r,i){
if(!sh.isRowHiddenByFilter(i+sr-d)) {
sh.deleteRow(i+sr-d++);
}
});
}
答案 1 :(得分:0)
希望库珀的回答有帮助
我做了一些类似的工作,我使用了一个稍微简化的版本 -
var j = spreadsheet.getLastRow();
var s = SpreadsheetApp.getActive().getActiveSheet();
for (var i = j; i > 1; i--) {
if (!s.isRowHiddenByFilter(i)) {
s.deleteRow(i);
}
}
我从下往上走的原因是,如果从上往下走,那么说如果第 2、3、4 行可见并且我删除了第 2 行 - 那么第 3 行现在变成第 2 行并被跳过删除行的循环。
告诉我进展如何。
编辑: 如果您的最后一行与您使用过滤器的最后一行数据不同,并且您只想删除特定列的数据,请参阅以下代码
var Avals = spreadsheet.getRange("B1:B").getValues();
var j = Avals.filter(String).length;
var s = SpreadsheetApp.getActive().getActiveSheet();
for (var i = j; i > 1; i--) {
if (!s.isRowHiddenByFilter(i)) {
s.getRange('A'+i+':J'+i).deleteCells(SpreadsheetApp.Dimension.ROWS);
//here A is my starting column, and J is my ending column
}
}