Сообщество - MS, Libreoffice & Google docs

MS, Libreoffice & Google docs

762 поста 14 933 подписчика

Популярные теги в сообществе:

131

Учёт финансов с помощью гугл таблиц и телеграмм бота (GS5)

Теплого времени суток, дорогие подписчики. Как обещал ранее - пилю пост про учёт финансов в гугл табличках (далее - ГТ).

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

Изначальная идея тайм-трекинга через тлг + гт принадлежит не мне. Я получил в своё время уже готовый продукт и его дорабатывал (существенно дорабатывал).

Ближе к делу.

Первое что нужно будет сделать - подключить бота к доке. Как это сделать - читай пост Подключение телеграм бота к гугл табличкам (GS3)


Второе - дать боту возможность читать все сообщения, а не только адресованные ему команды.

Вот код для бота. Он достаточно простой. Всё что он делает - на листе Data Stream создает строку с датой отправки, юзернеймом и текстом.

function doPost(e)

{

var update = JSON.parse(e.postData.contents);

var DOC = SpreadsheetApp.openById("1jVRB2QOasOXaXhm3Q99ZUlgnLpS_td3O3olQ2HGRguk");

var DS = DOC.getSheetByName("Data Stream");

//нам нужен только тип "сообщение"

if (update.hasOwnProperty('message'))

{

var msg = update.message;

var chat_id = msg.chat.id;

var text = msg.text;

var msg_array = msg.text.split(" ");

var date = (msg.date/86400)+25569.125; //.125 справедлива для МСК. Если разница по времени другая - будет другое значение. Чтобы узнать - напиши разницу в часах в гугл таблице и измени формат на Число. Он напишет часы в численном эквиваленте.

var user = msg.from.username;

DS.appendRow([date, user, text]);

}

}


Не забываем после этого заново опубликовать приложение!

Важно приучить себя к определенному виду записи - сначала откуда потратил, потом - на что потратил, потом сумму и потом комментарий. Например

ТКС ЕДА 850 купил гречки

СБЕР Сереже  5000 заплатил штраф


Создаем новую страницу и в a2 пишем следующую формулу:

=ARRAYFORMULA(ЕСЛИ('Data Stream'!C2:C>0;split('Data Stream'!C2:C;" ");))

Аррей формула будет пробегать по всему диапазону c2:с соседнего листа и, если ячейка в диапазоне не пустая, то будет разбивать строку в ней по пробелам. Результат видите ниже.

Выделяем всё и создаем сводную таблицу

Настраиваем ёё как на экране и получаем профит.

На этом все) Старался описать самый минимальный функционал чтобы любой чатланин мог как можно быстрее запустить сие чудо. Ссылка на табличку: https://docs.google.com/spreadsheets/d/1jVRB2QOasOXaXhm3Q99Z...


Если в комментариях будут пожелания - можно прикрутить более сложную отчётность и нотифаи. Напр, если потратил на маски больше 5000 - чтобы приходило уведомление в тлг.

Показать полностью 6
155

Запись на ноготочки через телеграм бота и гугл таблицу (GS4)

Под прошлым постом (Подключение телеграм бота к гугл табличкам (GS3)) прилетел запрос от уважаемого чатланина @Kamikadze.man,

Что ж, сказано сделано. Сделал чуть больше интервал - 30 минут, для читабельности поста.


Важно! По ходу разработки бота принял решение "срезать угол" в одном важном месте. Оно довольно критично, но, признаюсь честно, желание выпустить пост сегодня пересилило желание сделать всё на 100%. Дело в том, что даты, которые гугл скрипт забирает из таблички имеют оч неудобный формат. И вот как раз на этапе приведения этого формата я и срезал угол. Сказываться это будет на том, что пользователь вместо даты 26.05 должен вводить только число 26. И сам код написан в формате МВП, т.е. он минимально работоспособен и не учитывает поведение юзера. Т.е. рассчитан только на то, что пользователь будет действовать четко по инструкции. Если эти два обстоятельства подтолкнут читателя к мысли, что автор -- пацак и заслуживает минуса - значит это будет мне уроком на будущее.


Первым делаем создаем новую гугл таблицу (ГТ). Вот ссылка на неё:

https://docs.google.com/spreadsheets/d/1SOt9ng7UZ3oK6fKXYRPa...

Создаем и подключаем к ней бота. Как это сделать - первая ссылка в посте.


Считаем время приёма полтора часа. Если мастер хочет уйти домой в 19, то в 17:30 можно назначить последний прием.

Что должен делать бот?

1 - Спрашивать у клиента в какой день он хотел бы прийти к мастеру, проверять - если свободные окна в это время.

2 - Получить у клиента время начала приёма и записать его в таблицу.

3 - Сделать это время занятым и не предлагать его следующему клиенту.

Начнём с первой функции.

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

Наша первая цепочка (Ю: - юзер, Б: - бот)

Ю: Записаться

Б: На какое время хотите записаться?

Ю: Дата

Б: Список свободных окон

Ю: Время

Б: Запись прошла успешно


Чтобы реализовать этот диалог нам нужно хранить состояние каждого чата в таблице. В шапку таблицу добавляем техническое поле Statement, а пользователей будем распознавать по Chat ID.


После того как пользователь отправляет команду "Записаться" -  мы отправляем ему текстовое сообщение и меняем Стейтмент на "Dates", т.е. следующее сообщение от пользователя будет с датой.

После успешной записи даты - меняем стейтмент на конкретную дату, т.к. нам она понадобится в дальнейшем. После успешной записи времени - обнуляем стейтмент, чтобы пользователь мог записаться еще раз.

+ Добавляем в бот команду "Отмена", которая отменяет текущую запись и сбрасывает стейтмент.


Итак к табличке.

Размечаем лист с клиентами:

И лист под календарь

Чтобы заменить единички в календаре на цветовую заливку использую условное форматирование:

Код оставлю в самом низу, т.к. он занимает оч много места. Код размечен комментами, искренне надеюсь, что написал его достаточно читабельным.


Теперь как это работает.

И результат в доке:

Второй прогон:

Занятые окна он уже не показывает) И итог:

Ссылка на доку и код (Инструменты / Редактор скриптов). Код получился объёмным и не вижу смысла добавлять его в сам пост.

Отдельно код просто в текстовом файле: https://docs.google.com/document/d/1FOg5YRIauH0C13u-imdTpezU...

https://docs.google.com/spreadsheets/d/1SOt9ng7UZ3oK6fKXYRPa...



Вот и всё, уважаемые чатлане. Готов к критике, если таковая будет и к ответу на вопросы, если таковые будут. Надеюсь, что смог быть кому-то полезен.

Показать полностью 8
158

Подключение телеграм бота к гугл табличкам (GS3)

Всем ку
Комбинация из ТЛГ и ГТ, простота подключения КМК делает из ГТ офигенный инструмент автоматизации.
Тайм-менеджмент, таск-менеджмент, учёт финансов, объявления, пересылка событий - всё это создается и довольно быстро настраивается. Главное - это становится полезным не только в бизнесе, но и для обычных чатлан.
Пост ориентирован прежде всего на людей, которые только познают ГТ и на первых порах не требует знания гугл скриптов. В этом посте будет только первичная настройка и подключение. В следующих постах рассмотрю всё что описал выше (как трекать время, задачи, финансы и т.д. и как это настроить под себя).

Итак, первое что нам нужно - создать себе ТЛГ бота. Обращаемся к @BotFather

Нам потребуется АПИ токен, он в середине этого сообщения: 1240599492:AAEOpj-G4C0hO3DFGuQ7RkMyX65RxsGFCqo

Дальше нам нужна пустая ГТ. Создаем, заходим в Инструменты / Редактор скриптов.
Скрин для английской версии.

Вставляем туда следующий код:
function doPost(e)
{
var update = JSON.parse(e.postData.contents);
var DOC = SpreadsheetApp.openById("1WvGYnynJkX2srI1G1DD-7b8Qrm2WiWR6QOxzDJRKxXM");
//нам нужен только тип "сообщение"
if (update.hasOwnProperty('message'))
{
var msg = update.message;
var chat_id = msg.chat.id;
var text = msg.text;
var msg_array = msg.text.split(" ");
var date = (msg.date/86400)+25569.125;
var user = msg.from.username;
if (msg_array[0] == "/hello")
{
send("Hello World", chat_id)
}
}
}
function send (msg, chat_id)
{
//Отправляет сообщения в тлг. На вход функции дать сообщение и ID чата, в который нужно провести отправку
var payload = {
'method': 'sendMessage',
'chat_id': String(chat_id),
'text': msg,
'parse_mode': 'HTML'
}
var data = {
"method": "post",
"payload": payload
}
var API_TOKEN = '1240599492:AAEOpj-G4C0hO3DFGuQ7RkMyX65RxsGFCqo'
UrlFetchApp.fetch('https://api.telegram.org/bot' + API_TOKEN + '/', data);
}


Выделенное жирным:
1 - ID гугл таблицы, находится после /d/ :

2 - АПИ токен гугл бота, который мы доставали выше.

По коду - в нем две функции - первая принимает сообщение от бота и работает с единственной командой "/hello". Вторая - отправляет сообщения в чат. В данном случае - в чат из которого пришло сообщение.

Осталась последняя часть - зарегистрировать вебхук. Тут нам поможет эта ссылка:
https://api.telegram.org/bot{API_TOKEN}/setWebHook?url={CURRENT_WEB_APP_URL}
Вместо первых фигурных скобок вставляем всё тот же токен бота, а вместо вторых фигурных скобок нам нужно вставить ссылку на приложение, которые  мы только что сделали, но еще не опубликовали.

Важно - поставить доступ для анонимов и для каждой новой версии выставлять Project version новый или new.
При деплое оно запросит разрешение - даём, после чего получаем заветную ссылку:

В итоге у нас должно получиться следующее:
https://api.telegram.org/bot1240599492:AAEOpj-G4C0hO3DFGuQ7R...
Эту ссылку мы просто вставляем в браузер и переходим по ней. Если не получается - подрубаем ВПН. Получаем следующее:

Вебхук зарегистрирован, всё ок. Пойдем тестить бота.

Подключение бота к табличке успешно произведено.

ЗЫ Бота я удалил, так что этот АПИ-токен уже не действует.

Показать полностью 8
85

Фильтры и ВПРы в ГТ (GS2)

Шалом, комрады.

Рад, что первый пост оказался полезным. Ссылку на него оставлю тут. Парсинг данных с сайтов в гугл таблички  (GS1)


Хочу рассказать о функции, которой я пользуюсь каждый свой рабочий день. Это функция =filter(). Фильтр фильтрует данные по заданным условиям.

Пишется как =filter(что нужно отфильтровать; условие1;условие2;...)

Пример:

У нас есть список продаж по манагерам, нам нужно отфильтровать по конкретному манагеру.

Таким образом мы можем получить список продаж по конкретному сейлу. Если добавить в ячейку E1 выбиратор, то будет еще удобнее:

В русской версии - Данные / Проверка данных

Бывает так, что за продажу отвечают сразу несколько менеджеров. Как тогда достать данные?

Тут нам пригодится функция REGEXMATCH, которая проверяет, содержится ли регулярное выражение (кусок текста) в тексте или в массиве строк. Для наглядности проверю содержание Максимов во всех строчках.

И фильтр тогда будет выглядеть:

И еще одна замечательная часть фильтра - это его комбинация с функцией ВПР (VLOOKUP), а если быть точным - с функцией ЕНД()  - она проверяет наличие специфической ошибки при попытке проВПРить значение. Проще говоря - она даёт однозначно понять - есть ли искомое значение в диапазоне, в  котором мы ищем. Понимаю что сложно, давайте покажу на примере.

Здесь при помощи ВПР мы вытаскиваем день рождения сейла. Чтобы проверить, есть ли конкретный сейл в списке - используем функцию ЕНД() / ISNA() в англ. версии

Функция проверяет наличие ошибки. Т.е. если она находит сейла в списке - возвращает FALSE.

Таким образом я могу отбирать продажи не по одному сейлу, а по нескольким из списка.

Для чего еще может быть полезна такая комбинация?

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

С помощью комбинацияя из фильтра и енд(впр()) вы сможете в отдельный список выводить список всех новых товаров.

Вот и все, уважаемые чатлане)

Если есть конкретные пожелания к следующим темам - пишите в комментах =3


UPD: ссылка на табличку: https://docs.google.com/spreadsheets/d/1WvGYnynJkX2srI1G1DD-...

Показать полностью 10
267

Парсинг данных с сайтов в гугл таблички  (GS1)

Шалом, комрады.

Т.к. это первый пост про гугл таблички, то кроме разбора конкретной функции расскажу в целом чем же они так хороши.

Гугл таблички (далее ГТ) просчитываются на бекенде, т.е. на серверах гугла и продолжают работать даже если они закрыты физически у вас в браузере. Это значит, что сложные вычисления, справочники, доки со скриптами и т.д. продолжают работать в фоне. Это позволяет из ГТ делать настоящую информационную экосистему в компании. Если добавить сюда бесчисленные интеграции - то ГТ могут собрать всё инфо в вашем бизнесе и в автоматическом режиме с ней работать.

Что касается персонального использования - то тут плюсом будут в основном интеграции и скрипты, которые оч просто использовать и обращаться к ним с телефона или вообще из телеграмма.

С прелюдией всё, переходим к мясу.

У ГТ есть замечательнейшая функция =importxml(), которая позволяет забирать данные с сайтов, т.е. парсить эти самые сайты. Функционал её ограничен и полноценного парсера в ГТ не сделать по двум причинам:

1. Оно не может парсить данные с сайтов, где необходима авторизация.

2. Оно имеет техническое ограничение на кол-во попыток парсинга, т.к. вход на сайт парсер осуществляет с одного и того же IP. Если на сайте установлено ограничение на кол-во заходов в минуту (а его специально ставят против парсеров), то работать он будет, но будет это крайне медленно.

Итак, к самой функции.

Покажу на двух примерах - КиноПоиск и Авито.

Я очень люблю ужастики, поэтому работать будем с ними :3

Заходим на кинопоиск и исследуем конкретный элемент:

На сайтах похожие элементы чаще всего имеют одинаковый класс внутри тега div, span или a. Технически грузить не буду, достаточно навести мышкой на кусок когда и нужный элемент будет подсвечен. Нам нужен тег и его класс. Т.е. div и 'info'.

Дальше заходим в ГТ и пишем следующее:

=importxml("https://www.kinopoisk.ru/s/type/film/list/1/order/rating/m_a..." ; "//div[@class='info']")

Первый аргумент функции - ссылка на сайт. Второй - запрос на языке Xpath, который ведет к заветному div с классом 'info'. На выходе получаем:

Аналогично для авито:

Формула: =importxml("https://www.avito.ru/moskva?q=пикабу","//div[@class='snippet-title-row']")

Итог:

Ссылка на док: https://docs.google.com/spreadsheets/d/1WvGYnynJkX2srI1G1DD-...


Вот и все на сегодня) Пост первый, так что жду критики и советов, чтобы следующий контент материал был более читабельным и полезным)

Показать полностью 8
78

Как найти и распарсить JSON на странице сайта в интернете с помощью VBA Excel?

В этом посте я покажу, как с помощью VBA сделать, то, для чего VBA вроде бы как изначально не предназначен – как получить значения нужных переменных из структуры JSON.

Этот пост сделан по мотивам просьбы моего первого и пока единственного подписчика, сделавшего комментарий на предыдущий пост «Макрос получения курсов доллара за период с сайта Банка России»

В чем отличие между сервисом ЦБ России и сайтом worldometers.info? В том, что ЦБ предлагает XML сервис для автоматической загрузки информации (см. http://www.cbr.ru/development/SXML/) – ее неудобно смотреть через веб браузер, но удобно получать с помощью паучьих алгоритмов, а worldometers.info предлагает информацию для людей, а не для пауков.

Поэтому создаваемому на VBA паучку придется постараться, чтобы понять разметку «для людей».

Для работы паука необходимо дополнительно подключить три библиотеки:

1. Microsoft XML parser (MSXML) – тот же, что использовался для получения курсов ЦБ с сайта Банка России.

2. Библиотеку для работы с объектной моделью HTML.

3. Библиотеку для использования возможностей JavaScript из VBA.

Поехали:

1) Запускаем паучка на сайт: https://www.worldometers.info/coronavirus/coronavirus-cases/

Получаем html с сайта:

В полученном html паучку нужно найти и распарсить данные о количестве зарегистрированных случаев из формата JSON. Эти данные представлены вторым аргументом в вызове функции Highcharts.chart(chartName, chartData), которая на сайте рисует график.

В результате выполнения нижепредставленного кода в переменной strJson должна оказаться структура с данными в JSON формате.

Теперь самое интересное – как распарсить эту JSON структуру? Чистый VBA это делать не умеет. Но с JSON прекрасно работает JavaScript. А в VBA есть инструмент для использования возможностей JavaScript для пользователей MS Excel.

Мы можем в VBA получить уже распарсенную JSON переменную:

Проблема в том, что с объектом objJSON ничего нельзя сделать в рамках VBA – у него нет ни свойств, ни методов. Поэтому создаем эти методы на языке JavaScript. Нам нужно вытащить даты (xAxis) и количество (series->data):

Вот что пишем в VBA редакторе:

Загоняем данные в привычные VBA массивы:

Ну и раскатываем эти массивы по рабочему листу:

Вот, что получилось в результате на листе рабочей книги:

По этим данным легко построить график, например, такой:

Если захотите получить готовый файл Excel с рабочим кодом – дайте знать в комментариях.

Показать полностью 14
93

Курсы валют с сайта ЦБ на VBA (с автообновлением)

В комментариях к прошлому посту возникла жалоба одного пользователя Excel на отсутствие рабочих примеров макросов, которые загружают курсы валют с сайта ЦБ, и при этом формулы обновлялись бы автоматически, подтягивая актуальный курс на текущую дату. Там же в комментариях набросал вариант решения (вот готовый пример), но подумал, что отдельный пост на эту тему поможет и другим пользователям, столкнувшимся с подобной задачей.

Итак, на сайте ЦБ РФ находим официальные API для загрузки динамики курсов (на случай, если нам потребуется загружать курс на определенную дату в прошлом):

HTTP GET-запрос вида

http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=02%2F03%...

где R01235 - это код валюты (доллар США). Список кодов валют для указания в запросе также доступен.

API возвращает данные в XML-формате, и для нас это даже удобнее, чем JSON - так как в VBA есть поддержка XML, а для парсинга JSON нужны сторонние библиотеки. Вот пример ответа:

Как видим, мы получили список курсов на каждую дату в интервале, с указанием кода валюты - именно то, что нам нужно.


Теперь попробуем сделать такой запрос из VBA. Для начала подключим в нашей книге ссылку на зависимость MSXML 6.0 (если у вас доступна другая версия, ничего страшного - могут немного поменяться имена типов, в целом логика такая же)

Заодно добавим ссылку на Microsoft Scripting Runtime - оттуда мы сможем использовать тип Dictionary для хранения соответствий кодов валют (USD -> R01235).

Итак, создадим простую функцию, которая отправит запрос и загрузит ответ в XML-документ (код примера я выложил на гитхабе: https://github.com/navferty/CBR-VBA-Currencies ):

Кстати, неплохо расписан механизм XmlHttpRequest с примерами авторизации тут: https://codingislove.com/http-requests-excel-vba/


Как видим, у нас есть XML-документ, по которому мы можем пройти в цикле, извлекая значения курса валюты на каждую дату. Давайте попробуем это сделать! Но для начала, добавим класс для того, чтобы хранить эти значения. Нам нужны три свойства (property) - код валюты (строка), дата и собственно значение (для сумм желательно использовать тип decimal). Добавим class module:

Свойства можно добавлять командой Insert -> Procedure... , это автоматически сгенерирует геттеры и сеттеры. Можно обойтись и просто публичными полями - но публичный доступ через свойства позволяет управлять доступом к данным, и вообще считается хорошим тоном =)


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

Но вернёмся к нашей задаче. Итак, создадим коллекцию, которую будем наполнять записями типа CurrencyRecord:

Как видно на скриншоте, мы обходим элементы, которые содержат курсы на каждую дату (можно немного переделать обращение к resultXmlDocument.LastChild.ChildNodes с использованием XPath - для более наглядной навигации по XML документу).


Убедившись, что запрос и обработка ответа работают, перепишем нашу функцию для запроса валюты по ее коду, добавив словарь с соответствием кодов валют, а также конструирование пути с запросом с учётом даты начала/окончания и кода валюты:

Также я поменял CurrencyCode при создании записи в цикле - вместо "R01235" запись будет содержать общеизвестный код валюты "USD").


RequestGetXml - вспомогательная функция, которая загружает XML-документ с помощью HTTP-запроса:

Проверим, что вся функция работает как ожидается, добавив временную процедуру для теста:

Теперь добавим публичную функцию, которую можно будет использовать в формулах на листе (так называемую UDF - user-defined function):

С помощью функции DateAdd определяем интервал дат для загрузки - от вчера до сегодня. Получив две записи, возьмём значение из последней:

Set currItem = col.Item(col.Count) ' не забываем, что в VBA нумерация с 1


Обратите внимание на второй аргумент - volatileArg. Его значение не используется, но он понадобится для того, чтобы заставить Excel пересчитывать значение при изменении значения этого аргумента в формуле ячейки:

=GetTodayCurrency("USD"; NOW())

Чтобы убедиться, что обновление курса было выполнено, также добавим Debug.Pring с сообщением об успешной загрузке. После успешной отладки этот вызов можно будет удалить, чтобы не засорять окно Immediate.


Теперь проверим, что при открытии книги будет выполнена загрузка курса:

Как мы видим, в окне Immediate есть сообщение об успешной загрузке курса - сразу после открытия книги. Тем не менее, такое же сообщение будет появляться и при любом изменении на листе - Excel будет пересчитывать значение формулы. Поэтому если у Вас в книге будет много ячеек с вызовом этой функции, лучше добавить кэш - например, статическую переменную, в которой будет словарь (Dictionary). Ключом может выступать сочетание кода валюты и даты, значение - собственно CurrencyRecord. Это поможет избежать множества одинаковых запросов на сайт ЦБ. Если кому-то будет интересно - напишите, добавлю его в комментарии или отдельным постом =)


Спасибо всем кто дочитал, предлагайте в комментариях варианты доработки и улучшения предложенного решения! За идею поста спасибо @AlexeyE30 !

Напоследок упомяну о надстройке для MS Excel - я недавно писал о ней. Проект с открытым исходным кодом, опубликован под свободной лицензией MIT (неограниченное право на использование, копирование, изменение).

Инструкции по установке и описание функций можно найти тут: Надстройка для MS Excel


Страница проекта на гитхабе:

https://github.com/navferty/NavfertyExcelAddIn

Показать полностью 13
1686

ТОП-30 горячих клавиш в Excel нужно знать каждому

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

Вы только начитаете осваивать Excel или уже опытный пользователь не важно, каждый может найти для себя что-то новое.

30 горячих клавиш, которые сберегут уйму вашего времени, кратно увеличат скорость работы, сделают ее приятнее и комфортнее ⬇⬇⬇ :

CTRL+N
– создать новую рабочую книгу;
CTRL+O – открыть существующую книгу;
CTRL+S – сохранить активную книгу;
F12 – вызвать диалоговое окно Сохранить, как;
CTRL+W – закрыть активную книгу;
ALT+TAB – переключение между открытыми приложениями;
CTRL+C – копирование выбранного элемента (-ов);
CTRL+X – вырезание выбранного элемента (-ов);
CTRL+V – вставка скопированного или вырезного ранее;
CTRL+ALT+V – окно Специальная вставка;
CTRL+HOME – возвращение к началу рабочего листа (ячейка A1);
CTRL+END – переход к последней заполненной ячейке текущего листа;
CTRL+SHIFT+ ⬅ ⬆ ⬇➡ – выделение данных на листе по стрелкам;
CTRL+A – выбор всех элементов в документе или окне;
CTRL+SHIFT+L – установить фильтр на таблицу;
CTRL+K – окно Вставка гипперсылки;
CTRL+1 – окно Формат ячеек;
CTRL+SHIFT+% – применить процентный формат к выбранному диапазону;
SHIFT+F2 – вставить примечание в ячейку, если его нет, редактировать примечание, если есть;
ALT+ENTER – новая строка в той же ячейке (перенос строк);
SHIFT+ (+)/(-) – добавление столбца(ов) / удаление столбца(ов);
CTRL+ (+)/(-) – добавление строк(и) / удаление строк(и);
CTRL+E – применить Мгновенное заполнение;
CTRL+Q – окно Быстрого анализа (анализируемый диапазон должен быть выделен);
CTRL+T(L) – окно Создание таблицы;
CTRL+F/H – окно (Найти)/(Заменить);
CTRL+P – окно Печать;
CTRL+Z – отмена последнего действия;
CTRL+Y – повтор последней команды или действия;
ESC – отмена текущего действия.


Лайк +100 к карме)

Показать полностью
Отличная работа, все прочитано!