/**
*
*/
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);
}
={Лист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+")))
))
=IMPORTXML(
"http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & TEXT(A2;"DD/MM/YYYY");
"//ValCurs/Valute[CharCode=""USD""]/Value"
)
/**
* Get currencies by a date
*/
function run() {
const httpResponse = UrlFetchApp.fetch(
'https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/denni_kurz.txt?date=20.05.2020'
);
const data = Utilities.newBlob(httpResponse.getContent(), 'plain/text')
.getDataAsString()
.split('\n')
.map((line) => line.split('|'))
.slice(1);
console.log(data);
/*
// Paste to a sheet
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
*/
}
spec
- массив имен листов, которые нужно экспортироватьspreadsheet
- копия Таблицы для экспорта/**
*
*/
function runSheet() {
const spec = ['COUNTIF']; // List of sheets for export
const spreadsheet = SpreadsheetApp.openById(
'1TpHUfTvA7xBi4TLnWaplGasDumauA3YyMgXjXeQ2cyo'
).copy('tmp');
spec.forEach(sheetName => {
const dr = spreadsheet.getSheetByName(sheetName).getDataRange();
dr.setValues(dr.getValues());
});
spreadsheet.getSheets().forEach(sheet => {
if (spec.indexOf(sheet.getName()) < 0) spreadsheet.deleteSheet(sheet);
});
const spreadsheetId = spreadsheet.getId();
const file = exportSpreadsheetToFile_(spreadsheetId, 'xlsx');
DriveApp.getFileById(spreadsheetId).setTrashed(true);
return file;
}
exportSpreadsheetToFile_
можно найти тут google-apps-script-snippets/standalone/export_spre...