2015-04-22 61 views
0

我正在处理一个脚本以从电子表格中存档(复制和删除)行。跨非连续行的批行删除

要做到这一点,我通过每一行去工作表,看看它是否完成。

我可以批量通过收集了所有的行和写入的值的范围内的所有在结束所述第一复制过程。

然而,当谈到时间删除行,我还是要循环并为每一行调用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); 
} 

有什么办法来优化/批此操作?

+1

存档行必须有一些标准。你可以使用相同的条件进行排序,然后一次删除所有条目(也可以复制该文件),然后取消排序? –

+0

@SandyGood,很好的建议!只是更新它来使用它。 – KyleMit

+0

好的,我将添加它作为答案。 –

回答

1

必须有归档行的一些标准。你可以使用相同的条件进行排序,然后一次删除所有条目(也可以复制该文件),然后取消排序?