Моя компания собирает производственные данные несколько десятков раз в день через ответы Google Form. Прямо сейчас лист, на который я буду ссылаться, около 10000 строк. Недавно я откликнулся на некоторый код скрипта Google Apps (из других тем SO и форумов), чтобы удалить строки из большой электронной таблицы, которые старше 7 дней. Во время испытаний (на копии листа) сценарий удалял 3-4 строки в секунду. Теперь код удаляет только одну строку каждые 7-8 секунд. Я не знаю, почему мой код работает так медленно. Что-то не так с моей петлей?
Я пробовал этот код на нескольких других листах во время разработки, и он работал отлично. Когда скрипт был впервые применен к целевому листу, он работал как ожидалось. Однако, когда я снова запустил его несколько дней назад, скрипт выполнялся крайне медленно.
Функция, которая удаляет строки, запускается пользовательской опцией меню, которая загружается при открытии листа в браузере.
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Delete')
.addItem('Delete Rows Older than 7 Days', 'deleteOldEntries')
.addToUi();
}
function deleteOldEntries() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Form Responses 1"); //name of the sheet
//var sheet = ss.getActiveSheet();
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 weekOld = Date.now() + -7*24*3600*1000; //for dates longer than 7 days, change only the 7 to a higher number
for (i=lastrow;i>=2;i--) {
var tempDate = values[i-1][0]; //2D arrays are organized as [row][column]; arrays are 0 indexed so row1 = values[0] and col12 = [11]
if ((tempDate!="") && (tempDate <= (weekOld)))
{
sheet.deleteRow(i);
}
}
}
Я ожидаю, что производительность будет по крайней мере несколько строк в секунду, но фактическая производительность снизилась до 6-7 строк в минуту. Срок действия сценария истекает через 30 минут, что является предустановленным ограничением времени Google (если я не ошибаюсь).
Заранее спасибо!
РЕДАКТИРОВАТЬ: Вот частичная запись выполнения из последнего выполнения кода (вся запись выполнения была довольно длинной). Кажется, что почти все записи из последнего сеанса, проведенного этим утром, превышают 4 секунды.
[19-05-31 08:57:24:875 EDT] Sheet.deleteRow([5681]) [4.048 seconds]
[19-05-31 08:57:29:295 EDT] Sheet.deleteRow([5680]) [4.419 seconds]
[19-05-31 08:57:34:013 EDT] Sheet.deleteRow([5679]) [4.718 seconds]
[19-05-31 08:57:38:561 EDT] Sheet.deleteRow([5678]) [4.547 seconds]
[19-05-31 08:57:42:991 EDT] Sheet.deleteRow([5677]) [4.43 seconds]
[19-05-31 08:57:47:599 EDT] Sheet.deleteRow([5676]) [4.607 seconds]
[19-05-31 08:57:52:122 EDT] Sheet.deleteRow([5675]) [4.522 seconds]
[19-05-31 08:57:56:683 EDT] Sheet.deleteRow([5674]) [4.56 seconds]
[19-05-31 08:58:00:950 EDT] Sheet.deleteRow([5673]) [4.266 seconds]
[19-05-31 08:58:05:450 EDT] Sheet.deleteRow([5672]) [4.5 seconds]
[19-05-31 08:58:10:349 EDT] Sheet.deleteRow([5671]) [4.898 seconds]
[19-05-31 08:58:14:736 EDT] Sheet.deleteRow([5670]) [4.387 seconds]
[19-05-31 08:58:19:697 EDT] Sheet.deleteRow([5669]) [4.96 seconds]
[19-05-31 08:58:28:412 EDT] Sheet.deleteRow([5668]) [8.714 seconds]
[19-05-31 08:58:33:601 EDT] Sheet.deleteRow([5667]) [5.189 seconds]
[19-05-31 08:58:38:845 EDT] Sheet.deleteRow([5666]) [5.243 seconds]
[19-05-31 08:58:43:313 EDT] Sheet.deleteRow([5665]) [4.468 seconds]
[19-05-31 08:58:47:964 EDT] Sheet.deleteRow([5664]) [4.65 seconds]
[19-05-31 08:58:52:947 EDT] Sheet.deleteRow([5663]) [4.982 seconds]
[19-05-31 08:58:58:172 EDT] Sheet.deleteRow([5662]) [5.223 seconds]
[19-05-31 08:59:03:036 EDT] Sheet.deleteRow([5661]) [4.864 seconds]
[19-05-31 08:59:07:957 EDT] Sheet.deleteRow([5660]) [4.92 seconds]
[19-05-31 08:59:12:727 EDT] Sheet.deleteRow([5659]) [4.769 seconds]
[19-05-31 08:59:12:800 EDT] Execution failed: Exceeded maximum execution time [1,803.124 seconds total runtime]