Volond Apps
221 subscribers
216 photos
28 videos
22 files
994 links
Программирование для души и от лени
Добро пожаловать! У нас есть отличное сообщество любителей Excel и VBA, Google Sheet и Google Apps Script, а также всех тех, кто готов работать с этим программным обеспечением. Присоединяйтесь к нам, чтобы задавать и от
Download Telegram
Первая статья цикла
Object.assign VS Spread
"Когда вам нужно использовать Object.assign"
Я хотел бы добавить этот простой пример, когда вам нужно использовать Object.assign.

class SomeClass {
constructor() {
this.someValue = 'some value';
}

someMethod() {
console.log('some action');
}
}


var e = () => {


const objectAssign = Object.assign(new SomeClass(), {});
objectAssign.someValue; // ok
objectAssign.someMethod(); // ok

const spread = {...new SomeClass() };
console.log(spread.someValue); // ok
console.log(spread.someMethod()); // Error:spread.someMethod is not a function! there is no methods of SomeClass!


}
Вторая статья цикла
Object.assign VS Spread
Когда вам нужно использовать Object.assign. тут
А также научимся получать имя объекта из самого объекта
Превращать строковое имя объекта в сам объект
Скрывать свойства и методы объекта из перечисляемых свойств
Объединять объекты в один

var USER = {
['b']: 'b',
['getName']: () =>"USER",
}
var MSG = {
['a']: 'a',
['getName']: () => "MSG",
}

var f=()=>{
//Получаем из строки имен обьектов разделенных запятыми эти обьекты как объекты JS
var string = 'USER,MSG'
var objs = string.split(",").map(el => eval(el)) //
// Скрываем в этих обьектах метод getName
const enumerableProperty = (property, obj) => obj => Object.defineProperty(obj, property, { enumerable: false });
const enumerableGetName = enumerableProperty('getName')
objs.forEach(enumerableGetName)
objs.forEach(el => console.log(Object.keys(el)));
//Обьеденяем в один обьект
var asassignObj=objs.reduce((total,el)=>{
total=Object.assign({},total,el);
return total
},{});
console.log(asassignObj)
}
Экранирование специальных символов внутри регулярного выражения для javascript?

f
unction escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}

#JS #snippet #RegExp
={"#";SEQUENCE(COUNTA(C2:C);1;2)}
подробно
function PIB(text) {
if(!Array.isArray(text)){text=[[text]]}
//var text=[['А.В. Петров.'],['С.А. Васильев, И. Г. Безфамильный']]
text=text.filter(e=>!!e[0])
var ws=text.map(q=>q[0].split(","))
var f=(m)=>m.split(".").map(s=>s.trim()).filter(el=>!!el)
var z=(z)=>{
var [a,b,c]=f(z)
return [c,[a+".",b+"."].join(' ')].join(" ")
}
var res=ws.map(r=>[r.map(u=>z(u)).join(",").trim()])
console.log(res)
return res

}
//Пример удаления задвоеных пробелов и пробелов в начале и конце в JavaScript:
Text=' иванов сергей иванович '
Text = Text.replace(/ {1,}/g," ").trim();

//Пример удаления разрывов строк в JavaScript:
Text = Text.replace(/(\r\n|\n|\r)/gm," ");
console.log(Text);

//Text='иванов сергей иванович'
console.log(Text.split(" ").map(word=>{
var [ferst,...rest]=[...word]
return [ferst.toUpperCase(),rest.join('').toLowerCase()].join('')
}).join(' '))
//return Иванов Сергей Иванович
//Text='иванов сергей иванович'
console.log(Text.split(" ").map((word,i)=>{
var [ferst,...rest]=[...word]
return i?[ferst.toUpperCase()+'.']:[ferst.toUpperCase(),rest.join('').toLowerCase()].join('')
}).join(' '))
//return Иванов С. И.
var Text='Иванов С. И.'
var [ferst,two,tree]=Text.split(" ");
Text= [two,tree,ferst].join(' ')
console.log(Text)
//return С. И. Иванов
Выполнить что то по onEdit() в зависимости от имени листа
const sheet1=()=>console.log('sheet1')
const sheet2=()=>console.log('sheet2')
function onEdit(e){
var eNameSheet=e.range.getSheet().getName()
var sheetNameAction=['Sheet1','Sheet2']
var reduser={
['Аркуш1']:sheet1,
['Аркуш2']:sheet2,
}

reduser[eNameSheet]()

}
Повторим каждое значения в столбце указанное количество раз
var range = [
[1],
[''],
[2]
]
var n = 3
const dublik = (n, range) => range.reduce((total, el) => {
if (el[0]) {
var temp = []
temp.length = n
total.push(temp.fill([el[0]]))
};
return total;
}, []).flat();
console.log(dublik(n, range));
//return [ [ 1 ], [ 1 ], [ 1 ], [ 2 ], [ 2 ], [ 2 ] ]
Разделить текст после каждого n-го слова в Google Sheet (с помощью Regex и Split)
Логика:
1.Вставьте разделитель рыб после каждого n-го слова - используя REGEXREPLACE.
2.Разделите текст по разделителям рыбы - с помощью SPLIT.
3.Наконец, измените разделенные столбцы на строки - используя TRANSPOSE.

=TRANSPOSE(split(REGEXREPLACE(A1;"(([a-zA-Zа-яА-Я'‘’:.,_?!”“)(}{\]\[]+\s){5})"; "$1🐬");"🐬"))
Volond Apps
Photo
Добавим группы разрядов
/Добавим группы разрядов
// Декларативно
var thousandSeparator = function(str) {
var parts = (str + '').split('.'),
main = parts[0],
len = main.length,
output = '',
i = len - 1;

while (i >= 0) {
output = main.charAt(i) + output;
if ((len - i) % 3 === 0 && i > 0) {
output = ' ' + output;
}
--i;
}

if (parts.length > 1) {
output += '.' + parts[1];
}
return output;
};
//ФП
const toCent = num => num * 100;
const divideBy100 = num => num / 100;
const roundTo2dp = num => num.toFixed(2);
const addDollarSign = str => '$' + String(str);
const addSeparators = str => {
// add commas before the decimal point
str = str.replace(/(?<!\.\d+)\B(?=(\d{3})+\b)/g, ` `);
// add commas after the decimal point
str = str.replace(/(?<=\.(\d{3})+)\B/g, ` `);
return str;
};
const compose = (...fns) => x => fns.reduceRight((res, fn) => fn(res), x);
const centsToDollars = compose(
addSeparators,
addDollarSign,
roundTo2dp,
divideBy100,
toCent,
);
console.log(thousandSeparator('12345678.9')) //12 345 678.9

console.log(centsToDollars('12345678.9')) //$12 345 678.90
Можно ли сделать функцию getCommenters () в скрипте Google Apps?

Class DriveApp File скрипта Google Apps содержит следующие методы:

getViewers()
getEditors()

Но метод getCommenters недоступен.
(Это интересно, поскольку addCommenter addCommenters addCommenter , addCommenters и removeCommenter .)

Я делаю сценарий, в котором меняю права доступа к файлам и папкам на основе адресов электронной почты в электронной таблице.
Я хотел бы иметь функциональность getCommenters чтобы я мог сравнить, являются ли электронные письма комментатора в электронной getCommenters уже комментариями к файлу, поэтому не нужно будет снова addCommenters эти электронные письма с помощью addCommenters .
(Нажатие на него создаст новое электронное письмо для пользователя.)
Нет проблем в том, чтобы сделать это со средствами просмотра и редакторами, так как методы доступны.

Вопрос: возможно ли создать функцию, которая будет имитировать предполагаемую функциональность getCommenters ? Или хотя бы вытащить массив адресов электронной почты комментаторов?
Ответ
getViewers() возвращает зрителей и комментаторов. Вы можете отфильтровать список, используя getAccess() :

const getCommenters = (file) =>
file.getViewers().filter(user=>
file.getAccess(user) == "COMMENT")
Определение конкретного типа любого объекта
/*Определение конкретного типа любого объекта
Как мы знаем, в JavaScript есть пять примитивных типов данных и объектный тип данных.
Но знаете ли вы, что объектный тип данных можно подразделить на множество начальных типов?
Объект может быть ARRAY, FUNCTION, MAP,REGEXP и т. д.
Если мы хотим получить конкретный тип объекта, что нам делать?
*/

function toRawType(value) {
let _toString = Object.prototype.toString;

let str = _toString.call(value)

return str.slice(8, -1)
} //

console.log(toRawType(/\s/i)) // RegExp
console.log(toRawType([1, 2])) //Array
console.log(toRawType((() => console.log('1')))) //Function
#Snippet
Как правильно задавать вопросы, если ты начинающий айтишник
Тем
, кто уже стал, или еще только мечтает стать начинающим разработчиком, я могу дать следующие рекомендации:



1.Изучайте проблему самостоятельно
2.Сначала сообщайте цель, потом озвучивайте проблему
3.Пишите грамотно и по существу
4.Задавайте вопросы по адресу и делитесь решением
4.Уважайте чужое время
5.Смотрите шире


А теперь подробнее.
Изучаю Proxy
В
Google Apps Script, в связи с переходом на версию V8 , появилась новая возможность, которая пока используется не особенно широко. Речь идёт о прокси-объектах.

Прокси позволяют создавать обёртки для других объектов, организовывая перехват операций доступа к их свойствам и операций вызова их методов.
Причём, это работает даже для несуществующих свойств и методов проксируемых объектов.
далее
Замена по словарю

В дружественном чате возник вопрос если в тексте встречаются буквы латиницы которые похожи на кириллицу,как их найти и заменить.Получилось вполне симпатично ,причем данный #snippet вполне можно применять для решения задачи "Замена по словарю"
Принцип разделения функциональности (в табличных процессорах)
@oshliaer
ПРФ (в электронных таблицах) - предложение не использовать смешение функций табличных процессоров (ТП). Если разделить функции ТП на хранение, обработку и представление, то можно значительно упростить использование и расширить функционал рабочей модели, которую обслуживает ТП. Самый простой способ достижения этого - использовать правило: "одна функция - один лист". Например, для Таблицы Гугл, которая получает данные из Формы, функцию хранения выполняет лист, привязанный к Форме. Если необходимо как-то модифицировать данные, то необходимо использовать второй лист, для обработки. Если требуется распечатать или вывести на экран в читаемом виде текущие данные, то необходимо использовать третий лист - представление.
подробнее...