Volond Apps
221 subscribers
216 photos
28 videos
22 files
994 links
Программирование для души и от лени
Добро пожаловать! У нас есть отличное сообщество любителей Excel и VBA, Google Sheet и Google Apps Script, а также всех тех, кто готов работать с этим программным обеспечением. Присоединяйтесь к нам, чтобы задавать и от
Download Telegram
/**
* v8 работает только в ES6
* Собираем несколько диапазонов в один,
* замена =INDIRECT() в массиве.
* Диапазоны могут быть разной размерности.
* @param {String} ranges NameSheet!A1Notation range
* @returns {Array}
* @customfunction
* @example
*/
function UNIONRANGES(ranges){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var getValues=(A1Not)=>ss.getRange(ranges).getValues()

return ranges.map?ranges.map(getValues).flat(1):getValues(ranges)

}
#customformula
Настраиваем книжную ориентацию в Google Slides
#GoogleSlides
Объединяем свойства объектов JS
const a={a:1,b:2}
const c={c:3}
const d={b:3,e:4}

// Создаст новый объект g
const g=Object.assign(a,d,c)
console.log(g)//{ a: 1, b: 3, e: 4, c: 3 }
console.log(a)//{ a: 1, b: 3, e: 4, c: 3 }
😱 "а" МУТИРОВАЛ (изменился)
‼️ А так правильно ‼️
 const g=Object.assign({},a,d,c)
const f={...a,...d,...c}
console.log(f) //{ a: 1, b: 3, e: 4, c: 3 }
console.log(a)
// :) { a: 1, b: 2 }
#JS
Получаем id файла Google
**
* Получаем id файла Google
* из ссылки(URL) скопированной из
* адресной строки браузера
*
* @param {*} url
* @returns
*/
function getIdFromUrl(url){ return url.match(/[-\w]{25,}/);}
#GAS #JS
Forwarded from volond
Деструктуризация разделения строки по разделителю
// Деструктуризация разделения строки по разделителю
//вариант а
const key='a^b'
const ssID_src = key.split("^")[0];
const sheet_src = key.split("^")[1];
//вариант б
const [хssID_src,sheet_src]=key.split("^")
console.log(хssID_src)
console.log(sheet_src)
#GAS #JS
/**
* Получаем лист с активной книги по имени листа
* Get a sheet from the active book by sheet name
* @param {*} {sheetName}
* @returns {SpreadsheetApp.sheet}
*/
const getSheetFromActiveBookBySheetName=({sheetName})=>{
const ss = SpreadsheetApp.getActive();
return ss.getSheetByName(sheetName);
}
#GAS #JS
/**
* Перестановка столбцов в масиве array
* согласно
* правил переданных в масиве cols
* @param {*} array
* @param {*} cols
*
*/
const filtered = (array, cols) => [].concat(...[array.map(row => [].concat(...cols.map(y =>
row[y - 1])))]);
/*
Object.assign

Object.assign — это фантастическое новое дополнение, которое очень помогает сохранять вещи иммутабельными
(или, по крайней мере, делать только эфемерные мутации к промежуточным объектам).
Но знаете ли вы, что их можно устанавливать и для значений массивов в том числе?


const original = [0,1,2,3];
const copy = Object.assign([], original, { 2: 42 }); // [0,1,42,3]

console.log(original);
// [ 0, 1, 2, 3 ]

console.log(copy);
// [ 0, 1, 42, 3 ]
Деструктуризация
Парочка простых примеров:
// можно деструктурировать массивы
const [a, b] = [1,2]; // a = 1, b = 2

// можно деструктурировать ключи в объектах
const { a } = { a: 3 }; // a = 3

// даже параметры функций
function foo({ a }) {
console.log(a);
}

foo({ a: 4 }); // выведет 4
Переименование
Одна из фишек деструктуризации, о которой вы, возможно, не знаете — это возможность переименования по ходу дела. Если вы использовали ES6 модули, вы можете знать, как работает оператор импорта при переименовании импортированных объектов и, возможно, задавались вопросом, почему так не получается делать при деструктуризации. Ну, там на самом деле просто чуток другой синтаксис:

// простое переименование для избежания коллизий или просто для красоты.
const first = 5;
const { first: second } = { first: 3 };

console.log(second); // выведет 3

// переименовать для другого API с использованием расширенного использования присваивания
function verifyUser({ userId: id }) {
return User.update({ id, verified: true });
}
В сочетании с параметрами по умолчанию
Параметры по умолчанию позволяют вам указывать значения параметрам, которые не были переданы пользователем, но что если вы собирались деструктуризовать их, когда они приходят? Не проблема… У нас есть левая сторона присваивания (a.k.a. lvalue) с параметрами по умолчанию, так что вы можете использовать деструктуризацию и здесь!

function defaults({ a, b } = { a: 1, b: 2 }) {
console.log('a', a);
console.log('b', b);
}

defaults();
// a 1
// b 2

defaults({ a: 42, b: 32 });
// a 42
// b 32

// Будьте осторожны с множественными параметрами!
// Вся правая сторона будет заменена вашими аргументами.
defaults({ a: 87 });
// a 87
// b undefined

У самой деструктуризации также есть параметры по умолчанию, так что мы можем смешать оба варианта!


function defaults({ a = 1, b = 2 } = {}) {
console.log('a', a);
console.log('b', b);
}

defaults();
// a 1
// b 2

defaults({ a: 42, b: 32 });
// a 42
// b 32

// множественные параметры? Нет проблем, просто укажите то, что вы хотите изменить
defaults({ a: 87 });
// a 87
// b 2
Сравниваем значение с сегодня
function myFunction() {
var ss=SpreadsheetApp.getActive().getSheets()[0]
var d = new Date();
const dr=ss.getRange(1,1,ss.getDataRange().getLastRow(),ss.getDataRange().getLastColumn()).getValues()
const t=dr.filter(el=> Utilities.formatDate(el[0], "GMT+1", "dd/MM/yyyy")===Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy"))
console.log(t)

}
Как Получить границы непрерывных диапазонов в масиве?
const isNext=(el,i,arr)=>arr[i+1]!==(el+1)
var inp= [2,3,4,6,7,9,11,12,13]
var res=[]
const returnDiapz=(arr)=>{
var s=arr.splice(0,arr.findIndex(isNext)+1)
res.push([Math.min(...s),Math.max(...s)])
return arr.length?returnDiapz(arr):res;
}
Дедлайн формулами и смайликами
=arrayformula({INDEX(split(""🔵,🔵,🟢,🟡,🔴,🔴"";"","");1;MATCH(D43;{time(0;0;0);arrayformula(TIME(
IFNA(REGEXEXTRACT($C$42:$C$47;""(\d+) ч.*"");0);
IFNA(REGEXEXTRACT($C$42:$C$47;""(\d+) мин"");0);
IFNA(REGEXEXTRACT($C$42:$C$47;""(\d+) сек"");0)));time(23;59;59)};1))})
Вообще-то тема библиотек интересна!
‼️Хотелось бы обсудить, услышать мнение сообщества эту тему.‼️
1. Да с одной стороны Google предложил такую функциональность, с другой сам же не советует как плохую практику

1.📛Предупреждение: скрипт, использующий библиотеку , не запускается так быстро, как если бы весь код содержался в одном проекте скрипта. Хотя библиотеки могут сделать разработку и сопровождение более удобными, вы должны экономно использовать их в проектах, где скорость критична. Из-за этой проблемы использование библиотек должно быть ограничено в надстройках .
2
. Избегайте библиотек в UI-насыщенных скриптах
Библиотеки являются удобным способом повторного использования кода, но они немного увеличивают время, необходимое для запуска скрипта. Эта задержка не заметна для относительно длительных сценариев❗️ (например, служебных сценариев для очистки файлов Google Диска), но для пользовательских интерфейсов службы HTML на стороне клиента , которые выполняют повторяющиеся кратковременные google.script.run вызовы, задержка будет влиять на каждый вызов , Из-за этой проблемы библиотеки должны использоваться экономно в надстройках , и вы можете избегать их в сценариях без надстроек, которые выполняют много google.script.runвызовов.
P.S То есть для нашего скрипта как раз использование библиотек возможно так как у нас длительный сценарий
3. Обнадеживает слово пока...
Современный синтаксис ECMAScript
⁉️Внимание: модули ES6 пока❗️ не поддерживаются.
4. Есть сервис Polyfill.io
Что в нем интересного?
А то что можно СОБРАТЬ в батл ,только то что тебе нужно! ,
Может и в GAS как то использовать подобный принцип , что уж говорить ,что иногда из библиотеки мы используем минимальную ее функциональность
.
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.R = {})));
}(this, (function (exports) {'use strict';
/**
* A function that always returns `false`. Any passed in parameters are ignored.
*
* @func
* @memberOf R
* @since v0.9.0
* @category Function
* @sig * -> Boolean
* @param {*}
* @return {Boolean}
* @see R.T
* @example
*
* R.F(); //=> false
*/
var F = function() {return false;};
exports.F = F;
Object.defineProperty(exports, '__esModule', { value: true });
})));
Использую по жизни:
Научите меня ловить рыбу , а не кормите ей!
Движение вперед начинается с хорошего пинка под зад!
Правильно заданный вопрос уже половина ответа!
То что я не могу сделать сам, я не понимаю!
Разделить строку по разделитель на первый элемент и остаток.
const ferstSplit=({delim=",",str})=>{
var [a,...rest]=str.split(delim)
return [a,rest.join(delim)]}
console.log(ferstSplit({str:"1,2,3"}))
Банк знаний по Telegram ботам и не только...
Company
@google_sheets and @Volond presents...

Ссылки на АPI Ботов и Примеры на Google Apps Script

1.Telegram
2.Viber
3.Discort
4.VK
5.Google Chat
6.Facebook
7.Slack
8.Trello
9.WhatsApp

...to be continued
Пишите в комментариях найденное Вами... Добавим
const getAllValuesOrKeysFromColsString = (cols, obj) => cols == '@' ? Object.values(obj) : cols.split(",").map(k => obj[k]);
console.log(getAllKeyOrCols('@', { a: 1, b: 2,c:3 }));//[ 1, 2, 3 ]
console.log(getAllKeyOrCols('a', { a: 1, b: 2 ,c:3}));//[ 1 ]
console.log(getAllKeyOrCols('a,c', { a: 1, b: 2 ,c:3}));//[ 1, 3 ]