А как прокачиваете свои знания?Книги, веб.? Ищите информацию под проект или выполняяете упражнения? Пишите в комментах.
https://techrocks.ru/2019/09/18/reading-technical-books/
#book
https://techrocks.ru/2019/09/18/reading-technical-books/
#book
techrocks.ru
Учимся читать: что, как и в каких количествах стоит читать разработчику (+список литературы) | techrocks.ru
Чтобы чтение технической литературы приносило максимум пользы, нужно правильным образом подбирать для себя книги и выкраивать время для чтения.
Подсчитайте количество слов и символов в документе Google
function getWordCount(fileId) {
const SEPARATOR = ' ';
const document = fileId
? DocumentApp.openById(fileId)
: DocumentApp.getActiveDocument();
const text = document.getBody().getText();
const words = text.replace(/\s+/g, SEPARATOR).split(SEPARATOR);
const characters = words.join('');
Logger.log("Word Count: " + words.length);
Logger.log("Character Length: " + characters.length);
}
Более продвинутая версия функции использует регулярные выражения и может работать с китайскими, японскими и корейскими скриптами - Credit .function getWordCountCJK(data) {
var pattern = /[a-zA-Z0-9_\u0392-\u03c9]+|[\u4E00-\u9FFF\u3400-\u4dbf\uf900-\ufaff\u3040-\u309f\uac00-\ud7af]+/g;
var m = data.match(pattern);
var count = 0;
if( m === null ) return count;
for (var i = 0; i < m.length; i++) {
if (m[i].charCodeAt(0) >= 0x4E00) {
count += m[i].length;
} else {
count += 1;
}
}
return count;
}
function getWordCount(fileId) {
const SEPARATOR = ' ';
const document = fileId
? DocumentApp.openById(fileId)
: DocumentApp.getActiveDocument();
const text = document.getBody().getText();
const count = getWordCountCJK(text);
Logger.log("Word Count: " + count);
}Очистка данных с помощью Google Sheets: пристальный взгляд
В Google Sheets есть 3 формулы, которые помогут Вам сэкономить огромное количество времени Вот они:
ImportXml
QUERY
REGEXEXTRACT
Только с этими 3 формулами вы сможете очистить данные, которые вам нужны для любых целей - будь то курация аудитории Twitter, анализ ссылок или что-либо еще, о чем вы можете подумать. Прелесть этих формул заключается в их универсальности, поэтому варианты их использования практически бесконечны. Понимая концепцию, лежащую в основе этого, переменные могут быть заменены в зависимости от конкретного варианта использования. Тем не менее, основной процесс очистки, представления и представления данных останется прежним.
Оригинал
Пример
Если вы заинтересованы в получении дополнительной информации, вот список отличных ресурсов:
Xpath Data Scraping Tutorial видео (для пользователей ПК)
Руководство ImportXML для Документов Google
Руководство контент-маркетолога по очистке данных
Как получить максимум от Regex
Для анализа используйте расширение ChroPath
#GoogleSheet #Regex #ImportXML #расширение
В Google Sheets есть 3 формулы, которые помогут Вам сэкономить огромное количество времени Вот они:
ImportXml
QUERY
REGEXEXTRACT
Только с этими 3 формулами вы сможете очистить данные, которые вам нужны для любых целей - будь то курация аудитории Twitter, анализ ссылок или что-либо еще, о чем вы можете подумать. Прелесть этих формул заключается в их универсальности, поэтому варианты их использования практически бесконечны. Понимая концепцию, лежащую в основе этого, переменные могут быть заменены в зависимости от конкретного варианта использования. Тем не менее, основной процесс очистки, представления и представления данных останется прежним.
Оригинал
Пример
Если вы заинтересованы в получении дополнительной информации, вот список отличных ресурсов:
Xpath Data Scraping Tutorial видео (для пользователей ПК)
Руководство ImportXML для Документов Google
Руководство контент-маркетолога по очистке данных
Как получить максимум от Regex
Для анализа используйте расширение ChroPath
#GoogleSheet #Regex #ImportXML #расширение
Moz
SCRAPING AND CLEANING YOUR DATA WITH GOOGLE SHEETS: A CLOSER LOOK
GOOGLE GUARANTEED - Ever found yourself copy and pasting data, wishing there was an easier way? Take a foray into the world of data scraping using Google Sheets with Jeremy Gottlieb!
Недокументированные проблемы ограничения API листов
Когда UrlFetchApp напрямую вызывает конечную точку Sheets API, если размер ответа превышает 50 МБ (52 428 800 байт), возвращается ответ менее 50 МБ. Размер 50 МБ обусловлен ограничением UrlFetchApp. С другой стороны, в Advanced Google Service он не может подтвердить эту ситуацию, потому что ошибка возникает, когда она превышает ограничение.
Читать далее
#SheetAPI #UrlFetchApp
Когда UrlFetchApp напрямую вызывает конечную точку Sheets API, если размер ответа превышает 50 МБ (52 428 800 байт), возвращается ответ менее 50 МБ. Размер 50 МБ обусловлен ограничением UrlFetchApp. С другой стороны, в Advanced Google Service он не может подтвердить эту ситуацию, потому что ошибка возникает, когда она превышает ограничение.
Читать далее
#SheetAPI #UrlFetchApp
Уважаемый мной tanaike предложил хорошую идею
цитую "Подивіться, чи не можемо ми створити щось на кшталт "npm для Apps Script" ??"
База даних скриптов Google Apps в формате JSON
В переписке с Эндрю Робертс и вдохновленный еще одним ГУРУ Bruce Mcpherson с
его Apps Script shared library list ( 136 шт Карл!!! )
Воспользовавшись библиотекой IMPORTJSONAPI
Имеем обновляемую таблицу с следущими полями
libraryName,description,siteUrl,publishedDate,projectKey,tags,authors,description
Так же эта тема обсуждаеться тут
Есть объедененный Google Apps Script Library Database(239 шт)
Здесь живет PackageManager
А здесь Search Google Apps Script Libraries
А также У програмі Google Apps Script Slack WorkSpace є новий канал - proj_library_database
цитую "Подивіться, чи не можемо ми створити щось на кшталт "npm для Apps Script" ??"
База даних скриптов Google Apps в формате JSON
В переписке с Эндрю Робертс и вдохновленный еще одним ГУРУ Bruce Mcpherson с
его Apps Script shared library list ( 136 шт Карл!!! )
Воспользовавшись библиотекой IMPORTJSONAPI
Имеем обновляемую таблицу с следущими полями
libraryName,description,siteUrl,publishedDate,projectKey,tags,authors,description
Так же эта тема обсуждаеться тут
Есть объедененный Google Apps Script Library Database(239 шт)
Здесь живет PackageManager
А здесь Search Google Apps Script Libraries
А также У програмі Google Apps Script Slack WorkSpace є новий канал - proj_library_database
GitHub
andrewroberts - Overview
Freelance Google Apps Script Developer. andrewroberts has 84 repositories available. Follow their code on GitHub.
Известный французский ученый-компьютерщик Жак Шазарен опубликовал бесплатную электронную книгу, которая выглядит как идеальный ресурс и доступна на французском и английском языках.
Работаем с #JSON #GAS #SheetApp
Объеденил в одной таблице
JSON formatter
и
IMPORTJSONAPI
Использует JSONPath Plus
Да вот еще одна библиотека
P.S В планах подружить их на одной форме
Объеденил в одной таблице
JSON formatter
и
IMPORTJSONAPI
Использует JSONPath Plus
Да вот еще одна библиотека
P.S В планах подружить их на одной форме
Google Docs
google_sheets_json_viewer+IMPORTJSONAPI
Приват
FALSE,default,EUR,RUB,USD,currency,chartOption,"charttype"\"column";"color"\"teal";"negcolor"\"purple";"lowcolor"\"#C02942";"highcolor"\"#6A4A3C"
$[exchangeRate][?(*)],$[exchangeRate][?(@.currency == 'EUR'||@.currency == 'RUB'||@.currency == 'USD')]…
FALSE,default,EUR,RUB,USD,currency,chartOption,"charttype"\"column";"color"\"teal";"negcolor"\"purple";"lowcolor"\"#C02942";"highcolor"\"#6A4A3C"
$[exchangeRate][?(*)],$[exchangeRate][?(@.currency == 'EUR'||@.currency == 'RUB'||@.currency == 'USD')]…
This media is not supported in your browser
VIEW IN TELEGRAM
Активная вкладка листа Google Sheet отделяется цветом Используя
Также можно использовать для кастомизации Stylish и его темы https://userstyles.org/
Код CSS
расширение User JavaScript and CSSТакже можно использовать для кастомизации Stylish и его темы https://userstyles.org/
Код CSS
div.docs-sheet-tab:not(.docs-sheet-active-tab) {
background-color: #484848 !important;
}ES6 и функциональное программирование
Как создать копию объекта
ES6: Стрелочные функции
Копирование объектов в JavaScript
Стрелочные функции
arguments
Как создать копию объекта
//ES6 и функциональное програмирование
//Задача: Есть обьект
//Создать копию обьекта
//Выполнить функцию над определеными свойствами обьекта
//Записать результат в Копию под Заданым именем
//И вернуть копию обьекта
const t=()=>{
const q=({id})=>++id
let cnf={name:1,id:1}
const f=(...arg)=>{
let newObj = { ...arg[0]};newObj[arg[1]]=arg[2](arg[0]);return newObj
}
const z=f(cnf,"ddd",q)
console.log(cnf)
console.log(z)
return z
//Профит
//[20-04-12 16:07:28:321 MSK] { name: 1, id: 1 }
//[20-04-12 16:07:28:323 MSK] { name: 1, id: 1, ddd: 2 }
#snippet #JS
}
Ссылки по теме:ES6: Стрелочные функции
Копирование объектов в JavaScript
Стрелочные функции
arguments
Боже! Как давно я это искал
После "допиливания" надеюсь поможет мне навести порядок в моих скриптах
Получение отформатированных сценариев без комментариев в проекте с использованием скрипта Google Apps
P.S.
1. Хотя почему-то комментарии не удалил при тестовом прогоне хотя это даже к лучшему.
2. Стоит посмотреть как среагирует на среду разработки V.8
После "допиливания" надеюсь поможет мне навести порядок в моих скриптах
Получение отформатированных сценариев без комментариев в проекте с использованием скрипта Google Apps
P.S.
1. Хотя почему-то комментарии не удалил при тестовом прогоне хотя это даже к лучшему.
2. Стоит посмотреть как среагирует на среду разработки V.8
Новый триггер onSelectionChange срабатывает при изменении пользовательского выделения https://developers.google.com/apps-script/guides/triggers#onselectionchangee
Google for Developers
Simple Triggers | Apps Script | Google for Developers
Learn about simple triggers in Apps Script, which are built-in functions that automatically run when specific events occur in Google Workspace applications.
#snippet
Unpivot a pivot table of any size/**
* Unpivot a pivot table of any size.
*
* @param {A1:D30} data The pivot table.
* @param {1} fixColumns Number of columns, after which pivoted values begin. Default 1.
* @param {1} fixRows Number of rows (1 or 2), after which pivoted values begin. Default 1.
* @param {"city"} titlePivot The title of horizontal pivot values. Default "column".
* @param {"distance"[,...]} titleValue The title of pivot table values. Default "value".
* @return The unpivoted table
* @customfunction
*/
function unpivot(data,fixColumns,fixRows,titlePivot,titleValue) {
var fixColumns = fixColumns || 1; // how many columns are fixed
var fixRows = fixRows || 1; // how many rows are fixed
var titlePivot = titlePivot || 'column';
var titleValue = titleValue || 'value';
var ret=[],i,j,row,uniqueCols=1;
// we handle only 2 dimension arrays
if (!Array.isArray(data) || data.length < fixRows || !Array.isArray(data[0]) || data[0].length < fixColumns)
throw new Error('no data');
// we handle max 2 fixed rows
if (fixRows > 2)
throw new Error('max 2 fixed rows are allowed');
// fill empty cells in the first row with value set last in previous columns (for 2 fixed rows)
var tmp = '';
for (j=0;j<data[0].length;j++)
if (data[0][j] != '')
tmp = data[0][j];
else
data[0][j] = tmp;
// for 2 fixed rows calculate unique column number
if (fixRows == 2)
{
uniqueCols = 0;
tmp = {};
for (j=fixColumns;j<data[1].length;j++)
if (typeof tmp[ data[1][j] ] == 'undefined')
{
tmp[ data[1][j] ] = 1;
uniqueCols++;
}
}
// return first row: fix column titles + pivoted values column title + values column title(s)
row = [];
for (j=0;j<fixColumns;j++) row.push(fixRows == 2 ? data[0][j]||data[1][j] : data[0][j]); // for 2 fixed rows we try to find the title in row 1 and row 2
for (j=3;j<arguments.length;j++) row.push(arguments[j]);
ret.push(row);
// processing rows (skipping the fixed columns, then dedicating a new row for each pivoted value)
for (i=fixRows;i<data.length && data[i].length > 0 && data[i][0];i++)
{
row = [];
for (j=0;j<fixColumns && j<data[i].length;j++)
row.push(data[i][j]);
for (j=fixColumns;j<data[i].length;j+=uniqueCols)
ret.push(
row.concat([data[0][j]]) // the first row title value
.concat(data[i].slice(j,j+uniqueCols)) // pivoted values
);
}
return ret;
}Класс для управления Properties
#snippet #GAS
#snippet #GAS
/**
* Класс для управления Properties
* DocumentProperties or ScriptProperties or UserProperties
*
* Creates an instance of Props.
* @param {string} prop
* @memberof Props
* @constructor
* https://developers.google.com/apps-script/reference/properties
* @example
* const testProps=()=>{
* const scrProp=new Props("ScriptProperties");
* scrProp.set("v","1")
* concole.log(scrProp.get("v"))
* }
* @return {} Class Properties
*/
class Props {
constructor(prop) {
this[prop] = PropertiesService['get'+prop]();
this.type=prop
return this;
}
get(name) {
return this[this.type].getProperty(name);
}
getProperties(name) {
return this[this.type].getProperties();
}
type(prop) {
return this.type;
}
set(name, value) {
return this[this.type].setProperty(name, value);
}
forget(name) {
return this[this.type].deleteProperty(name);
}
getKeys() {
return this[this.type].getKeys();
}
has(callback,name) {
return this[this.type].getKeys().some(callback,element);
}
deleteAllProperties(){
this[this.type].deleteAllProperties();
}
setProperties(properties){
this[this.type].setProperties(properties);
}
setProperties(properties, deleteAllOthers){
this[this.type].setProperties(properties, deleteAllOthers);
}
}