在D列上有两个值-exp和ok;我本来打算删除所有exp行,但是有时会有1000个,并且宏需要很长时间才能完成。
因此,从普通宏中-一次删除1行,我正在尝试删除多行。
function expirate_removed(){
var app = SpreadsheetApp.getActive();
var activesheet = app.getActiveSheet()
var r = activesheet.getRange('D:D');
var v = r.getValues();
for(var i=v.length-1;i>=0;i--)
if( v[0,i-50]=='exp')
activesheet.deleteRows(i-50, 50);
};
我以前已经记录了一个宏来对工作表进行排序,确保所有exp都在底部,以为这可以节省几分钟。
问题是,每当我运行宏时,它都会删除一组50'行,然后给出错误消息,指出行超出范围。
有什么建议吗? (我已经有一个可以一次删除一行的工作版本)
答案 0 :(得分:0)
假设列D已排序,请尝试以下操作:
function expirate_removed(){
var app = SpreadsheetApp.getActive();
var activesheet = app.getActiveSheet();
var r = activesheet.getRange('D:D');
var v = r.getValues();
var startRow = 0;
var endRow = 0;
for(var i=0; i<v.length; i++) {
if(v[i] == 'ok'){
startRow = i+1;
break;
}
}
for(var i=startRow; i<v.length; i++) {
if(v[i] != 'ok'){
endRow = i;
break;
}
}
activesheet.deleteRows(startRow, endRow - startRow + 1);
};
答案 1 :(得分:0)
也许我的理解是错误的,但是您可以使用映射来帮助您更快地获得结果。
function expirate_removed(){
var app = SpreadsheetApp.getActive();
var activesheet = app.getActiveSheet();
var values = activesheet.getRange(1,5,activesheet.getLastRow()).getValues();
var mapValues = values.map(function(r){return r[0]});
mapValues.forEach(function(elt,index){
if(elt == "exp"){
activesheet.deleteRow(index);
}
});