=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));""))
/**
*
*/
const SETTINGS = Object.freeze({
fns: [
'danon',
'mars',
'curren1',
'curren2',
'vilma',
'seitek',
'radost',
'rolls',
'lysse',
],
});
/**
*
*/
function addTriggers() {
ScriptApp.getProjectTriggers().forEach((trigger) => {
if (
trigger.getEventType() === ScriptApp.EventType.CLOCK &&
SETTINGS.fns.includes(trigger.getHandlerFunction())
) {
ScriptApp.deleteTrigger(trigger);
}
});
SETTINGS.fns.forEach((fn) =>
ScriptApp.newTrigger(fn).timeBased().everyHours(6).create()
);
}
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<>''";)`;
}
/**
*
*/
function runOnce() {
trigger_();
}
/**
*
*/
function trigger_() {
try {
triggerAction();
} catch (error) {
console.error(error.message, error);
} finally {
var hours = 10;
var minutes = 17;
var seconds = 56;
var now = new Date();
var nextTime = new Date();
nextTime.setHours(0, 0, 24 * 3600 + hours * 3600 + minutes * 60 + seconds);
var delta = nextTime.getTime() - now.getTime();
ScriptApp.newTrigger('trigger_')
.timeBased()
.after(delta)
.create();
}
}
/**
*
*/
function triggerAction() {
console.log("I'm fine");
}
triggerAction
- это то, что выполняет ваш скриптrunOnce
- это то, что вы должны запустить один раз при первом запуске вашего триггера. Другие настройки не требуютсяtrigger_
- это и триггер и конфигурация вашего триггера/**
*
* @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);
}