Получать данные по одной ячейке - это ооооооочень долго. Лучше взять все данные сразу в нужном диапазоне, например так:
var data = ss.getActiveSheet().getRange("A3:A1000").getValues();
И потом можно обращаться к этим данным по номеру строки и номеру столбца, не забывая что отсчёт идёт с нуля:
data[row][column]
Записывать тоже нужно массово. В итоге получится что-то такое:
function onOpen() {
//Выполняется при открытии
SpreadsheetApp
.getUi()
.createMenu('Меню')
.addItem('Выполнить','doIt')
.addToUi();
};
function doIt() {
try{
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //Текущий лист
var data1 = ss.getRange("A3:E" + ss.getMaxRows()).getValues();
var data2 = ss
.getRange("m4:n" + ss.getMaxRows())
.getValues()
.filter(function(row) // Убираем пустые строки
{
return row[0]!="";
}
);
for (var row2=0;row2<data2.length;row2++){
for (var row1=0;row1<data1.length;row1++){
if (data1[row1][0]===data2[row2][0]){
data1[row1][4]+=data2[row2][1];
break; //Если значение найдено, дальше не ищем
};
};
};
ss.getRange("A3:E" + ss.getMaxRows()).setValues(data1); //Вывод данных
SpreadsheetApp.getActive().toast("Готово!");
}catch(e){ //Если вдруг ошибка
Logger.log("Ошибка! " + e);
};
}
Демо-таблица