我有超过50,000行的Google表格,我每天都会用新数据进行更新。在一天结束时,我运行一个“ IF”函数,该函数可以帮助我确定是否要删除该行。
然后,我编写了一个脚本,该脚本可浏览工作表并删除特定列中具有“ DEL”的任何行。问题在于,由于我有很多行,因此脚本需要很长时间才能运行。是否有人想出一种更有效的方式来删除/清除行(如果单元格中包含字母“ DEL”)?
function deleteRows() {
var sheet = SpreadsheetApp.getActive().getSheetByName('DEL_test');
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
var rowsDeleted = 0;
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (row[9] == 'DEL') { // Search cells in Column "J" and delete row if cell is equal to "DEL"
sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;
}
}
Browser.msgBox('COMPLETE');
};
答案 0 :(得分:1)
DEL
的行。如何使用Sheets API?使用Sheets API时,一个API调用可以删除几行。这样,将能够降低处理成本。我认为针对您的情况有几种解决方法。因此,请仅考虑其中之一。
使用表格API时,请在高级Google服务和API控制台上启用表格API。您可以在here 上查看有关如何启用Sheets API的信息。
function deleteRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('DEL_test');
var rows = sheet.getDataRange();
var values = rows.getValues();
var spreadsheetId = ss.getId();
var sheetId = sheet.getSheetId();
var reqs = values.reduceRight(function(ar, e, i) {
if (e[9] == 'DEL') {
ar.push({"deleteDimension":{"range":{
"sheetId": sheetId,
"dimension": "ROWS",
"startIndex": values.length - i - 1,
"endIndex": values.length - i,
}}});
}
return ar;
}, []);
Sheets.Spreadsheets.batchUpdate({"requests": reqs}, spreadsheetId);
Browser.msgBox('COMPLETE');
}
如果我误解了您的问题,请告诉我。我想修改它。
如果您不想使用Sheets API,而想使用clearContent()
,那么该示例脚本如何?该示例脚本的流程如下。
function deleteRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('DEL_test');
var rows = sheet.getDataRange();
var values = rows.getValues();
sheet.clearContents();
var val = values.filter(function(e) {return e[9] != 'DEL'});
sheet.getRange(1, 1, val.length, val[0].length).setValues(val);
Browser.msgBox('COMPLETE');
}
答案 1 :(得分:0)
目前,我已经不再希望使用“ deleteRow”,因为它似乎是一个操作缓慢的功能。这导致我暂时使用此脚本。谢谢大家给我的时间。
var spreadsheet = SpreadsheetApp.getActive().getSheetByName('DEL_test');
var rows = spreadsheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
var lr = spreadsheet.getLastRow();
for (var i = 0; i < numRows; i++) {
if (values[i][9] == 'DEL') {
spreadsheet.getRange(i+1, 1, 1, 10).clearContent();
}
}