[英]Delete filtered rows in google sheets script (10000+ rows)
我需要幫助在不超時的情況下刪除工作表中的過濾行。 工作表中有超過 10,000 行,因此使用 DeleteRow() 運行 for 循環超時。
該項目的更大目標是,如果日期超過 31 天,則基本上將數據從主工作表自動歸檔到歸檔工作表。
這是我目前必須執行的當前代碼,但是循環的工作速度非常慢,數據與工作表中的數據一樣多。 如果還有任何其他重大的性能改進,請隨時提出這些建議。 這是我第一次實時使用谷歌應用程序腳本
var ss = SpreadsheetApp.getActiveSpreadsheet();
var copy_sheet = ss.getSheetByName("upload");
var paste_sheet = ss.getSheetByName("archive");
const day = 24 * 60 * 60 * 1000;
var date = new Date();
var remove_before_date = new Date()
remove_before_date.setDate(date.getDate()-31);
var prev_filter = copy_sheet.getFilter();
if (prev_filter !== null) {
prev_filter.remove();
return;
}
//create filter
var range = copy_sheet.getRange("A:I");
var filter = range.createFilter();
var Filter_Criteria = SpreadsheetApp.newFilterCriteria().whenDateBefore(remove_before_date);
var add_filter = filter.setColumnFilterCriteria(1,Filter_Criteria);
//copy and paste
var range = copy_sheet.getDataRange().offset(2,0);
var last_row_archive = paste_sheet.getDataRange().getNumRows();
var last_row_upload = copy_sheet.getDataRange().getNumRows();
paste_sheet.insertRowAfter(last_row_archive)
range.copyTo(paste_sheet.getRange(last_row_archive+1,1));
//delete from upload
for (var i = last_row_upload; i > 2; i--) {
if (!copy_sheet.isRowHiddenByFilter(i)) {
copy_sheet.deleteRow(i);
}
}
//remove filters
filter.remove();
}```
如果你,執行會快得多
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source = ss.getSheetByName('upload');
var target = ss.getSheetByName('archive');
var data = source.getDataRange();
var range = source.getRange(3,1,data.getNumRows()-2, data.getNumColumns());
var values = range.getValues();
var datesCol = 'I'; //replace this with where your dates are
var datesColIndex = source.getRange(datesCol + ':' + datesCol).getColumn()-1;
var lastRowArchive = target.getDataRange().getNumRows();
//this filters data and gets all rows, the date of which earlier then 31 days.
var valuesToRemove = values.filter(function(row) {
var dayInMs= 24 * 60 * 60 * 1000;
return new Date().valueOf() - new Date(row[datesColIndex]).valueOf() >= dayInMs*31;
})
//this creates a new array containing only the remaining rows
var valuesToStay = values.filter(row => !valuesToRemove.includes(row));
//if there are values to remove
if (valuesToRemove.length) {
//clear the range in the source sheet
range.clearContent();
//place valuesToStay array to the source sheet
source.getRange(3,1,valuesToStay.length,valuesToStay[0].length)
.setValues(valuesToStay);
//place valuesToRemove array to end of the target sheet
target.getRange(lastRowArchive+1,1,valuesToRemove.length, valuesToRemove[0].length)
.setValues(valuesToRemove);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.