我正在處理一個腳本以從電子表格中存檔(複製和刪除)行。跨非連續行的批行刪除
要做到這一點,我通過每一行去工作表,看看它是否完成。
我可以批量通過收集了所有的行和寫入的值的範圍內的所有在結束所述第一複製過程。
然而,當談到時間刪除行,我還是要循環併爲每一行調用sheet.deleteRow()
一次。我不能使用sheet.deleteRows()
,因爲行不連續。
這裏是我試圖使用腳本方式的一例:
function archiveRows_(archiveSheet, sheetID) {
// get req values
var reqSpreadSheet = SpreadsheetApp.openById(sheetID);
var reqSheet = reqSpreadSheet.getSheetByName("Mstr_Wrkbk");
var currentValues = reqSheet.getDataRange().getValues();
// container for staged data
var rowsToArchive = [];
var rowsToDelete = [];
// check for archivable content
var currentRows = currentValues.length;
for (i = 0; i < currentRows - 1; i++) {
var row = currentValues[i]
// check if we meet the criteria for archival
if (shouldArchive_(row)) {
// add row to archive list
rowsToArchive.push(row);
rowsToDelete.push(i + 1);
}
}
// archive rows if we found some
var numRows = rowsToArchive.length; if (!numRows) return 0;
var numCols = rowsToArchive[0].length;
// add rows to archive sheet
var nextFreeRow = archiveSheet.getLastRow();
archiveSheet.insertRows(nextFreeRow + 1, numRows);
// write archive rows
archiveSheet.getRange(nextFreeRow + 1,1, numRows, numCols).setValues(rowsToArchive);
// Committ Changes
SpreadsheetApp.flush();
// delete original rows (we have to loop backwards so delete works)
for (i = rowsToDelete.length - 1; i >= 0; i--) {
// delete row from master sheet
var rowNum = rowsToDelete[i];
reqSheet.deleteRow(rowNum);
}
// Committ Changes
SpreadsheetApp.flush();
return numRows;
}
這是這部分是運行非常緩慢:
// delete original rows (we have to loop backwards so delete works)
for (i = rowsToDelete.length - 1; i >= 0; i--) {
// delete row from master sheet
var rowNum = rowsToDelete[i];
reqSheet.deleteRow(rowNum);
}
有什麼辦法來優化/批此操作?
存檔行必須有一些標準。你可以使用相同的條件進行排序,然後一次刪除所有條目(也可以複製該文件),然後取消排序? –
@SandyGood,很好的建議!只是更新它來使用它。 – KyleMit
好的,我將添加它作爲答案。 –