我正在编写一个脚本来存档(复制和删除)电子表格中的行。
为此,我会浏览工作表中的每一行,看看它是否已完成。
我可以通过收集所有行并在结尾处写入值范围来批量处理第一个复制过程。
但是,当需要删除行时,我仍然需要遍历并为每行调用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);
}
有没有办法优化/批量操作?
答案 0 :(得分:1)
如果您只关心值,可以删除整个工作表并粘贴rowsToArchive:
reqSheet.getDataRange().clear().setValues(rowsToArchive);
如果你关心格式化,你可以像处理这些值一样处理它们的数组,几乎所有格式化选项都可以获取和设置,在https://developers.google.com/apps-script/reference/spreadsheet/range中检查它们。
答案 1 :(得分:1)
归档行必须有一些标准。您可以使用相同的标准进行排序,然后一次删除所有内容(也可以复制),然后取消排序吗?