跨越非连续行

时间:2015-04-22 14:02:32

标签: google-apps-script google-sheets

我正在编写一个脚本来存档(复制和删除)电子表格中的行。

为此,我会浏览工作表中的每一行,看看它是否已完成。

我可以通过收集所有行并在结尾处写入值范围来批量处理第一个复制过程。

但是,当需要删除行时,我仍然需要遍历并为每行调用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);
}

有没有办法优化/批量操作?

2 个答案:

答案 0 :(得分:1)

如果您只关心值,可以删除整个工作表并粘贴rowsToArchive:

reqSheet.getDataRange().clear().setValues(rowsToArchive);

如果你关心格式化,你可以像处理这些值一样处理它们的数组,几乎所有格式化选项都可以获取和设置,在https://developers.google.com/apps-script/reference/spreadsheet/range中检查它们。

答案 1 :(得分:1)

归档行必须有一些标准。您可以使用相同的标准进行排序,然后一次删除所有内容(也可以复制),然后取消排序吗?