如何使用 GAS 在 for 循环中一次删除多行?

How to delete multiple rows at once in a for loop using GAS?

我知道如果你碰巧需要starthowManyRowsToDelete,可以使用deleteRows(start, howManyRowsToDelete),但是如何在for循环中一次删除多行,或者紧随其后!?

for (let n = entregasBD.length - 1; n >= 0; n--) {
  for (let a = 0; a < retirarItens.length; a++) {
    if (entregasBD[n][8] == noEntrega && entregasBD[n][9] == 'Pendente' && entregasBD[n][0] == retirarItens[a][0]) {
      let row = n + 1;
      let qtdMov = retirarItens[a][9]; 
      let qtdPendente = entregasBD[n][5]; 
      let qtdEntrega = entregasBD[n][4];
      qtdPendente = qtdPendente + qtdMov;
      qtdEntrega = qtdEntrega - qtdMov;
      console.log('Qtd de Entrega Final: ' + qtdEntrega)
      if (qtdEntrega == 0) {
        sheetBDEnt.deleteRow(row);//These calls are what I'm trying to avoid
      } else {
        sheetBDEnt.getRange(row, 5, 1, 2).setValues([=[qtdEntrega, qtdPendente]]);
      }
    }
  }
}

感谢您的关注。

我相信你的目标如下。

  • 来自 how to delete multiple rows at once in a for loop, or right after it!?,您希望通过一个请求删除行。

这样的话,下面的修改怎么样?

不幸的是,我无法想象您的电子表格。因此,通过猜测 entregasBDretirarItensnoEntrega 的值,我修改了您的脚本。

修改后的脚本:

为了实现您的目标,在此脚本中,使用了 Sheets API。所以,please enable Sheets API at Advanced Google services.


// do something.
// Please put your script retrieving the values of `entregasBD`, `retirarItens` and `noEntrega`.

const spreadsheetId = "###"; // Please set your Spreadsheet ID.
const sheetId = "###"; // Please set your sheet ID.

const obj = retirarItens.reduce((o, r) => (o[r[0]] = r[9], o), {});
const requests = entregasBD.reduce((ar, [a, , , , e, f, , , i, j], row) => {
  if (i == noEntrega && j == 'Pendente' && obj[a]) {
    let qtdMov = obj[a];
    let qtdPendente = f;
    let qtdEntrega = e;
    qtdPendente = qtdPendente + qtdMov;
    qtdEntrega = qtdEntrega - qtdMov;
    if (qtdEntrega == 0) {
      ar.push({ deleteDimension: { range: { sheetId, startIndex: row, endIndex: row + 1, dimension: "ROWS" } } });
    } else {
      ar.push({ updateCells: { start: { sheetId, rowIndex: row, columnIndex: 4 }, rows: [{ values: [{ userEnteredValue: { numberValue: qtdEntrega } }, { userEnteredValue: { numberValue: qtdPendente } },] }], fields: "userEnteredValue" } });
    }
  }
  return ar;
}, []).reverse();
if (requests.length == 0) return;
Sheets.Spreadsheets.batchUpdate({ requests }, spreadsheetId);
  • 在此修改中,行被表格删除API。而且,这些值使用 Sheets API 放入行中。这样,所有请求都可以通过一个 API 调用完成。

注:

  • 不幸的是,我可能无法正确理解您的实际电子表格和您期望的实际目标。我很担心这个。所以,当这个修改后的脚本没有用时,当你提供示例电子表格时,我认为这会对修改脚本有所帮助。

参考文献: