删除重复的行-应用程序脚本超时错误



我有一个很长的数据表,我在其中使用此脚本删除基于列B的行。

因为有很多数据,我面临超时错误。如何更改我的脚本以绕过谷歌应用程序脚本运行限制?

function deleteDuplicate() {
var sheetName = "1hr Data"; // Please set the sheet name.
var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
// get values of column C
var col = sh.getDataRange().getValues().map(x => x[1]);
// get indexes of duplicated values in the column
var duplicates = col.map((x,i) => 
col.slice(i+1).includes(x) ? i+1 : '').filter(String); 
// remove rows by the indexes
duplicates.reverse().forEach(x => { sh.deleteRow(x); SpreadsheetApp.flush() });
}

下一个代码对我来说适用于10K行

function deleteDuplicate() {
var sheetName = "1hr Data"; // Please set the sheet name.
var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
// get values of column C
var col = sh.getDataRange().getValues().map(x => x[1]);
// get indexes of duplicated values in the column
var duplicates = col.map((x, i) =>
col.slice(i + 1).includes(x) ? i + 1 : '').filter(String);
if (duplicates.length) {
const requests = duplicates.reverse().map(index => {
const deleteDimensionRequest = Sheets.newDeleteDimensionRequest();
deleteDimensionRequest.range = Sheets.newDimensionRange();
deleteDimensionRequest.range.dimension = 'ROWS';
deleteDimensionRequest.range.sheetId = sh.getSheetId();
deleteDimensionRequest.range.startIndex = index - 1;
deleteDimensionRequest.range.endIndex = index;
const request = Sheets.newRequest();
request.deleteDimension = deleteDimensionRequest;
return request;
});
const batch = Sheets.newBatchUpdateSpreadsheetRequest();
batch.requests = requests;
Sheets.Spreadsheets.batchUpdate(batch, SpreadsheetApp.getActive().getId());
}
}

您可以对此进行优化。例如,如果要删除的行是相邻的。

请注意,必须启用图纸高级服务。

此外,@cooper words 还有另一种方法

function deleteDuplicate1() {
var sheetName = "1hr Data"; // Please set the sheet name.
var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
const values = sh.getDataRange().getValues();
var col = values.map(x => x[1]);
const data = values.filter((x, i) => String(col.slice(i + 1).includes(x[1]) ? i + 1 : ''));
sh.clearContents().getRange(1, 1, data.length, data[0].length).setValues(data);
}

这取决于您的电子表格。如果你不使用公式,并且可以容忍setValues((的广泛使用,那么我经常通过将行存储在二维数组中来保留我想要的行。我将清除整个数据空间,并将其替换为一个setValues((,这比一次删除一行要快得多。然而,这通常会给使用单元格公式的人带来问题。所以这取决于你如何使用电子表格。

相关内容

最新更新