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 шт):

Автор решения: BotYourBiz

Обрабатывать большой массив данных с помощью JS в Google script не очень благодарная работа, которая по каким-то причинам отнимает много ресурсов в времени.

В своей практике также имел дело с необходимостью обработки около 700000 строк.

Частично решил этот вопрос с помощью Class Filter, который есть и каждого класса типа Range & ActiveSheet.

Очевидно он использует какие внутренние алгоритмы Google (типа без всяких лишних проверок, защит и подсчетов используемых ресурсов) Поэтому довольно шустро обрабатывает большое количество строк и выдает диапазон с уже необходимыми строками, которые уже можно обработать JS в зависимости от задач

→ Ссылка