我正在嘗試構建一個宏來擦除列 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 秒內完成,但是,行沒有像執行結束時選擇的那樣被洗掉。
這就是我所看到的:
最后結果
任何想法為什么會發生這種情況?
謝謝!
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您想降低腳本的處理成本。
在這種情況下,使用 Sheets API 怎么樣?當使用 Sheets API 時,我認為洗掉行的程序成本可以減少一點。當 Sheets API 反映在您的腳本中時,它變為如下。
修改后的腳本:
在使用此腳本之前,請在 Advanced Google services 中啟用 Sheets API。
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());
}
參考:
- 方法:電子表格.batchUpdate
- 洗掉維度請求
uj5u.com熱心網友回復:
洗掉 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 )
}
})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474628.html
下一篇:列出谷歌表格中一組日期的唯一年份
