=ARRAY_CONSTRAIN(sort(ТРАНСП(split(ПОВТОР(join("|||";filter(A:A;A:A<>""))&"|||";ОКРУГЛВВЕРХ(СЧЁТЗ(D:D)/СЧЁТЗ(A:A)));"|||")));СЧЁТЗ(D:D);1)
=ARRAY_CONSTRAIN(
sort(
ТРАНСП(
split(
ПОВТОР(
join(
"|||";
filter(
A:A;
A:A<>""
)
)&"|||";
ОКРУГЛВВЕРХ(СЧЁТЗ(D:D)/СЧЁТЗ(A:A))
)
;"|||"
)
)
)
;СЧЁТЗ(D:D);1
)
function test_replaceInRange(){
let rangeAddress = "A:C";
let find = "1";
let replaceWith = "22";
replaceInRange(rangeAddress, find, replaceWith);
};
/**
* Заменяет find на replaceWith в диапазоне rangeAddress
* Telegram - @ProgrammerForever
*
* @param {string} rangeAddress Адрес диапазона
* @param {string} find Что менять
* @param {string} replaceWith На что менять
* @return Не возвращает значений
*/
function replaceInRange(rangeAddress, find, replaceWith){
find = find===undefined?"":(find+"");
replaceWith = replaceWith===undefined?"":(replaceWith+"");
let as = SpreadsheetApp.getActiveSpreadsheet();
let range = as.getRange(rangeAddress);
let values = range.getValues();
let replacedValues = values.map(row=>row.map(el=>(el+"").split(find).join(replaceWith)));
range.setValues(replacedValues);
range.activate();
as.toast("Done!");
};
=ЕСЛИ(A2;"";ваша_формула)
=СУММ(FILTER(данные_для_суммирования;все_заказчики=заказчик))
function onEdit(event) {
//Возникает при изменении ячейки
var ss = event.source.getActiveSheet();//Текущий лист
var address = event.range.getA1Notation().toUpperCase();//Адрес ячейки
var row = event.range.getRow(); //Номер строки
var col = event.range.getColumn(); //Номер столбца
var newValue = event.value; //Новое значение
var oldValue = event.oldValue; //Старое значение
if (["Лист1","Лист2"].indexOf(ss.getName())==-1) return; //Указываем на каких листах должен работать скрипт
//Что-то делаем...
};
=ЕСЛИОШИБКА(СУММПРОИЗВ(filter($B$2:$B$7;$A$2:$A$7=A12);filter($C$2:$C$7;$A$2:$A$7=A12)))