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

Последняя непустая ячейка в столбце
function getLastRowByColumn(range){
while(range.length>0 && range[range.length-1][0]=='') range.pop();
return range.length;
}
function getLastRow(){
return SpreadsheetApp.getActive().getLastRow()
}
#GAS
#customFunction
Подсчитайте количество слов и символов в документе 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 #расширение
Недокументированные проблемы ограничения API листов
Когда 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
Известный французский ученый-компьютерщик Жак Шазарен опубликовал бесплатную электронную книгу, которая выглядит как идеальный ресурс и доступна на французском и английском языках.
Сортировка по украински
const array = ["Володимир","Іван","Богдан","Євген","Андрій"];
function uaSort(s1, s2) {
return s1.localeCompare(s2);
}
var sorted = array.sort(uaSort);
console.log(sorted);

#JS #snippet
This media is not supported in your browser
VIEW IN TELEGRAM
Активная вкладка листа Google Sheet отделяется цветом Используя расширение User JavaScript and CSS
Также можно использовать для кастомизации Stylish и его темы https://userstyles.org/
Код CSS
div.docs-sheet-tab:not(.docs-sheet-active-tab) {
background-color: #484848 !important;
}
ES6 и функциональное программирование
Как создать копию объекта
//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 Script
Telegram GAS BOT
Forwarded from Хабр
#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;
}