id
.VLOOKUP
=ARRAYFORMULA(IFERROR({
'Лист1'!A1:J1;
VLOOKUP(UNIQUE('Лист1'!A2:A);SORT('Лист1'!A:J;4;0;1;1);COLUMN('Лист1'!A1:J1);)
};""))
SORTN
={
'Лист1'!A1:J1;
SORTN(SORT('Лист1'!A2:J;1;0;4;0);9^9;2;1;1)
}
SORTN
={
'Лист1'!A1:J1;
SORTN(SORT('Лист1'!A2:J;1;0;4;0);9^9;2;1;1;4;1)
}
display_ties_mode
отслеживает уникальные для каждого из комбинации первой и четвертой колонки. Т.е. выбирает для каждой уникальной комбинации id
и Updated at
первое вхождение в массив.SORTN
.=ARRAYFORMULA(IFERROR(VLOOKUP(
A2:A&C2:C;
{
UNIQUE(A2:A&C2:C)\
REGEXREPLACE(TRIM(TRANSPOSE(QUERY(
IF(TRANSPOSE(UNIQUE(A2:A&C2:C))=A2:A&C2:C;B2:B & ", ";"");;ROWS(A2:A))
));"(\s*,)+$";"")
};
2;
);""))
ARRAYFORMULA
, это то, что ARRAYFORMULA
вернет тоже, что и ARRAYFORMULA(ARRAYFORMULA(ARRAYFORMULA))
. Не знаю, насколько это важно для вас сейчас, но это принципиальное знание.=SORT(FILTER({A2:A;B2:B;C2:C};{A2:A;B2:B;C2:C}<>"");1;1)
=FILTER(SORT(FLATTEN(A2:C);1;1);SORT(FLATTEN(A2:C);1;1)<>"")
=ARRAYFORMULA(IFERROR(UPPER(LEFT(F2:F;1)) & LOWER(RIGHT(F2:F;LEN(F2:F)-1));""))
function include(filename) {
return HtmlService.createHtmlOutputFromFile(filename)
.getContent();
}
<style>
Тут код вашего BS
</style>
<script>
Тут код вашей JQ
</script>
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!= include('bs'); ?>
</head>
<body>
<h1>Welcome</h1>
<p>Please enjoy this helpful script.</p>
<?!= include('jq'); ?>
</body>
</html>
function showSidebar() {
var htmlTemplate = HtmlService
.createTemplateFromFile('client');
SpreadsheetApp.getUi().showSidebar(htmlTemplate.evaluate()
.setTitle('Цвет текста в ячейке поменялся'));
}
=GETFORMULA("A:D")
function GETFORMULA(nota) {
const sheet = SpreadsheetApp.getActiveSheet().getName();
const list = SpreadsheetApp.getActive()
.getSheets()
.map((sheet) => sheet.getName())
.filter((name) => name !== sheet)
.map((name) => `'${name}'!${nota}`)
.join('; ');
return `=QUERY({${list}};"where Col1<>''";)`;
}
/**
*
* @param {GoogleAppsScript.Spreadsheet.Sheet} sheet
* @param {Array.<Array.<string>>} data
* @return {GoogleAppsScript.Spreadsheet.Range}
*/
function appendData(sheet, data) {
const lastRow = sheet.getLastRow() + 1;
return sheet
.getRange(lastRow, 1, lastRow + data.length, data[0].length)
.setValues(data);
}
={Лист1!A2:C10;Лист2!A2:C10;Лист3!A2:C10}
=FILTER({'1'!A:H;'2'!A:H;'3'!A:H;'4'!A:H};{'1'!A:A;'2'!A:A;'3'!A:A;'4'!A:A}<>"")
=ARRAYFORMULA(ROW(A:A) - 1)
={"Номер ответа";ARRAYFORMULA(ROW(A2:A) - 1)}
={"Номер ответа";ARRAYFORMULA(MATCH(A2:A;SORT(A2:A;1;1);0))}
=REGEXREPLACE(B16;"\.";",")
/**
* @OnlyCurrentDoc
*/
/**
*
* The RAINREPORT function
*
* @param {rain} rain Two-column data array
* @param {boolean} skipEmpty
* @return {any[][]}
* @customfunction
*/
function RAINREPORT(rain, skipEmpty = true) {
const _rain_ = rain.map((row) => row[0]);
const _cloud_ = rain.map((row) => row[1]);
const _report_ = {};
_rain_.forEach((item, i) => {
if (_cloud_[i] === '' && skipEmpty === true) return;
if (!Object.prototype.hasOwnProperty.call(_report_, _cloud_[i]))
_report_[_cloud_[i]] = {
data: [],
name: _cloud_[i],
};
if (_report_[_cloud_[i]].data.indexOf(item) === -1)
_report_[_cloud_[i]].data.push(item);
});
return Object.keys(_report_)
.sort()
.map((key) => [key, ..._report_[key].data.sort()]);
}
=TRANSPOSE(RAINREPORT(
QUERY(
ДАННЫЕ_ВЫДАЧИ;
"select C,E where " &
TEXTJOIN(" and ";1;IF(A1="ВСЕГО";"";"A='" & A1 & "'");"D < " & REGEXEXTRACT(B1;"\d+")))
))