Google 表格应用程序脚本 - 使用 if 语句的批处理循环
Google Sheets Apps Script - batch loop with if statement
我编写了简单的代码来遍历报表并根据第一列的结果删除未使用的行。只要它说“DEL”,它就会删除该行。
由于它不是批处理循环,因此需要很长时间才能 运行。我知道我应该让它成为一个批处理循环以使其更快,但是在看了很多教程之后我仍然迷路了,主要是因为不知道如何将 IF 语句与数组集成。
代码如下:
function CompVM() {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
var sheet = SpreadsheetApp.getActive().getSheetByName('XML');
sheet.getRange(1,1);
for (var rooow = 3; rooow <= 1554; rooow++){
var checkCell = sheet.getRange(rooow,1).getValue();
if(checkCell == "DEL"){
sheet.deleteRow(rooow);
rooow = rooow - 1;
}
}
app.getUi().alert('Import File prepared, check for errors now');
};
任何人都可以帮助如何从这段代码中快速循环吗?
Maaany 谢谢
解决方案 #1 - 尝试
function CompVM() {
var app = SpreadsheetApp;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('XML');
var data = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
var rowToBeDeleted = [];
for (let rooow in data) {
if (data[rooow].join('') == 'DEL') {
rowToBeDeleted.push(+rooow + 1)
}
};
rowToBeDeleted.reverse().forEach(x => sheet.deleteRow(x));
app.getUi().alert('Import File prepared, check for errors now');
};
您需要一次获取所有值以减少时间
还有其他解决方案:
- 按第 1 列排序,检查 DEL 开始和结束的位置并一次性删除所有行
- 或在必要时使用 batchupdate(见下一节)
解决方案 #2 - 启用 google 张 api 服务
function deleteRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('XML');
var values = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
var sheetId = sheet.getSheetId();
var requests = values.reduce((rowToBeDeleted, [value], i) => {
if (value == 'DEL') rowToBeDeleted.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i + 1, dimension: "ROWS" } } });
return rowToBeDeleted;
}, []).reverse();
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
我编写了简单的代码来遍历报表并根据第一列的结果删除未使用的行。只要它说“DEL”,它就会删除该行。
由于它不是批处理循环,因此需要很长时间才能 运行。我知道我应该让它成为一个批处理循环以使其更快,但是在看了很多教程之后我仍然迷路了,主要是因为不知道如何将 IF 语句与数组集成。
代码如下:
function CompVM() {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
var sheet = SpreadsheetApp.getActive().getSheetByName('XML');
sheet.getRange(1,1);
for (var rooow = 3; rooow <= 1554; rooow++){
var checkCell = sheet.getRange(rooow,1).getValue();
if(checkCell == "DEL"){
sheet.deleteRow(rooow);
rooow = rooow - 1;
}
}
app.getUi().alert('Import File prepared, check for errors now');
};
任何人都可以帮助如何从这段代码中快速循环吗? Maaany 谢谢
解决方案 #1 - 尝试
function CompVM() {
var app = SpreadsheetApp;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('XML');
var data = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
var rowToBeDeleted = [];
for (let rooow in data) {
if (data[rooow].join('') == 'DEL') {
rowToBeDeleted.push(+rooow + 1)
}
};
rowToBeDeleted.reverse().forEach(x => sheet.deleteRow(x));
app.getUi().alert('Import File prepared, check for errors now');
};
您需要一次获取所有值以减少时间
还有其他解决方案:
- 按第 1 列排序,检查 DEL 开始和结束的位置并一次性删除所有行
- 或在必要时使用 batchupdate(见下一节)
解决方案 #2 - 启用 google 张 api 服务
function deleteRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('XML');
var values = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
var sheetId = sheet.getSheetId();
var requests = values.reduce((rowToBeDeleted, [value], i) => {
if (value == 'DEL') rowToBeDeleted.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i + 1, dimension: "ROWS" } } });
return rowToBeDeleted;
}, []).reverse();
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}