删除 Google 工作表中超过 1 年的行(大型数据集)
Delete Rows older than 1 year in Google Sheets (Large Data Set)
我有一个相当大的数据集,包含大约 40,000 行(每天添加新行)。我想 运行 一个每天删除超过 1 年的行的脚本。
我一直在使用这个工作正常的,但是随着我的数据集变大它超时并且无法 运行。
这是我一直在使用的:
function deleteFIVEoh() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("theFIVEoh");
var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();
var values = datarange.getValues();// get all data in a 2D array
var currentDate = new Date();//today
var yearOld = Date.now() + -365*24*3600*1000;
for (i=lastrow;i>=3;i--) {
var tempDate = values[i-1][4];// arrays are 0 indexed so row1 = values[0] and col12 =.
[11]
if ((tempDate!="") && (tempDate <= (yearOld)))
{
sheet.deleteRow(i);
}
}
}
我的 sheet 上的数据始终按升序排序(最旧的条目在顶部)。有什么办法可以让它更快地工作吗?也许只查看前 500 行?
提前致谢!
-wes
由于您的 sheet 是按升序排序的,因此最好从顶部开始,计算满足您条件的行数,然后使用单个 deleteRows()
方法。
function deleteFIVEoh() {
const MS_IN_ONE_YEAR = 365*24*3600*1000;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("theFIVEoh");
var datarange = sheet.getDataRange();
var values = datarange.getValues();// get all data in a 2D array
var currentDate = new Date();//today
var yearOld = new Date(currentDate.getTime() - MS_IN_ONE_YEAR);
for (i = 0; values[i][4] < yearOld; i++) {}
sheet.deleteRows(1,i);
}
单个调用比循环 API 调用快得多,并且此代码中的迭代次数较少,并且不需要遍历整个 sheet.
执行前的样本:
执行后的样本:
我有一个相当大的数据集,包含大约 40,000 行(每天添加新行)。我想 运行 一个每天删除超过 1 年的行的脚本。
我一直在使用这个工作正常的,但是随着我的数据集变大它超时并且无法 运行。
这是我一直在使用的:
function deleteFIVEoh() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("theFIVEoh");
var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();
var values = datarange.getValues();// get all data in a 2D array
var currentDate = new Date();//today
var yearOld = Date.now() + -365*24*3600*1000;
for (i=lastrow;i>=3;i--) {
var tempDate = values[i-1][4];// arrays are 0 indexed so row1 = values[0] and col12 =.
[11]
if ((tempDate!="") && (tempDate <= (yearOld)))
{
sheet.deleteRow(i);
}
}
}
我的 sheet 上的数据始终按升序排序(最旧的条目在顶部)。有什么办法可以让它更快地工作吗?也许只查看前 500 行?
提前致谢! -wes
由于您的 sheet 是按升序排序的,因此最好从顶部开始,计算满足您条件的行数,然后使用单个 deleteRows()
方法。
function deleteFIVEoh() {
const MS_IN_ONE_YEAR = 365*24*3600*1000;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("theFIVEoh");
var datarange = sheet.getDataRange();
var values = datarange.getValues();// get all data in a 2D array
var currentDate = new Date();//today
var yearOld = new Date(currentDate.getTime() - MS_IN_ONE_YEAR);
for (i = 0; values[i][4] < yearOld; i++) {}
sheet.deleteRows(1,i);
}
单个调用比循环 API 调用快得多,并且此代码中的迭代次数较少,并且不需要遍历整个 sheet.
执行前的样本:
执行后的样本: