Google Таблицы
58.3K subscribers
425 photos
121 videos
4 files
772 links
Работа в Google Таблицах. Кейсы, решения и угар.

контакты:
@namokonov
@r_shagabutdinov
@IT_sAdmin

оглавление: goo.gl/HdS2qn
заказ работы: teletype.in/@google_sheets/sheet_happens
чат: @google_spreadsheets_chat
Download Telegram
ПЕРЕМЕЩАТОР — продолжаем показывать магию с Google Диском

Привет, недавно в наш чатик пришли с вопросом – есть список ссылок на файлы на Google Диске, как каждый из них скопировать в 10 папок?

Наш сегодняшний скрипт отвечает на этот вопрос, а еще он может не только копировать, но и перемещать файлы.

Инструкция, как пользоваться:
1) копируйте Таблицу со скриптом себе;
2) заполняйте URL файла и URL папки для перемещения (столбцы A и B);
3) выбирайте: копируем или перемещаем (столбец C);
4) запускайте скрипт из меню с 🔥 (при первом запуске скрипт попросит авторизацию – это нормально, этим вы разрешаете вашему скопированному скрипту обратиться к вашему диску – разрешаем);

Скрипт запустится и скопирует / переместит файлы исходя из настроек, попутно заполнит информацию в Таблице (название файла, название папки, результат и время), если вы запустите скрипт еще раз – скрипт обработает строки только без результата copy / move done.

Да и чтобы копировать файлы - у вас должен быть доступ и к файлу и к папке назначения 😉

Перемещатор (посмотреть на код в pastebin)

==
★ Канал про Таблицы: @google_sheets
★ Оглавление канала: goo.gl/HdS2qn
★ Чат: @google_spreadsheets_chat
Developer MetaData

Ситуация – нужно обратиться скриптами к листу, название которого регулярно меняют пользователи (значит, по названию мы обратиться не можем).

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

Есть отличное решение, про которое почти никто не знает, хоть оно и описано в документации – Developer MetaData.

С помощью DM вы можете соотнести (положить, приклеить) пару ключ и значение на Таблицу, на лист Таблицы, на строку или столбец. Далее вы сможете извлекать по заданному ключу как значение, так и саму "коробку" куда вы положили это значение, обращаться к ней и выводить еë текущие аргументы: номер строки / столбца для строки / столбца, название для листа / таблицы.

Примеры кода:
//создаём DM для листа "Лист с таким названием"
function createDM() {
SpreadsheetApp.getActive().getSheetByName('Лист с таким названием')
.addDeveloperMetadata("ключ для листа", "какое-то значение", SpreadsheetApp.DeveloperMetadataVisibility.DOCUMENT)
}


//обращаемся к DM по ключу и возвращаем актуальное название листа:
function getDM() {
Logger.log(SpreadsheetApp.getActive()
.createDeveloperMetadataFinder().withKey('ключ для листа').find()[0].getLocation().getSheet().getName());
}


Код в пастебин (пример с гифки тоже там)

PS Обратите внимание:
— DM не проверяет ключ на уникальность и вы можете создать несколько ключей с одинаковыми названиями (в коде же мы обращаемся к первому);
— Есть лимиты - это 30к символов на файл + 30к на каждый лист. Т.е. файл с 3 листами может суммарно сохранить 120к символов. В квоте считается каждый символ и ключа и значения;
Регулярные выражения — компактная памятка от @vitalich

В Таблицах можно использовать регулярные выражения
1) для проверки строки на соответствие выражению (функция REGEXMATCH)
2) для замены части строки на другой текст (REGEXREPLACE)
3) для извлечения строки, которая соответствует регулярному выражению (REGEXEXTRACT)

Для Таблиц в регулярках достаточно знать (или самые часто используемые части RE2):
Классы символов: . \d \D \s \S \w \W \b \B (для \w нужно понимать, что не во всех средах будут матчится не-латинские буквы)
Пробельные спецсимволы: \n \r \t
Границы ^ $
Выбор или-или |
Выбор из набора [ ] и выбор всего, кроме символов из набора [^ ]
Квантификаторы жадные ( * + {n} {n,m} {n,} ) и как управлять их "жадностью" (*? +? {n,m}? {n,}?)
Извлекаемые группы ( )
Неизвелекаемые группы (?: )

Для отладки табличных выражений на regex101 слева надо включать Golang

Таблица с большим количеством примеров

PS 🙋‍♂️ Делитесь в комментариях тем, что помогает вам.

#regexp
Пользовательские форматы: мини-памятка

Еще одна памятка - на этот раз по символам, используемым в кодах пользовательских (Custom) форматов.
Напомним, что свои форматы создаются по адресу:

Формат → Числа → Другие форматы → Другие форматы чисел
Format Number More Formats Custom number format

0 — незначащие нули (отображаются всегда). Если в формате указан один ноль, числа любой разрядности будут отображаться (то есть никакое число не будет «обрезаться»). Но если в формате указано несколько нулей, а числа в ячейках меньшей разрядности — нули все равно будут отображаться.

0%процентный формат. Соответствует стандартному процентному формату, который формируется в ячейках автоматически при вводе знака процента. Но в пользовательских форматах вы можете его модифицировать — например, добавить разделители групп разрядов, знак "+" для положительных значений или текст.

. (точка) — десятичная запятая.

, (запятая) — запятая после числа отображает числа в тысячах, миллионах и так далее.
Одна - тысячи, две - миллионы и так далее. Например, 0,, число будет отображаться в миллионах.

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

#,## — разделители групп разрядов.

* (звездочка) — звездочка с указанным после нее символом будет заполнять ячейку этим самым символом. Например, 0*- — число и затем повторяющиеся дефисы до конца ячейки.

\* — если нужно показывать в формате именно символ звездочки, то добавляем обратную косую черту.

_ (нижнее подчеркивание) — отступ на ширину символа, который будет указан после нижнего подчеркивания. Например, если у вас отрицательные числа в скобках, а положительные без, и вы хотите выровнять их, чтобы сами числа были ровно друг под другом, то в положительных можно сделать визуальный отступ на ширину отсутствующей скобки 0_);(0). Она не будет отображаться, вместо нее будет пустота шириной ровно со скобку.

[ColorN] — цвет. Помимо номеров (от 1 до 56) можно указывать цвет и текстом. Например, [Red].

@ — текст в ячейке. Например, @@@ — повторение текста трижды.

"текст" — текст в кавычках будет отображаться в формате. Например, если нужны числа с пробелом и сокращением "руб.": 0" руб."

; (точка с запятой) — Разделяет разные форматы. Есть 2 структуры: можно перечислить форматы (все или некоторые) для положительных, отрицательных чисел, нуля и текста. Указываются именно в таком порядке и через точку с запятой. Либо форматы для одного или двух условий (и всех остальных случаев). Условия задаются в квадратных скобках [Условие1] Формат ; [Условие 2] Формат; формат для остальных случаев.

Таблица с примерами пользовательских форматов (Создать копию)
Google Таблицы
Пользовательские форматы: мини-памятка Еще одна памятка - на этот раз по символам, используемым в кодах пользовательских (Custom) форматов. Напомним, что свои форматы создаются по адресу: Формат → Числа → Другие форматы → Другие форматы чисел Format → Number…
Цвета в пользовательских форматах: табличка-памятка

Напомним, что в пользовательских форматах можно не только задавать несколько стандартных цветов словами:
[Red] [Green] [Blue] [Yellow] [Magenta] [Green] [Yellow] [Cyan]

Но и по номерам:
[Color1] [Color2] ... [Color55]

Выкладываем для вас табличку с кодами всех цветов!
(синяя заливка использовалась только чтобы было видно некоторые "бледные" цвета)
This media is not supported in your browser
VIEW IN TELEGRAM
Обновляем Таблицу по ключу скриптом onEdit()

Привет, друзья! Сегодня рубрика – простой скрипт с комментариями по каждой строке кода.

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

Вот здесь (скрипт и комментарии), показываем, как задача решается с помощью триггера onEdit(). Как вы помните – onEdit() не надо запускать, он реагирует на все изменения Таблицы.

Таблица с решением (скопировать >)

=
Для заминки: в ячейке "H2" на листе "ЛистЛист" наш чекбокс, отследим с помощью onEdit(), что ячейка изменилась (чекбокс нажали или отжали) и выведем окно со словом "привет":

function onEdit(e) {
//определяем текущий лист, который редактируется и диапазон
let sheet = e.source.getActiveSheet();
let range = e.range;

//проверяем, редактируется ли ячейка "H2" на "ЛистЛист"
if (range.getA1Notation() == 'H2' && sheet.getName() == 'ЛистЛист!') {
//если да — что-то запускаем
Browser.msgBox('привет!')
}
}
Надо бы диапазон проредить.

Друзья, ниже прекрасная статья от Михаила Смирнова. Слово автору:

Дальше вместо ... вставляем диапазон (из таблицы или результат каких-то формул).

Как убрать N первых строк диапазона?

=QUERY(...; "OFFSET N";)

Как убрать N первых столбцов диапазона?

=TRANSPOSE(QUERY(TRANSPOSE(...); "OFFSET N";))

Как убрать чётные строки диапазона?

=QUERY(...; "SKIPPING 2";)

Как убрать нечётные строки диапазона?

=QUERY(QUERY(...; "OFFSET 1";); "SKIPPING 2";)

Как убрать чётные столбцы диапазона?

=TRANSPOSE(QUERY(TRANSPOSE(...); "SKIPPING 2";))

Как убрать нечётные столбцы диапазона?

=TRANSPOSE(QUERY(QUERY(TRANSPOSE(...); "OFFSET 1";); "SKIPPING 2";))

Ну, вы поняли: для столбцов всё то же, что и для строк, только в начале и в конце делаем TRANSPOSE.

Ещё всё это можно совмещать.

Убираем чётные столбцы и строки:

=TRANSPOSE(QUERY(TRANSPOSE(QUERY(...; "SKIPPING 2";)); "SKIPPING 2";))

Оставляем каждую N-ю строку, начиная с первой:

=QUERY(...; "SKIPPING N";)

Оставляем каждую N-ю строку, начиная с M-ой (вместо M-1 надо вставить конкретное число):

=QUERY(QUERY(...; "OFFSET M-1";); "SKIPPING N";)

Полная версия статьи с примерами: telegra.ph/Kak-proredit-kolonki-i-stolbcy-diapazonov-v-Google-Sheets-10-20
Удаляем строки в определенном порядке в Excel

Так, а что делать в Excel, где хоть и появились уже и ФИЛЬТР/FILTER с УНИК/UNIQUE (только в Office 365), но великая QUERY все еще отсутствует?
Вот лайфхак от автора книги "Эффективная работа в Microsoft Excel" Алана Мюррея.

1 В соседнем с данными пустом столбце вводим какой-нибудь символ (например, смайлик) для тех строк, которые нужно оставить, и другой - для тех, что нужно удалить (например, @).

2 Протягиваем это дело с помощью маркера заполнения (в правом нижнем углу ячейки) на весь столбец.

3 Идем в "Найти и заменить" (FInd and Replace) - Ctrl + F или Ctrl + H - в поле "Найти" (Find what) вставляем символ из удаляемых строк и нажимаем "Найти все" (Find All).

4 Нажимаем Ctrl + A, чтобы выделить все найденные ячейки, закрываем окно, нажимаем Ctrl + - (вызов диалогового окна "Удалить") и выбираем "строку" (Entire Row).
Проблемы с IMPORTRANGE()

Уже более 10 дней люди массово жалуются на ошибку "Import Range internal error" при использовании IMPORTRANGE() там, где она раньше работала.

Это проблема на стороне Google.

Известны два костыля для временного использования.

1-й костыль:

Необходимо поменять регистр одной из букв (сделать из прописной строчную, или наоборот) во втором параметре IMPORTRANGE(). Второй параметр - это импортируемый диапазон.

Было так:

IMPORTRANGE("id"; "A:A")

Меняем одну букву A на a:

IMPORTRANGE("id"; "A:a")

Должно отпустить. Но потом проблема может вернуться. На этот случай есть 2-й костыль.

2-й костыль:

Дублируем IMPORTRANGE() внутри IFERROR(). Первый - оригинальный, второй - с изменённым регистром одной буквы. Например, так:

IFERROR(IMPORTRANGE("id"; "A:A"); IMPORTRANGE("id"; "A:a"))

Сколько у вас в формуле IMPORTRANGE() - все надо так оформить.

---

Лучей добра @Vitalich за 2-й костыль.

---

‼️Чтобы проблема была быстрее решена, не поленитесь зайти в созданный для Гугловских разработчиков баг и поставить ему звёздочку. ⭐️ Баг здесь.

‼️Так же проголосуйте за вопрос на Stackoverflow, гугловцы к ним присматриваются. 🔼 Вопрос на SO здесь.

🎓А ранее писали про вариант с флажком, щелчок на который будет инициировать обновление: t.me/google_sheets/362
‼️Чтобы проблема была быстрее решена, не поленитесь зайти в созданный для Гугловских разработчиков баг и поставить ему звёздочку. ⭐️ Баг здесь.
⬆️ Проблемы с IMPORTRANGE()

‼️Так же проголосуйте за вопрос на Stackoverflow, гугловцы к ним присматриваются. 🔼 Вопрос на SO здесь.
Новая функция LAMBDA в Excel: пользовательские функции без макросов

Нет в Excel QUERY и, например, REGEXEXTRACT, но зато появилась функция для создания пользовательских функций — LAMBDA. Не можем не поделиться этой интересной новостью.

Если раньше в Excel нужно было создавать пользовательские функции с помощью макросов (VBA), то теперь можно функцией.
Синтаксис у нее такой:
=LAMBDA([переменная]; … ; [переменная]; формула)

Переменных может и не быть (хотя тогда LAMBDA не имеет особого смысла, можно просто присвоить имени Excel формулу без аргументов и вызывать ее по этому имени), может быть одна или несколько. В конце последним аргументом всегда будет формула с этими переменными.

Рассмотрим на простом примере с отклонением факт/план. Допустим, план в столбце B, факт в столбце C. Обычная формула будет выглядеть так:
=C2 / B2 - 1

А в случае с лямбдой мы указываем переменные и формулу в общем случае:
=LAMBDA(план ; факт ; факт / план - 1)

После чего сохранить ее в диспетчере имен (Ctrl+F3) под любым именем, какое вы хотите присвоить этой функции — например, “Прирост”.

И далее вызывать свою функцию, вводя только аргументы (они будут отображаться в подсказке — см скриншот.

Пока функция доступна в Office 365 участникам программы Office Insider.

Ссылки:
Announcing LAMBDA: Turn Excel formulas into custom functions
Office Insider
Библиотеки в Google Apps Script
– что это такое
– создаём и публикуем свою
– импортируем в таблицу
– используем
– и много полезных ссылок

Очередной прекрасный материал от Михаила Смирнова: telegra.ph/Google-Apps-Script-Library--Biblioteki-v-Gugl-Skriptah-11-02
Google Таблицы
Библиотеки в Google Apps Script – что это такое – создаём и публикуем свою – импортируем в таблицу – используем – и много полезных ссылок Очередной прекрасный материал от Михаила Смирнова: telegra.ph/Google-Apps-Script-Library--Biblioteki-v-Gugl-Skriptah…
Библиотеки в Google Apps Script II — создаём триггер для библиотечной функции

И продолжение про библиотеки от Михаила Смирнова:
1. узнаём скриптами имя библиотеки
2. создаём скриптами триггер с функцией из библиотеки
3. делаем этот триггер самоудаляющимся

Выжимка: telegra.ph/Google-Apps-Script-Library--Sam-sebe-trigger-v-biblioteke-korotkaya-versiya-11-04

Статья целиком: telegra.ph/Google-Apps-Script--library-getResource-libSymbol-trigger-11-02
Поиск с учетом регистра

"Обычная" функция ВПР / VLOOKUP ищет значение без учета регистра. "ipad" и "IPAD" и "iPad" - ей все равно.
Как быть, если нужно искать значение с учетом регистра?

Функция СОВПАД / EXACT проверяет точное совпадение значений - своих аргументов - и возвращает ИСТИНА / TRUE, если они равны (то есть совпадают все символы и регистры всех символов).

Если ввести ее в массиве, то получим столбец со значениями ИСТИНА и ЛОЖЬ, и ИСТИНА будет в строке с нужным нам значением:
=ARRAYFORMULA(EXACT(искомое значение; просматриваемый столбец))

Ну а дальше дело техники: находим строку с ИСТИНОЙ через ПОИСКПОЗ / MATCH
=MATCH(TRUE; EXACT(искомое значение;просматриваемый столбец);0)

И ИНДЕКСом / INDEX вытаскиваем из столбца с нужными данными значение из найденной строки:
=INDEX(возвращаемый столбец; MATCH(TRUE; EXACT(искомое значение;просматриваемый столбец);0))

Можно воспользоваться и функцией FILTER - она будет возвращать несколько значений, если их будет больше одного, а не только первое:
=FILTER(возвращаемый столбец;EXACT(искомое значение;просматриваемый столбец))

Таблица с примером (Сделать копию)

P.S. Заодно мини-памятка. Где регистр учитывается, где - нет.
Учитывается:
- в регулярных выражениях
- в текстовых условиях кляузы WHERE функции QUERY
- в функции НАЙТИ / FIND
- в функции ПОДСТАВИТЬ / SUBSTITUTE

Не учитывается:
- в обычных логических выражениях, например =A1=B1
- в СУММЕСЛИМН / SUMIFS и других подобных функциях
- в функциях ВПР / VLOOKUP и ПОИСКПОЗ / MATCH
- в функции ПОИСК / SEARCH
- в текстовых условиях в функции FILTER
Media is too big
VIEW IN TELEGRAM
задачник в Таблице с оповещениями в Telegram чаты и каналы

Подготовили для вас маленькое решение, а вот умеет оно немало: с помощью скрипта, который есть внутри при активации флажков в столбцах "начало", "конец" задачник фиксирует время начала и окончания задачи. Помимо этого задачник отправляет в Telegram чаты / каналы сообщения о том, что задача начата (назначена) и закончена.

Чтобы все заработало у вас, нужно:
1. скопировать Таблицу с кодом к себе;
2. создать своего Telegram бота через @botfather, скопировать его токен и вставить в ячейку I1;
3. добавить созданного бота в чаты / каналы, куда вы будете отправлять оповещения;
4. также добавить в эти чаты @myidbot, командой /getgroupid узнать chat_id чатов и внести в ячейку I2 (один или несколько через запятую), потом бота можно удалить;
5. создать триггер: открыть редактор скриптов → триггеры → добавление триггера → функция: onSender → тип события: при редактирование → создать;

★ Код отдельно: pastebin.com/Ew9Uj75F
★ Оглавление канала: goo.gl/HdS2qn
This media is not supported in your browser
VIEW IN TELEGRAM
Специальная вставка: перенос только ширин столбцов

Допустим, нам нужно сделать в одной таблице ширину каждого столбца точно такой же, как в другой.
К счастью, такая опция в специальной вставке есть. Копируем ячейки в первой таблице (Ctrl+C), правой кнопкой щелкаем на первую ячейку во второй таблице, и в контекстном меню выбираем "Специальная вставка" (Paste special) --> "Только ширина столбца" (Column width only).

И в Excel тоже работает! Ctrl+Alt+V + ш(w)
Или правая кнопка мыши --> Специальная вставка (Paste Special) --> ширины столбцов (Column widths).