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

/**
* V 0.1
* Получение информации о таблице
* возвращаемые поля задаем в infoSheet
* по умолчанию берутся из #infoSheetDefault
* @param {*} id
* @param {string} [infoSheet='']
* @returns
*/
function getInfoTable(id,infoSheet=''){
var {properties,sheets}=direct_get(id)
var {title,locale,autoRecalc,timeZone}=properties
var propSheet=sheets.map(sh=>propertiesToArray(sh))
var infoSheet=infoSheet||infoSheetDefault()

var map=(sh,pr)=>(pr)=>{

return {[pr]:lens(pr).get(sh.properties)}
}
var infoTableSheets=sheets.reduce(
(t,sh)=>[...t,infoSheet.map(map(sh))],[])

return infoTableSheets.map(el=>Object.assign(...[...el]))

}
#
Symbolic Links for Easier Multi-Folder Local Development

Источник:



Вы знаете, как открыть «проект» в локальном редакторе кода? Я предполагаю, что разные редакторы используют разную терминологию для этого, но по сути то, что вы делаете, - это открываете папку / каталог, и он показывает вам боковую панель, полную файлов и папок, по которым вы можете перемещаться, и т.

Обычно есть одна родительская папка, а все остальное находится в этой папке. Правильно? Что ж, этого не должно быть! Вот тут-то и пригодятся символические ссылки .


Иначе известные как символические ссылки , они похожи на указатели на другое место. Хотя на самом деле вам не нужно перемещать папку, на которую вы ссылаетесь, вы можете создать указатель на нее, который будет вести себя так, как если бы вы это сделали.
••••••••••
GAS-Trigger-TestingFunction.gs
Источник:



/**
* Test function for onEdit. Passes an event object to simulate an edit to
* a cell in a spreadsheet.
*
* Check for updates: http://stackoverflow.com/a/16089067/1677912
*
* See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
*
* on Script editor, set to debug THIS function, but create breakpoints
* on the onEdit Function
*/
function test_onEdit() {
onEdit({
user : Session.getActiveUser().getEmail(),
source : SpreadsheetApp.getActiveSpreadsheet(),
range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(),
value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(),
authMode : "LIMITED"
});
}
••••••••••
Обсудить:
#GAS #tools #debug
Live stream started
Parcel — очень быстрый бандлер, не требующий настройки

Источник:

Parcel — маленький и быстрый бандлер, позиционируется как решение для маленьких проектов.

••••••••••
Обсудить:
‼️ Порядок выполнения файлов GS в проекте ‼️

Execution order of GS files in a Project
Cannot find function in object' error after moving class definition to separate .gs file

Тема очень больная уже не раз сталкивался
хочу найти правильный способ не зависить от того того в каком порядке функции попали в проект

Представьте, что у вас есть один файл Code.gs для всего кода скрипта приложений. У него есть своего рода JavaScript-«класс» Apple, глобальные и локальные переменные класса и функции, которая их использует:
Pastiebin
Этот скрипт отлично работает
Через некоторое время вы решите, что переместить определение класса Apple в отдельный файл - хорошая идея:
Pastiebin

Но поведение становится странным:

Ошибки выполнения скрипта: TypeError: не удается найти функцию getInfo в объекте [object Object]

Нужно разработать механизм борьбы с такими ошибками
Зачем знать, как вещи работают внутри?
Многие разработчики считают, что им не нужно понимать, как вещи работают внутри, а достаточно просто знать API. Я считаю, что с таким подходом есть проблема.

Изначально я думал, что понимание внутренностей системы или ее компонента помогает в дебаге. И это правда, ты можешь находить причины проблем в десятки раз быстрее, чем если бы ты не знал, что внутри. Но через какое-то время я понял, что есть еще более полезный эффект. Понимания внутренностей дает тебе понимания свойст компонента/подсистемы. А понимание свойств - это обязательный атрибут проектирования.

Не зная внутренностей, вы не понимаете свойств систем и следовательно не можете грамотно проектировать. Да, можно опираться на маркетинговый материал, но это очень наивный подход.

Примеров масса:
Если вы знаете, как устроены бызы данных, то вы можете выбрать подходящую. Понимание индексов позволяет предсказать, что произойдет с выборками, если объем данных увеличиться в несколько раз. Или почему добавление индексов может снизить производительность вашего приложения.
Если вы знаете, как работает Docker, то можете оценить риски изоляции и возможно начать использовать виртуалки.
Если вы знаете, как работает HTTPS, то без проблем найдете проблему, когда корпоративный прокси заказчика делает man-in-the-middle и выкусывает CORS заголовки.
Если вы знаете, что xslx файлы на самом деле zip с xml внутри, то вы можете предсказать, что конвертация в CSV может помочь решить проблему с со скоростью парсинга.
Если вы понимаете, как работает JWT, то вы будете знать, что клиент и без "секрета" извлечь все данные с токена.
Если вы понимаете, как внутри устроена файловая система, то поймете, почему лучше не хранить большое количество файлов в одной директории в ext2.
Я встречал сениор разработчиков, которые, к примеру, думали, что React Native компилируется в нативных код и в результате не могли понять, когда стоит использовать RN, а когда нативные приложения.
etc

Что думаете?
Наткнулся на интересный репозиторий - 30 second of code

Более сотни коротких кусочков кода. Залипнуть можно на долго, многое может пригодиться для решения ваших задач.
Рекомендую 👍

#js
Вытягиваем из текста ссылки на Google Документы
regexp101

/https:\/\/docs.google.com\/(.*)\/d\/(.*)\/.*sharing/
Forwarded from DidacticСardsBot
JSON-minify

Источник:



Порт JSON-minifyутилиты на язык JavaScript.


Обзор


JSON-minifyпреобразует блоки JSON-подобного содержимого в допустимый JSON, удаляя все пробелы и комментарии в стиле JS (однострочные //и многострочные /* .. */).

С помощью JSON-minifyвы можете поддерживать удобные для разработчиков документы JSON, но минимизировать их перед синтаксическим анализом или передачей по сети.
••••••••••
Обсудить:
Forwarded from DidacticСardsBot
Распределение ролей в проекте (скрипт Google Apps для таблиц)

Источник:



Создайте сводную таблицу распределения ролей в проекте на основе имен проектов, пользователей и их ролей.

••••••••••
Обсудить:
Forwarded from DidacticСardsBot
Объединить две таблицы Google (скрипт Google Apps для таблиц)

Источник:



Объединяет информацию из двух Google Таблиц. Например, сценарий можно использовать для объединения информации о людях, экспортированной из системы LDAP, со списком назначений проекта.


Первая строка таблицы src / dst должна содержать метки для каждого столбца. Самая левая метка на листе dst считается keyLabel, а значения в этом столбце считаются ключами . Эти ключи используются для сопоставления строк между листами src и dst.

••••••••••
Обсудить:
FAQ: Что нужно знать создателям голосовых чатов

Чтобы запустить голосовой чат, нужно обновить Telegram до последней версии, зайти в информацию о канале и нажать на «Начать голосовой чат».

Для голосового чата можно задать имя. Отразите в названии голосового чата главную суть вашей встречи со слушателями: укажите название, которое соответствует теме разговора.

— Запускайте собственные аудиочаты в каналах: по сравнению с группами, каналы привлекут большую аудиторию. Но если запускаете голосовой чат в группе, в опциях голосового чата можно, как и в канале, разрешить говорить только администраторам.

— Заранее анонсируйте войсчат: у ваших подписчиков будет время узнать про него, а у вас — выстроить план разговора. В анонсе используйте слова "Голосовой чат" — так нам будет проще найти ваш анонс и рассказать о голосовом чате нашим подписчикам.

— Ссылка на голосовые чаты не меняется: если вы хотите пригласить слушателей, просто добавьте к адресу собственного канала ?voicechat. Полная ссылка будет выглядеть так: t.me/voiceinfo?voicechat.

Ссылка начнет работать только после старта голосового чата.
Для спикеров создаются отдельные, персональные ссылки, которые по окончанию голосового чата будут обнулены. Сгенерировать их можно только после старта войсчата.

— Найдите модератора для голосового чата. Чтобы ведущему не заниматься техническими вопросами, попросите проконтролировать эфир одного из ваших администраторов. Он сможет регулировать уровень звука всех спикеров для всех слушателей, и активировать определённым гостям микрофон.

— Голосовой чат можно записать, чтобы в дальнейшем разговор могли послушать и другие читатели вашего канала: просто нажмите на кнопку записи голосового чата в начале трансляции. О том, что беседа записывается, можно понять по мигающей красной точке сверху, возле наименования чата. Запись голосового чата после его окончания появится у вас в «Избранном».

— Если хотите подключить ваших слушателей к разговору — объясните им, как это сделать. Следует нажать кнопку «Поднять руку», а после того, как его назначат спикером, активировать микрофон. Также советуйте спикерам, которые не участвуют в разговоре в текущий момент отключать микрофон, чтобы те не "засоряли" эфир посторонними звуками. Точно так же выключайте и свой микрофон, чтобы не было эха при вещании спикеров.

#FAQ
image_2021-04-06_10-09-39.png
72.3 KB
Develop Google Sheets solutions
Forwarded from volond
/**
* Первая буква в столбце В верхний регистр
* @param {SpreadsheetApp.Range} range
* @customfunction
*/
var mapToUpperCase=(range)=>{
range=Array.isArray(range)?range:[range]
return range.map(el=>{
var str=el[0]
var [a,...rest]=[...str]
return [[a.toUpperCase(),rest.join("")].join("")]
})
}
Forwarded from volond
/**
* JOIN с
* @customfunction
*/
var progressiveJoin=(range)=>{
return range.flat().map((el,i,arr)=>!i?[el]:[arr.slice(!i?1:0,i+1).join()])


}
=if(ISEMAIL(G2);"Это почта";"Это телефон")