AppsScript правильная обработка 100 000 строк
Моя проблема, что у скрипта не хватает времени для обработки такого кол-ва строк.
Сама задача простая. Делаю кнопку в таблице по который идёт подсчет значений за выбранную дату или диапазон в другой таблице и вставляются результаты. Сейчас собираю результаты через формулу c запросом к диапазону, но таблица при этом около 15 мин подгружается. Пока не перевалило за 36 тыс строк. Брал по 1000, записывал результаты в ассоциотивный массив и вставлял в таблицу. Но после 36 тыс скрипт останавливается. Каждый день добавляю ~1500 строк, в конце месяца удаляю данные предидущий месяц.
Последний вариант который успевает обработать наибольшее кол-во строк:
// Ассоциотивный массив в который записываем собранные данные
var busines = {kovalev:{name:"ИП Попкин",ordersPc:[0,0,0],ordersRub:[0,0,0],salesPc:[0,0,0],salesRub:[0,0,0],advertPc:[0,0,0],advertRub:[0,0,0]},
soldatova:{name:"ИП Писькин",ordersPc:[0,0,0],ordersRub:[0,0,0],salesPc:[0,0,0],salesRub:[0,0,0],advertPc:[0,0,0],advertRub:[0,0,0]},
poberejnaia:{name:"ИП Сиськин",ordersPc:[0,0,0],ordersRub:[0,0,0],salesPc:[0,0,0],salesRub:[0,0,0],advertPc:[0,0,0],advertRub:[0,0,0]}};
var range = sheet.getRange(firstRow,1,lastRows,1).getValues(); // Поучаю колонку с датами
if(Utilities.formatDate(new Date(range[i][0]), "GMT+3", 'yyyy-MM-dd') == varDate){ // Проверяем дату
indexRow.push(i+1) // Собираем индексы строк с нужной датой в массив
}
for (var i=0; i<indexRow.length; i++) { // Обходим все собраные индексы строк
var range = sheet.getRange(indexRow[i],41,1,1).getValues(); // получаем строку со всеми столбцами по индексу
for(var keyBis in busines){ // Перебираю ключи массива
// Раскладываю значения по массиву
if(range[0][0]=='Футболки'){
busines[keyBis].ordersPc[0] = busines[keyBis].ordersPc[0] + rangeCol[0][0]; // Складываем штуки Футболок
busines[keyBis].ordersRub[0] = busines[keyBis].ordersRub[0] + rangeRub[0][0]; // Складываем рубли Футболок
}else if (range[0][4]=='Кружки'){
busines[keyBis].ordersPc[1] = busines[keyBis].ordersPc[1] + range[0][10]; // Складываем штуки Кружек
busines[keyBis].ordersRub[1] = busines[keyBis].ordersRub[1] + range[0][22]; // Складываем рубли Кружек
} else {
busines[keyBis].ordersPc[2] = busines[keyBis].ordersPc[2] + range[0][10]; // Складываем штуки Остальное
busines[keyBis].ordersRub[2] = busines[keyBis].ordersRub[2] + range[0][22]; // Складываем рубли Остальное
}
}
}
Пробовал получать не всю строку, а только нужные ячейки. Оказалось ещё дольше
var range = sheet.getRange(`AO${indexRow[i]}`).getValues(); // Название Юр.Лица
var rangeCol = sheet.getRange(`K${indexRow[i]}`).getValues(); // Кол-во
var rangeRub = sheet.getRange(`W${indexRow[i]}`).getValues(); // Сумма
Фактически мне нужно получить 1-2 тыс строк и дальше обработать/ Может ли кто-то подсказать как правильно получить выборку из такого количества строк и возможно ли это?
Ответы (1 шт):
Обрабатывать большой массив данных с помощью JS в Google script не очень благодарная работа, которая по каким-то причинам отнимает много ресурсов в времени.
В своей практике также имел дело с необходимостью обработки около 700000 строк.
Частично решил этот вопрос с помощью Class Filter, который есть и каждого класса типа Range & ActiveSheet.
Очевидно он использует какие внутренние алгоритмы Google (типа без всяких лишних проверок, защит и подсчетов используемых ресурсов) Поэтому довольно шустро обрабатывает большое количество строк и выдает диапазон с уже необходимыми строками, которые уже можно обработать JS в зависимости от задач