Google 工作表 deleteRow 在我的宏中不起作用
Google Sheets deleteRow not working in my Macro
我正在尝试构建一个宏来清除 D 列上所有具有空值的行。最初,我使用的是我发现的这段代码:
function deleteRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Datos Competidor 2 - EV');
var r = s.getRange('D:D');
var v = r.getValues();
for(var i=v.length-1;i>=0;i--)
if(v[0,i]=='')
s.deleteRow(i+1);
};
然而,对 API 的调用次数过多,这使得它变得非常缓慢,有时甚至会因超时而失败。
我决定将所有满足条件的行添加到列表中,然后将其传递给 deleteRow() 以便使用此代码仅调用一次 API:
function deleteBlankRows() {
emptyRange=[]
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Datos Competidor 2 - EV');
var r = s.getRange('D:D');
var v = r.getValues();
for(var i=v.length-1;i>=0;i--)
if(v[0,i]=='')
emptyRange.push((i)+":"+(i));
ss.getRangeList(emptyRange).activate();
ss.getActiveSheet().deleteRows(ss.getActiveRange().getRow(), ss.getActiveRange().getNumRows());
};
执行似乎工作得很好,在 1 到 2 秒内完成,但是,在执行结束时,删除的行没有选择的那么多。
这是我看到的:
Final result
知道为什么会这样吗?
谢谢!
我相信你的目标如下。
- 您想减少脚本的处理成本。
这样的话,使用表格API怎么样?使用Sheets API时,我认为删除行的处理成本可以降低一点。当 Sheets API 反映在你的脚本中时,它变成如下。
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
function deleteRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Datos Competidor 2 - EV');
var values = s.getRange('D1:D' + s.getLastRow()).getDisplayValues();
var sheetId = s.getSheetId();
var requests = values.reduce((ar, [d], i) => {
if (!d) ar.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i + 1, dimension: "ROWS" } } });
return ar;
}, []).reverse();
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
参考文献:
删除 D 列为空的行
function deleteBlankRows() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const s = ss.getSheetByName('Datos Competidor 2 - EV');
const r = s.getRange('D1:D' + s.getLastRow());
const v = r.getValues().flat();
let d = 0;
v.forEach((e, i) => {
if (!e) {
s.deleteRow(i + 1 - d++)
}
})
}
我正在尝试构建一个宏来清除 D 列上所有具有空值的行。最初,我使用的是我发现的这段代码:
function deleteRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Datos Competidor 2 - EV');
var r = s.getRange('D:D');
var v = r.getValues();
for(var i=v.length-1;i>=0;i--)
if(v[0,i]=='')
s.deleteRow(i+1);
};
然而,对 API 的调用次数过多,这使得它变得非常缓慢,有时甚至会因超时而失败。
我决定将所有满足条件的行添加到列表中,然后将其传递给 deleteRow() 以便使用此代码仅调用一次 API:
function deleteBlankRows() {
emptyRange=[]
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Datos Competidor 2 - EV');
var r = s.getRange('D:D');
var v = r.getValues();
for(var i=v.length-1;i>=0;i--)
if(v[0,i]=='')
emptyRange.push((i)+":"+(i));
ss.getRangeList(emptyRange).activate();
ss.getActiveSheet().deleteRows(ss.getActiveRange().getRow(), ss.getActiveRange().getNumRows());
};
执行似乎工作得很好,在 1 到 2 秒内完成,但是,在执行结束时,删除的行没有选择的那么多。
这是我看到的:
Final result
知道为什么会这样吗?
谢谢!
我相信你的目标如下。
- 您想减少脚本的处理成本。
这样的话,使用表格API怎么样?使用Sheets API时,我认为删除行的处理成本可以降低一点。当 Sheets API 反映在你的脚本中时,它变成如下。
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
function deleteRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Datos Competidor 2 - EV');
var values = s.getRange('D1:D' + s.getLastRow()).getDisplayValues();
var sheetId = s.getSheetId();
var requests = values.reduce((ar, [d], i) => {
if (!d) ar.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i + 1, dimension: "ROWS" } } });
return ar;
}, []).reverse();
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
参考文献:
删除 D 列为空的行
function deleteBlankRows() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const s = ss.getSheetByName('Datos Competidor 2 - EV');
const r = s.getRange('D1:D' + s.getLastRow());
const v = r.getValues().flat();
let d = 0;
v.forEach((e, i) => {
if (!e) {
s.deleteRow(i + 1 - d++)
}
})
}