/**
* Декодирует строку вида %uXXXX%uXXXX и/или %XX в текст
* Боев Григорий (с) 2020 (telegram @ProgrammerForever)
*
* @param {string} encoded Кодированный текст
* @return Декодированный текст
* @customfunction
*/
function uEncode(encoded) {
return encoded.split('%')
.filter(el=>el!='')
.map(el=>el[0]==='u'?el.substring(1):el)
.map(el=>parseInt(el,16))
.map(code=>String.fromCodePoint(code))
.join('');
}
let now = new Date();
let tomorrow = new Date(+now+24*60*60*1000);
let maxRows = sheet.getMaxRows();
let maxColumns = sheet.getMaxColumns();
let data = sheet.getRange(1, 1, maxRows, maxColumns).getValues();
sheet\.getRange\(\s*(.*?)\s*,\s*(.*?)\s*\)\.getValue\(\)
inData[$1][$2]
function setData(){
/* Боев Григорий (с) 2020 (telegram @ProgrammerForever) */
const FIRST_ROW = 3; // Первая строка
const FIRST_OUT_COL = 10; // Первый столбец, Сентябрь
const FIRST_IN_COL = 7; // Первый столбец с исходными данными
const DATA_WIDTH = 3; // Столбцов с данными
const SHEET_NAME = "Лист1"; // Имя листа
let now = new Date();
let month = now.getMonth();//Либо получаете номер месяца (от 0 до 11) анализируя вашу ячеййку
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
let inRange = sheet.getRange(FIRST_ROW, FIRST_IN_COL, sheet.getMaxRows(), DATA_WIDTH);
let inData = inRange.getValues();
let outRange = sheet.getRange(FIRST_ROW, FIRST_OUT_COL + month*DATA_WIDTH, inData.length, DATA_WIDTH);
outRange.setValues(inData);
};
data>=row[data_col] and data1<row[data_col]
=filter(A:A;B:B>=data;B:B<data1)
//Telegram - @ProgrammerForever
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; //Указываем на каких листах должен работать скрипт
//Можно при желании ещё фильтровать по строке/столбцу (row/col), или по старому/новому значению (oldValue/newValue)
const archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Архив");
archive.getRange(archive.getLastRow()+1, 1).setValue(
formatDateTime(new Date())+" " + "[" + ss.getName() + "!" + address + "] '" + (oldValue==undefined?"":oldValue) + "' >> '" + (newValue==undefined?"":newValue) +"'"
);
};
function formatDate(date) {
try{
var dd = date.getDate();
if (dd < 10) dd = '0' + dd;
var mm = date.getMonth() + 1;
if (mm < 10) mm = '0' + mm;
var yy = date.getFullYear() % 100;
if (yy < 10) yy = '0' + yy;
return dd + '.' + mm + '.' + yy;
}catch(err){
return "";
};
}
if (снизу_пусто){ // сыплется вниз
y+=1
} else if (снизу_слева_пусто && снизу_справа_пусто){// сыплется по диагонали в случайную сторону
y+=1
if (rand()>0.5){
x-=1
}else{
x+=1
}
} else if (снизу_справа_пусто){ // сыплется вправо по диагонали
y+=1
x+=1
} else if (снизу_слева_пусто){ // сыплется влево по диагонали
y+=1
x-=1
}