如何使用 GAS 在 for 循环中一次删除多行?
How to delete multiple rows at once in a for loop using GAS?
我知道如果你碰巧需要start
和howManyRowsToDelete
,可以使用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!?
,您希望通过一个请求删除行。
这样的话,下面的修改怎么样?
不幸的是,我无法想象您的电子表格。因此,通过猜测 entregasBD
、retirarItens
和 noEntrega
的值,我修改了您的脚本。
修改后的脚本:
为了实现您的目标,在此脚本中,使用了 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 调用完成。
注:
- 不幸的是,我可能无法正确理解您的实际电子表格和您期望的实际目标。我很担心这个。所以,当这个修改后的脚本没有用时,当你提供示例电子表格时,我认为这会对修改脚本有所帮助。
参考文献:
我知道如果你碰巧需要start
和howManyRowsToDelete
,可以使用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!?
,您希望通过一个请求删除行。
这样的话,下面的修改怎么样?
不幸的是,我无法想象您的电子表格。因此,通过猜测 entregasBD
、retirarItens
和 noEntrega
的值,我修改了您的脚本。
修改后的脚本:
为了实现您的目标,在此脚本中,使用了 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 调用完成。
注:
- 不幸的是,我可能无法正确理解您的实际电子表格和您期望的实际目标。我很担心这个。所以,当这个修改后的脚本没有用时,当你提供示例电子表格时,我认为这会对修改脚本有所帮助。