SensaiKudisai

SensaiKudisai

https://t.me/sigmadice
Пикабушник
поставил 61 плюс и 36 минусов
отредактировал 0 постов
проголосовал за 0 редактирований
3471 рейтинг 831 подписчик 3 подписки 34 поста 31 в горячем

Диаграмма Ганта в гугл таблицах: гайд для пользователя

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

Диаграмма Ганта

Краткая вводная про диаграмму (кто знаком, можете пропустить этот пункт). В стандартном представлении диаграмма представляет собой список задач слева и их графическое представление продолжительности и зависимостей справа.

Положим, у нас есть проект, он содержит ряд задач и подзадач. Для каждой задачи мы устанавливаем сроки ее исполнения - начало и конец. Важно, что у ряда задач могут быть зависимости. Например, задача “Возвести стены дома” не может выполняться параллельно или раньше задачи “Заложить фундамент”, а задача “Выровнять пол” должна начаться в то же время, что и “Залить бетонный пол”. Такие зависимости наиболее наглядны в графическом виде, где мы можем быстро отследить неточности планирования и исправить их.

Состав колонок в шаблоне таблицы

На скрине ниже показано представление диаграммы Ганта в ГТ

Диаграмма Ганта в гугл таблицах: гайд для пользователя Google, Telegram, Видео, Длиннопост

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

Далее подробнее о том, какие поля здесь есть и каково их предназначение.


Столбец A содержит флаги, которые могут быть установлены в значения true или false. По-умолчанию, значение ячейки false, но в случае, если задача была выполнена, можно установить флаг в ячейку. Таким образом, если задача была завершена ранее установленного дедлайна, она пропадет из плана в графической части ГТ (далее в посте опишу этот феномен подробнее).


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


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


Столбец D включает в себя приоритет задач. В данном случае приоритет выставляется автоматически по формуле:


=iferror(arrayformula(if(F3:F<>"";if(F3:F-TODAY()<=2;"высокий";if(F3:F-TODAY()<=4;"средний";"низкий"));""));"")


Исходя из формулы, значение “высокий” устанавливается, если до дедлайна осталось 2 дня, “средний” - 4 дня и “низкий” в остальных случаях. Формула может быть подправлена исходя из вашего представления о приоритете.


Столбцы E и F содержат информацию о начале и окончании задачи соответственно. Данные заполняются пользователями. Формату поля присваивается значение “Дата” автоматически при проставлении даты. В дальнейшем при намерении изменить значение ячейки можно кликнуть по ней дважды и выбрать новую дату из календаря.

Диаграмма Ганта в гугл таблицах: гайд для пользователя Google, Telegram, Видео, Длиннопост

Начиная с колонки G, в шапке таблицы установлены даты. В данном примере один лист ГТ ограничен одним месяцем, но эти даты можно и продлить. Подробнее про механику добавления дат на видео. Кратко: нужно вставить новые столбцы и скопировать последнюю дату в следующие за ней столбцы.

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


Графическая часть таблицы

Как было очевидно до сих пор, в таблице содержится большое количество заливок разных цветов.

Все заливки (помимо шапки) осуществляются инструментами условного форматирования.

На видео также видно, как изменение дат влияет на заливку ячеек в области колонок с датами.

В этом и заключена основная идея этого шаблона.


Далее подробнее про значение каждого цвета в ГТ.


В области списков задач и целей есть 4 цвета.

В колонке с приоритетами возможны 3 опции: зеленый, желтый, красный. Они лишь свидетельствуют об уровне приоритета или срочности задачи и соответствуют названиям: низкий, средний, высокий.

Диаграмма Ганта в гугл таблицах: гайд для пользователя Google, Telegram, Видео, Длиннопост

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


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

Диаграмма Ганта в гугл таблицах: гайд для пользователя Google, Telegram, Видео, Длиннопост

Здесь также возможны 4 варианта заливки.


Сначала посмотрим на вертикальную заливку.

В столбцах G,H и N,O и так далее заливка бледно-розового цвета свидетельствует о том, что эти даты выпадают на сб и вс. Таким образом, можно увидеть, когда задача попадает на выходные дни и не будет выполняться.

На скрине выше предусмотрено, что задача выполняется в выходной день, так как заливка задачи лежит “выше” заливки викенда. Но возможна обратная ситуация, что предусмотрено на скрине ниже. Посмотрите на картинки и найдите одно отличие)

Диаграмма Ганта в гугл таблицах: гайд для пользователя Google, Telegram, Видео, Длиннопост

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


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

Красный цвет - пройденный этап, голубой - текущий и запланированный.


Вернемся к галочкам в колонке A. Как уже упоминалось, флаг в колонке свидетельствует о том, что задача завершена. Посмотрим, как это выглядит на диаграмме.

Диаграмма Ганта в гугл таблицах: гайд для пользователя Google, Telegram, Видео, Длиннопост

В строках 26 и 27 у меня расположены две задачи по майлстоуну Chapter 4, где я подразумеваю изучение темы: просмотреть видео-лекции и выполнить упражнения.

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

Диаграмма Ганта в гугл таблицах: гайд для пользователя Google, Telegram, Видео, Длиннопост

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


Аналогично галочка работает для задач, которые уже были начаты, но вы их завершили раньше назначенного окончания. Пример на скринах ниже в колонке 12.

Диаграмма Ганта в гугл таблицах: гайд для пользователя Google, Telegram, Видео, Длиннопост
Диаграмма Ганта в гугл таблицах: гайд для пользователя Google, Telegram, Видео, Длиннопост

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


Редактируемые столбцы

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


Завершение

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


Ссылка на таблицу https://docs.google.com/spreadsheets/d/1Vx3v9MKnSpl5Pq1GhV7L...

Показать полностью 9 1

Команды в телеграм ботах

Снова привет)

В ботах часто используются команды вида “/command”, которые провоцируют бота на то или иное действие.

Кто уже создавал ботов мог видеть их в @botfather.

Команды в телеграм ботах Telegram, Telegram бот, Бот, Чат-бот, Bots, Google Таблицы, Javascript, Длиннопост

Давайте разберемся как создать этот список команд и присвоить каждой ту или иную функцию.


С созданием списка команд все довольно просто, это реализуется непосредственно в настройках бота через @BotFather:


1) Вводим команду /mybots

2) Видим список наших ботов

3) Выбираем тот бот, которому присвоим список команд

4) Кликаем Edit Bot

Команды в телеграм ботах Telegram, Telegram бот, Бот, Чат-бот, Bots, Google Таблицы, Javascript, Длиннопост

5) Кликаем Edit Commands

Команды в телеграм ботах Telegram, Telegram бот, Бот, Чат-бот, Bots, Google Таблицы, Javascript, Длиннопост

Далее, следуя формату, отправляем список команд, например:

getkeyboard - получить клавиатуру

save - сохранить

Команды в телеграм ботах Telegram, Telegram бот, Бот, Чат-бот, Bots, Google Таблицы, Javascript, Длиннопост

Следим, что нам отвечает отец ботов. Видим сообщение Success - мы молодцы! Идем дальше.


Теперь если мы введем “/” в чате с нашим ботом, то он предложит список команд. Проверяем, что список есть:

Команды в телеграм ботах Telegram, Telegram бот, Бот, Чат-бот, Bots, Google Таблицы, Javascript, Длиннопост

Добавим логику нашим командам


Как уже видно из описания команд, я хочу отправить в чат клавиатуру.

Создам новую ГТ и перейду к написанию скрипта

Команды в телеграм ботах Telegram, Telegram бот, Бот, Чат-бот, Bots, Google Таблицы, Javascript, Длиннопост

Назову файл doPost, здесь будет только эта функция

Команды в телеграм ботах Telegram, Telegram бот, Бот, Чат-бот, Bots, Google Таблицы, Javascript, Длиннопост

Добавлю следующий скрипт:


function doPost(e)

{

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

if (update.hasOwnProperty('message'))

{

let msg = update.message;

let chat_id = msg.chat.id;

let text = msg.text;

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

let date = (msg.date/86400)+25569.125;

let user = msg.from.username;

if (text == "/getkeyboard") {

Demo.send_key("Галочки", chat_id, API, keyboard)

}

if (text == "/save") {

Demo.send("Клавиатура сохранена”, chat_id, API)

}

}

}

Все! Для каждой команды теперь добавлен функционал...


Хорошо, расскажу поподробнее))


doPost(e) - стандартная функция телеграма для обработки сообщений ботом. В нее мы записываем, что бот должен делать при получении той или иной команды.


Как видно из скрипта, команда - это простое текстовое сообщение. При заведении списка команд мы ограничиваем пользователя в свободном написании этих самых команд, тем самым упрощая всем жизнь.


Итак, если текст сообщения == “/getkeyboard”, мы отправляем в чат некую клавиатуру.

Если мы отправили боту команду “/save”, то он ответит нам сообщением “Клавиатура сохранена”.


Подробно функции send и send_key, а также библиотека Demo рассматривались в постах ранее. Вот ссылки:

- Создание бота (функция send)

- Клавиатуры (функция send_key)

- Библиотека


Дабы не перегружать дорогого читателя инфой, остановлюсь здесь)

Как всегда жду фидбека и вопросиков ^^ Всегда рады пообщаться!

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

Типы клавиатур в чат ботах

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


Всего есть два типа клавиатур:

- ReplyKeyboardMarkup;

- InlineKeyboardMarkup.


ReplyKeyboardMarkup используется в случаях, когда вы хотите получить от пользователя конкретный ответ, предоставляя ему возможность не печатать ручками, а выбрать из предлагаемых вариантов. Иными словами, это заготовки текстовых сообщений. Расположены кнопки под полем ввода сообщения

Типы клавиатур в чат ботах Telegram, Бот, Чат-бот, Telegram бот, Bots, Google Таблицы, Длиннопост

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

Типы клавиатур в чат ботах Telegram, Бот, Чат-бот, Telegram бот, Bots, Google Таблицы, Длиннопост

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

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


После выбора того или иного дня бот внесет инфу в ГТ, а именно: дату, имя пользователя и ид чата.

Запись через чат имеет следующий вид

Типы клавиатур в чат ботах Telegram, Бот, Чат-бот, Telegram бот, Bots, Google Таблицы, Длиннопост

Здесь мы выбрали кнопку Сегодня и получили ответ от бота.

В ГТ при этом появилась строчка

Типы клавиатур в чат ботах Telegram, Бот, Чат-бот, Telegram бот, Bots, Google Таблицы, Длиннопост

Подключение и настройка


Каждая клава (инлайн-клавиатур может быть сколько угодно) записана в соответствующую переменную:


var INLINE_Days =

{

"inline_keyboard": [

[{"text": "Сегодня", "callback_data": "today"}],

[{"text": "Завтра", "callback_data": "tomorrow"}],

],

"resize_keyboard": true

}


var KEYBOARD =

{

"keyboard": [

["Записаться", "Отменить запись"]

],

"resize_keyboard": true

}


Обратите внимание, что синтаксис для инлайн (INLINE_Days) и обычной (KEYBOARD) клавиатур различается.

Клавиатурам можно добавить дополнительные свойства, мы использовали только resize_keyboard со значением true. Их не так много и они есть в документации телеграма.


Далее в коде обращаемся к клавам по имени переменной.


С ReplyKeyboardMarkup все достаточно просто. Она добавляется при первом прогоне скрипта, когда вы отправляете в чат команду /start, например.


Нам нужна функция, которая отправит в чат клавиатуру. Функция та же, что и при отправке сообщения ботом send(), за двумя исключениями:


- у функции появляется дополнительный параметр - keyboard;

- у объекта payload появляется доп свойство - reply_markup : JSON.stringify(keyboard)


Ниже скрипт функции отправки обычной клавы в чат:


function send_key (msg, chat_id, api, keyboard)

{

var payload = {

'method': 'sendMessage',

'chat_id': String(chat_id),

'text': msg,

'parse_mode': 'HTML',

reply_markup : JSON.stringify(keyboard)

}

var data = {

"method": "post",

"payload": payload

}

UrlFetchApp.fetch('https://api.telegram.org/bot' + api + '/', data);

}


Вызов функции осуществляется из тела функции doPost(e) одной строкой:


send_key("Поехали", chat_id, API_TOKEN, KEYBOARD)


Здесь всё.


Что касается инлайн-клавиатур.

Отправка клавиатуры наступает при определенном условии. Если пользователь отправил в чат слово “Записаться”, то отправляем ему нашу инлайн-клаву:


if (text == "Записаться") {

Demo.send_key("Выберите день", chat_id, API_TOKEN, INLINE_Days)

}


Переменная text  содержит текст сообщения, которое мы и проверяем на соответствие.


Результатом выполнения функции send_key будет сообщение от бота Выберите день и кнопки под ним.


Далее нужно предусмотреть алгоритм обработки нажатия этих кнопок.

Если мы кликаем на какую-либо из кнопок (“Сегодня” или "Завтра"), то добавляем новую строку в ГТ и отправляем сообщение в чат, что запись создана.


if (data == "today")

{

let date = Demo.getNewDate(0);

let ind = get_ind(chat_id);

Clients.getRange(ind,1).setValue(user_name);

Clients.getRange(ind,2).setValue(chat_id);

Clients.getRange(ind,3).setValue(date);

Demo.send("Вы успешно записались. "+"Дата визита: "+ date, chat_id, API_TOKEN);

}


Ниже скрипт полностью (не забываем, что значения глобальных переменных у вас будут свои):


// Объявляем все нужные нам переменные. Док важно открывать именно по ID, а не брать активный док, т.к. запуск кода будет производить бот

const API_TOKEN = "1946675042:AAHg1HTHe42GhR9EEt0EdbR94j1G8pDcTWE";

const DOC = SpreadsheetApp.openById("1ALJLtLdt-LT7GEF4hawIizVeJXFnoPZCsC0pw7kcp70");

const Clients = DOC.getSheetByName("Clients");

const Calendar = DOC.getSheetByName("Calendar");


function api_connector ()

{

var App_link = "https://script.google.com/macros/s/AKfycbx9izXW_GcUvg-OlXuP9...";

UrlFetchApp.fetch("https://api.telegram.org/bot"+API_TOKEN+"/setWebHook?url="+App_link);

}


function doPost(e)

{

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

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 (text == "Записаться") {

Demo.send_key("Выберите день", chat_id, API_TOKEN, INLINE_Days)

}

if (text == "Отменить запись") {

let ind = get_ind(chat_id);

Clients.getRange(ind,1,1,3).deleteCells(SpreadsheetApp.Dimension.ROWS);

Demo.send("Запись отменена", chat_id, API_TOKEN)

}

}

if (update.hasOwnProperty('callback_query'))

{

var data = update.callback_query.data;

var text = update.callback_query.message.text;

var id = update.callback_query.message.message_id;

var chat_id = update.callback_query.message.chat.id;

var user_name = update.callback_query.from.username;

if (data == "today")

{

let date = Demo.getNewDate(0);

let ind = get_ind(chat_id);

Clients.getRange(ind,1).setValue(user_name);

Clients.getRange(ind,2).setValue(chat_id);

Clients.getRange(ind,3).setValue(date);

Demo.send("Вы успешно записались. "+"Дата визита: "+ date, chat_id, API_TOKEN);

}

if (data == "tomorrow") {

let date = Demo.getNewDate(1);

let ind = get_ind(chat_id);

Clients.getRange(ind,1).setValue(user_name);

Clients.getRange(ind,2).setValue(chat_id);

Clients.getRange(ind,3).setValue(date);

Demo.send("Вы успешно записались. "+"Дата визита: "+ date, chat_id, API_TOKEN);

}

}

}


Отдельно ниже представлена доп функция, которая проверяет наличие ид в ГТ. Если ид уже есть в таблице, мы обновляем данные у строки с этим ид. В противном случае создаем новую строку.


function get_ind() {

let chat_id = 311157431;

let arr = Clients.getRange(1,2,Clients.getLastRow()).getValues()

arr = arr.flat()

let ind = arr.indexOf(chat_id)

if (ind > -1) {

ind = ind+1;

} else {

ind = Clients.getLastRow()+1;

}

return ind

}



ID для подключения библиотеки Demo: 1JkXEW_zfhr6v0TKsvU_ZbygNLpXEczxZcC46fMF_ffk-noMk8UKcMitz


Здесь также заметим, что клик по кнопке в инлайн клавиатуре отправляет боту JSON со свойством callback_query. Это значит, что нам нужны дополнительные переменные, в которые мы запишем значения из этого JSON пакета.


Это краткая вводная в мир клавиатур. Скоро будут посты про простые сервисы, куда будут добавлены и доработаны те же клавиатуры и доп функции.

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

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6)

Глобально задача в следующем:

1 - забрать с какого-нибудь сайта прогноз погоды

2 - подключить бота и привязать его к таблице

3 - настроить триггер для отправки.

Посмотрев несколько сайтов с погодой - выбор пал на Яндекс, ввиду удобной структуры сайта.

Отсюда я забрал прогноз:

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

Подробнее о том как спарсить данные с сайта в таблицу в этом посте: Парсинг данных с сайтов в гугл таблички (GS1)

Тут приведу только формулу:

=IMPORTHTML("https://yandex.ru/pogoda/ufa/details?via=mf#26","table",1)

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

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


Если ранее мы использовали chat_id - чат с самим ботом, то сейчас мы будем использовать ид чата/ группы в телеграме, в который бот был добавлен.

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

Соответственно, нам нужна функция, которая будет это делать:


function link(chat_id) {

//записывает ид чата в таблицу

DOC.getSheetByName("Settings").getRange(2,1).setValue(chat_id);

Demo.send("ID записан", chat_id, API_TOKEN);

}


Важно! В строке Demo.send я вызываю функцию send, которая уже рассматривалась в посте про создание бота. Demo в данном контексте - это название библиотеки, также подробнее про библиотеки можно почитать в соответствующем посте.


Вызывать ее мы будем из тела функции doPost(e) при условии, что боту отправлена команда /link. В коде это выглядит вот так:

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

Теперь соберем все вместе и сформируем сообщение для отправки в чат.


Глобальные переменные:


API_TOKEN - токен бота

DOC - ссылка на вашу гугл таблицу

DATA - лист гугл таблицы, содержащий прогноз погоды

SETTINGS - лист гугл таблицы, содержащий значение chat_id

App_link - URL веб приложения

Все, что в кавычках, должно быть изменено на ваши значения.

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

Функция для подключения веб хука:

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

Функция link(chat_id) для запоминания id чата

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

Функция daily() для формирования и отправки прогноза в чат:

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

На данный момент функция daily() не вызывается другой функцией или командой типа /link или /hello.


Мы добавим триггер, который будет вызывать функцию автоматически каждое утро.


Переходим на вкладку Triggers

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

Добавляем новый триггер

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

В окне задаем необходимые параметры.

Во-первых, функцию. Фукция, которая вызывается по триггеру, - daily().

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

Event source - по времени (Time-driven)

Type of time based trigger - Day timer (раз в день)

Time of day - в какое время триггер должен сработать

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

Сохраняем.


Результат работы скрипта ниже.

Чат с прогнозом погоды и триггеры в гугл таблицах (GS6) Telegram, Telegram бот, Google Таблицы, Бот, Чат-бот, Bots, Длиннопост

Дополнительно: триггеры на то и триггеры, что работают автономно (без участия пользователя или разработчика, с закрытым доком или чатом. В любой ситуации сообщение будет отправлено в чат в установленное время с установленной частотой.

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

Создание библиотеки в гугл скриптах

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

Что такое библиотека? Это набор функций и методов, которые часто используются программистами в разных программах. Чтобы не создавать одну и ту же функцию дважды или больше раз, достаточно один раз сохранить ее в библиотеку и подключать библиотеку к новому коду с уже написанными стандартными функциями.


Го к примерам.

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


Создаем новые ГТ и скрипт в ней

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

Пропишем функцию send(msg, chat_id) :


function send (msg, chat_id, api) {

//Отправляет сообщения в тлг. На вход функции дать сообщение и ID чата, в который нужно провести отправку

var payload = {

'method': 'sendMessage',

'chat_id': String(chat_id),

'text': msg,

'parse_mode': 'HTML'

}

var data = {

"method": "post",

"payload": payload

}

UrlFetchApp.fetch('https://api.telegram.org/bot' + api + '/', data);

}


Сохраняем проект и делаем деплой

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

Кликаем по шестеренке и выбираем Library

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

Кликаем Deploy внизу окна и видим ссылку на библиотеку

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

Из всей ссылки нам нужен только id, который зашит между /d/ и /4 (согласно скрину выше) - 1iJ_IOEicfGzTlfbhDkcKIcBBEbh9UJ8WLf1FRQZ1Wu_Wnoqw6OBtITjZ. Копируем свой ид и идем дальше.


Создаем новые гугл таблицу и скрипт. В скрипте прописываем глобальные переменные

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

Помним, что значения этих переменных у вас будут свои.


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


Добавляем библиотеку

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

В открывшемся окне вставляем ID библиотеки (не ссылку, а ид) и кликаем Look up

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

Если подключение библиотеки прошло успешно, в окне появятся дополнительные поля выбора версии и указания идентификатора.


Название идентификатора меняем на короткое и понятное и кликаем Add.

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

В результате в списке библиотек видим новую библиотеку

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

Напоминаю, что в библиотеке у нас 1 функция. К ней можно обратиться следующим образом: имяБиблиотеки.имяФункции

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

Когда вы прописываете имя библиотеки и ставите точку, вы видите список всех доступных функций. В нашем случае это только функция send. Выбираем ее и прописываем передаваемые параметры:

Demo.send("Hello World", chat_id, API_TOKEN)

Сохраняем проект, кликаем Deploy, обновляем Api_link, выполняем функцию api_connector и идем тестить работу этого бота (этот алгоритм действий также подробнее описан в статье про создания бота).

Новый бот отправляет сообщение в чат с помощью функции, которая зашита в библиотеке.

Создание библиотеки в гугл скриптах Telegram, Bots, Бот, Telegram бот, Google Таблицы, Библиотека, Длиннопост

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

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

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

Всем ку

Комбинация из ТЛГ и ГТ, простота подключения КМК делает из ГТ офигенный инструмент автоматизации.

Тайм-менеджмент, таск-менеджмент, учёт финансов, объявления, пересылка событий - всё это создается и довольно быстро настраивается. Главное - это становится полезным не только в бизнесе, но и для обычных чатлан.

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

Для начала находим отца всех ботов @botfather в телеге.

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост
Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

После старта бота botftaher выведет список команд. Здесь нам интересна команда создания нового бота /newbot.

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

Порядок очень простой: создать бота, назвать его человеческим языком, задать ему username. В результате получаем API токен нашего бота (1860347610:AAH1q6eqTPnVh0qe6mQWidNSTELcprXEfOk). Он-то нам и нужен.

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

Теперь переходим к гугл таблице. Создаем новую таблицу, переходим в пункт меню Инструменты/Tools -> Редактор скриптов/ Script editor.

Должно получиться вот это:

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост
Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

Затираем дефолтный код и вставляем следующий скрипт:


const API_TOKEN = '1860347610:AAH1q6eqTPnVh0qe6mQWidNSTELcprXEfOk'

const DOC = SpreadsheetApp.openById(‘10W0T9eOP_NN_6g4qyEJzWjm4nkKRN2vyUOnpx73f-N0’);

function doPost(e) {

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

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

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

}

UrlFetchApp.fetch('https://api.telegram.org/bot' + API_TOKEN + '/', data);

}


Обращаем внимание на переменные DOC и API_TOKEN (выделено жирным). Значения переменных необходимо исправить на ваши значения.


Таким образом:

1) меняем ID гугл таблицы (находится в строке адреса после /d/)

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост
Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

2) меняем токен бота, который мы получили при его создании выше

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

Круто! Львиная доля работы уже проделана.

Следующим важным моментом является регистрация вебхука (webhook).

Добавим следующий код к нашему скрипту:


function api_connector () {

const App_link = "";

UrlFetchApp.fetch("https://api.telegram.org/bot"+API_TOKEN+"/setWebHook?url="+App_link);

}


Переменную App_link пока оставляем пустой. Следующий шаг - это генерация значения для нее.


Сохраняем наш код и кликаем Deploy.

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

В открывшемся окне кликаем по шестеренке и выбираем Web app

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

В поле Who has access выбираем Anyone

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

И кликаем Deploy.


При первом запуске приложение попросит авторизации. Проделываем это упражнение.


Получаем следующее:

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

Здесь нам нужен URL в самом конце. Копируем его и вставляем в качестве значения переменной App_link.


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


function api_connector () {

const App_link = "https://script.google.com/macros/s/AKfycbznvI6P0sc4vrIm7GW6C...";

UrlFetchApp.fetch("https://api.telegram.org/bot"+API_TOKEN+"/setWebHook?url="+App_link);

}


Снова сохраняем код и запускаем функцию api_connector:

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост
Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

И наконец переходим к боту в телеге! Запускаем, отправляем команду /hello и видим результат.

Подключение телеграм бота к гугл табличкам - обновленный пост (GS3) Google Таблицы, Telegram бот, Telegram, Бот, Bots, Длиннопост

Теперь подробно по коду. В коде всего 3 функции:


doPost(e)

send (msg, chat_id)

api_connector ()


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

В нашем случае, если мы отправляем команду /hello, бот отвечает Hello World, вызывая функцию send. Это все его действия.


send - функция, которая непосредственно осуществляет отправку сообщения в чат. Функция имеет параметры msg (текст сообщения) и chat_id (ид чата, в который осуществляется отправка).


api_connector - функция подключения вебхука

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

Как переносить большие данные между таблицами // Что делать если importrange не работает?

Котятки, привет)

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

Для теста нам понадобятся:

- тест импорта источник

- тест импорта назначение (скрипт пишем здесь)

Для начала объявляем переменные для документов:

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

В документе источника решаем, что будем импортить, как правило это конкретные столбцы. Допустим столбцы “запись 4” и “запись 7”

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

В скрипте эта запись выглядит так:

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

Примечание: в доке назначения заранее добавьте строки, если вставляемое число строк больше того, что есть в назначенном документе

Дальше очистим значения листа в итоговом документе, это нужно, чтобы не оставалось лишних данных

И указываем диапазоны :

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

Dest.getRange(1,1,Lr), где 1 номер начальной строки, lr номер последней строки и 1 посередине - номер столбца ,куда будет записываться данные

Все, готово:)

Готовый скрипт выглядит вот так, согласитесь крайне несложно)) :

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

Скрипт готов, теперь поговорим, как же его запустить. Есть два варианта:

1. Добавить триггер самообновления

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост
Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

Настроить периодичность обновления скрипта

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

Например: обновление раз в сутки или каждые 4 часа

Или же можно воспользоваться вторым способом

2) Вставить рисунок, и обозначить скрипт

Вставляем рисунок и нажимаем на 3 точки

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

Дальше выбираем “назначить скрипт”

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

Пишем название скрипта до скобок (в скрипте это название функции):

Как переносить большие данные между таблицами // Что делать если importrange не работает? Google Таблицы, Google, Формула, Длиннопост

Теперь при нажатии на эту картинку будет исполняться скрипт :)

Готово!) И не пугайтесь, если скрипт отрабатывает, как вам кажется слишком долго, учитывая объем инфы - полторы минуты эт норма.


Р.S. Готовый скрипт:

function import_data() {

const CURRENT = SpreadsheetApp.getActiveSpreadsheet();

const Dest = CURRENT.getSheetByName("Dest");

const SOURCE = SpreadsheetApp.openById("1JjqIJln5IKjNaLBMRVQAH72x8doTZLykf_3JeB1i0wQ");

const Source = SOURCE.getSheetByName("Source");

const dataArr = Source.getRange("A:A").getValues();

const zapis4Arr = Source.getRange("E:E").getValues();

const zapis7Arr = Source.getRange("H:H").getValues();

const lr = Source.getMaxRows();

Dest.clearContents();

Dest.getRange(1,1,lr).setValues(dataArr);

Dest.getRange(1,2,lr).setValues(zapis4Arr);

Dest.getRange(1,3,lr).setValues(zapis7Arr);

}

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

Цветные таблицы. Кошаки. Старт нового проекта :)

Доброго времени суток, котяточки. У меня для вас классные новости, но обо всем по порядку.

Из - за моей великой любви к табличкам, год назад я начал вести этот блог. За это время несколько моих читателей переросли в моих клиентов, а откликов на посты и запросов на консультацию становилось все больше и было принято решение о старте собственного проекта.  С гордостью расскажу вам о своём детище, под названием Colorful Tables, да - да, цветные таблички). Старт своего проекта стал глотком свежего воздуха и раньше я не испытывал такого кайфа от работы. И виновники моего счастья - свобода самостоятельно принимать решения и построить команду в соответствии с той горой нонфикшн литературы, которой я вдохновлялся последние годы и собственно отличная команда, которую удалось собрать. Для себя я на старте решил, что мне не оч интересны большинство HR-ных метод и подбирал команду по двум критериям - чтобы человек хотел учиться и чтобы нам было круто общаться. Таким образом в команду попали 3 девочки-джуна (они просто невероятные *___*), которых буду учить таблицам с самого нуля и с первых дней - все решения по дальнейшей судьбе проекта мы принимаем совместно.

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

И в завершении, дорогие читатели, хочу вас поблагодарить, что интересуетесь моим блогом, читаете и ждёте новых постов. И раз уж Пикабу стал для меня одним из основных каналов продаж - принимаю заявки на новые заказы в телеграм :)

ЗЫ Прототип нашего лого на фото :)

Цветные таблицы. Кошаки. Старт нового проекта :) Google Таблицы, Обучение
Показать полностью 1
Отличная работа, все прочитано!