<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Eugeny N</title><author><name>Eugeny N</name></author><id>https://teletype.in/atom/google_sheets</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/google_sheets?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/google_sheets?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-04T04:42:49.398Z</updated><entry><id>google_sheets:rashodusi</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/rashodusi?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>Создаём телеграм бота для подсчета расходов</title><published>2023-07-05T14:28:54.845Z</published><updated>2023-07-05T16:05:06.387Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/4e/c1/4ec1e4f4-e3cd-4bd3-9070-b5a875d2ab12.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/27/94/2794627f-4478-4f28-ba18-2c3e75ff9493.jpeg&quot;&gt;Друзья, сегодня статья-урок. Попробуем считать наши расходы лучше, экономить больше. Ну либо просто научимся соединять Телеграм бота и Google Таблицу :)</summary><content type="html">
  &lt;figure id=&quot;nunf&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/27/94/2794627f-4478-4f28-ba18-2c3e75ff9493.jpeg&quot; width=&quot;640&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hJ0l&quot;&gt;Друзья, сегодня статья-урок. Попробуем считать наши расходы лучше, экономить больше. Ну либо просто научимся соединять Телеграм бота и Google Таблицу :)&lt;/p&gt;
  &lt;p id=&quot;vZPa&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;GDXT&quot;&gt;Концепция такая — мы создаём приватный Телеграм канал, чтобы отправлять в него расходы. Помимо вас, расходы смогут отправлять любые люди, которых вы добавите к каналу.&lt;/p&gt;
  &lt;figure id=&quot;50v2&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/02/71/0271259e-cb11-4103-bcbc-8712f38d2b13.png&quot; width=&quot;644&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2wSQ&quot;&gt;А причём тут Таблицы, спросите вы? А мы добавим в этот канал Телеграм бота и пусть все расходы отправляет в Таблицу, добавляя к ним дату и время. &lt;/p&gt;
  &lt;p id=&quot;lIYb&quot;&gt;Сообщение в канал будем отправлять одним сообщением &lt;strong&gt;[сумма] / [на что пошли кровные]&lt;/strong&gt;, а наш бот в канале будет ловить это сообщение и делить его по &lt;strong&gt;/&lt;/strong&gt; и число помещать в одну колонку, а предмет расхода в другую.&lt;/p&gt;
  &lt;figure id=&quot;SYJz&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3c/c2/3cc2a317-9e6e-467a-afd4-ae8bd3fa5d64.png&quot; width=&quot;576&quot; /&gt;
    &lt;figcaption&gt;масло дешёвое нашел, маргарин, наверное, а вот хлеб дорогой, видимо с семечками :)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;YmQv&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;r668&quot;&gt;&lt;strong&gt;Поехали делать.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;TjHy&quot;&gt;1) Создавайте Телеграм бота в &lt;a href=&quot;http://t.me/botfather&quot; target=&quot;_blank&quot;&gt;t.me/botfather&lt;/a&gt; и получайте его токен&lt;/p&gt;
  &lt;p id=&quot;MfV1&quot;&gt;2) Создавайте канал в Телеграм и добавляйте бота в него как администратора&lt;/p&gt;
  &lt;figure id=&quot;mdIJ&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/71/06/7106d461-75f3-455e-9942-f046fbf888ed.png&quot; width=&quot;178&quot; /&gt;
    &lt;figcaption&gt;если сделаете канал &amp;quot;приватным&amp;quot; то его никто не сможет найти через поиск в Телеграм&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;5Stx&quot;&gt;3)Копируйте нашу &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1XOyu5XL95j0W7jYOhJ0KGutgb59WzC1KR4GXqtsdSq8/edit#gid=0&quot; target=&quot;_blank&quot;&gt;Таблицу с кодом&lt;/a&gt; и открывайте в копии редактор скриптов.&lt;/p&gt;
  &lt;p id=&quot;oKvB&quot;&gt;4) Вставьте в переменную &lt;strong&gt;botToken&lt;/strong&gt; токен вашего Телеграм бота, который вы получили от &lt;a href=&quot;http://t.me/botfather&quot; target=&quot;_blank&quot;&gt;@botfather&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;BPyx&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;weux&quot;&gt;Собственно весь наш код с комментариями (их лучше читать в вашей Таблице)&lt;/p&gt;
    &lt;pre id=&quot;fW6v&quot;&gt;/*
1) вставляем токен бота
2) публикуем код как веб-приложение (начать развертывание &amp;gt; новое развертывание &amp;gt; веб-приложение &amp;gt; от моего имени (ваш аккаунт) &amp;gt; доступ для всех пользователей)
3) получаем ссылку приложения, вставляем её в webAppUrl
4) запускаем скрипт setWebhook()
5) при любом изменении кода публикуем веб-приложение под новой версией, setWebhook() повторно запускать не надо 
*/

const botToken = &amp;#x27;&amp;#x27;;
const webAppUrl = &amp;#x27;&amp;#x27;;
const telegramUrl = &amp;#x27;https://api.telegram.org/bot&amp;#x27; + botToken;

/*
setWebhook просто соединяет &amp;#x27;https://api.telegram.org/bot&amp;#x27;, токен вашего бота, &amp;#x27;/setWebhook?url=&amp;#x27; и адрес вашего развернутого приложения в одну ссылку и запрашивает её, тем самым регистрируя отправку всего от вашего бота в адрес вашего приложения
*/
function setWebhook() {
  var response = UrlFetchApp.fetch(telegramUrl + &amp;#x27;/setWebhook?url=&amp;#x27; + webAppUrl);
  Logger.log(response.getContentText());
};

/*
doPost будет принимать сообщение от телеграм и либо логировать на листе &amp;quot;расходы&amp;quot;, либо падать с какой-нибудь ошибкой на листе &amp;quot;ошибки&amp;quot;
*/
function doPost(e) {
  try {
    log(e);
  } catch (err) {
    error(err);
  }
};

/*
LOG принимает объект от doPost, парсит, достаёт сообщение и автора далее делит сообщение на две части по &amp;#x27;/&amp;#x27;, собирает это всё, добавляет дату и вставляет на лист &amp;quot;расходы&amp;quot; в новую строку, если листа с таким названием нет - скрипт его создаст
*/
function log(r) {
  r = JSON.parse(r.postData.contents);
  const message = r.channel_post.text;
  const author_signature = r.channel_post.author_signature;
  const values = [[new Date, author_signature, message, message.split(&amp;#x27;/&amp;#x27;)[0], message.split(&amp;#x27;/&amp;#x27;)?.[1]]];

  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName(&amp;quot;расходы&amp;quot;) || ss.insertSheet(&amp;quot;расходы&amp;quot;);

  sheet.insertRowBefore(2)
    .getRange(2, 1, 1, values[0].length)
    .setValues(values);
};

/*
если при попытке распарсить и вставить сообщение происходит что-то не то, то вы увидите эту ошибку на листе &amp;quot;ошибки&amp;quot;
*/
function error(err) {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName(&amp;quot;ошибки&amp;quot;) || ss.insertSheet(&amp;quot;ошибки&amp;quot;);
  const data = [[new Date(), err.message]];
  sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(values);
};&lt;/pre&gt;
  &lt;/section&gt;
  &lt;p id=&quot;chxW&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;mFkt&quot;&gt;5) Разворачиваем наш код как веб-приложение и вставляем ссылку в &lt;strong&gt;webAppUrl&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;yq02&quot;&gt;&lt;em&gt;Если не знаете как развернуть код как приложение, &lt;a href=&quot;https://drive.google.com/file/d/16Ev-abq_os9VFRDMuBbjIfYJdt1bfmBm/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;вот короткая гифка со звуком&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;iel8&quot;&gt;&lt;strong&gt;doPost&lt;/strong&gt; будет принимать сообщение от вашего Телеграм бота и отправлять либо на лист &amp;#x27;расходы&amp;#x27;, либо на лист &amp;#x27;ошибки&amp;#x27;. Чтобы &lt;strong&gt;doPost&lt;/strong&gt; работал, мы должны развернуть наш скрипт в Таблице как веб-приложение.&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;BTnH&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7f/aa/7faaa412-2283-4547-80db-c0f90d256831.png&quot; width=&quot;898&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rlZl&quot;&gt;6) Запускаем скрипт &lt;strong&gt;setWebhook&lt;/strong&gt;, этот скрипт свяжет адрес нашего веб-приложения и токен бота и Телеграм будет отправлять все, что получит бот в адрес нашего приложения.&lt;/p&gt;
  &lt;p id=&quot;geio&quot;&gt;Если все ок, то увидите что-то такое:&lt;/p&gt;
  &lt;figure id=&quot;8gIl&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/05/74/0574ce2e-b5f2-4388-9591-e60f9e6c8742.png&quot; width=&quot;588&quot; /&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;3N5H&quot;&gt;Объект с сообщением, который будет приходить от Телеграм выглядит как-то так:&lt;/p&gt;
    &lt;pre id=&quot;jKl7&quot;&gt;{
    channel_post:
    {
        date: 1.688566918E9,
        author_signature: &amp;#x27;Eugeny Namokonov&amp;#x27;,
        chat:
        {
            type: channel,
            title: speedsheets,
            id: -1.0019,
            username: &amp;#x27;&amp;#x27;
        },
        sender_chat:
        {
            title: speedsheets,
            type: channel,
            id: -1.001933,
            username: &amp;#x27;&amp;#x27;
        },
        text: &amp;#x27;134 / хлебушек&amp;#x27;,
        message_id: 7.0
    },
    update_id: 6.64
}&lt;/pre&gt;
    &lt;p id=&quot;FDXI&quot;&gt;Мы берём из него в функции &lt;strong&gt;log&lt;/strong&gt; только имя автора и само сообщение, но вы можете брать и другие поля.&lt;/p&gt;
  &lt;/section&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;kDYc&quot;&gt;Всё, теперь пишем в канал сообщения и видим их в Таблице, которую вы развернули как веб-приложение. За это отвечают скрипты &lt;strong&gt;doPost&lt;/strong&gt; + &lt;strong&gt;log&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;zQui&quot;&gt;Либо, если что-то пошло не так, то видим в Таблице ошибку на листе &amp;quot;ошибки&amp;quot;, за это отвечает &lt;strong&gt;doPost&lt;/strong&gt; + &lt;strong&gt;error&lt;/strong&gt; :)&lt;/p&gt;
  &lt;p id=&quot;dtqV&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;tWEi&quot;&gt;&lt;strong&gt;PS&lt;/strong&gt; Чтобы увидеть автора сообщения - в настройках Телеграм канала выберите &amp;quot;Sign Messages&amp;quot;. &lt;/p&gt;
  &lt;p id=&quot;gXJe&quot;&gt;&lt;strong&gt;PPS &lt;/strong&gt;Ну и как обычно - при любом изменении уже опубликованного кода, чтобы новый код попал в веб-приложение и начал работать - приложение надо публиковать под новой (следующей) версией, вебхук при этом пересоздавать не надо.&lt;/p&gt;
  &lt;figure id=&quot;fDYx&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://kartinkof.club/uploads/posts/2022-12/1670487424_kartinkof-club-p-kartinki-yeralash-vse-1.jpg&quot; width=&quot;316&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;PdDZ&quot;&gt;&lt;strong&gt;МЫ:&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;gVCW&quot;&gt;&lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;Канал “Google Таблицы” в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;6oBs&quot;&gt;&lt;a href=&quot;https://goo.gl/HdS2qn&quot; target=&quot;_blank&quot;&gt;Оглавление канала — все статьи&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;E0oM&quot;&gt;&lt;a href=&quot;https://t.me/google_spreadsheets_chat&quot; target=&quot;_blank&quot;&gt;Наш чат в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;0Jma&quot;&gt;&lt;a href=&quot;http://t.me/vas_mnogo_a_ya_bot&quot; target=&quot;_blank&quot;&gt;Заказать работу&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>google_sheets:wb_headers</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/wb_headers?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>ДЛЯ ПРОДАВЦОВ НА WILDBERRIES</title><published>2022-06-27T07:50:42.934Z</published><updated>2022-06-27T07:50:42.934Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f7/c9/f7c95dd4-c7f9-4da2-b3a0-43c66a3360c7.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/1a/37/1a37026e-b2f4-416c-91dc-6369a361119d.png&quot;&gt;Остатки / размеры</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;BobN&quot;&gt;Как выглядят данные, которые загружаются&lt;/h2&gt;
  &lt;/section&gt;
  &lt;p id=&quot;10Q8&quot;&gt;&lt;strong&gt;Остатки / размеры&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;YKqN&quot;&gt;Остаток на одном складе = одна строка&lt;/p&gt;
  &lt;figure id=&quot;PznI&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1a/37/1a37026e-b2f4-416c-91dc-6369a361119d.png&quot; width=&quot;2994&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;s8xt&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;dgyq&quot;&gt;&lt;strong&gt;Все товары продавца&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;Mq78&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/21/be/21be0773-b712-4b96-98f9-a1e7990c4393.png&quot; width=&quot;2868&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jHwL&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;rEC4&quot;&gt;&lt;strong&gt;Остатки (API)&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;SHUH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/44/d1/44d18738-3a7e-4463-a144-cd2ee99b7c47.png&quot; width=&quot;3026&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zHO4&quot;&gt;&lt;strong&gt;Заказы (API)&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;O8ea&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0b/e2/0be23c24-f3f6-4f8c-a527-4343b4b33255.png&quot; width=&quot;3172&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cHTV&quot;&gt;&lt;strong&gt;Продажи (API)&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;Abs3&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7d/37/7d379dd8-119b-4d33-ab1c-1ae20ce03ca6.png&quot; width=&quot;2702&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0mOz&quot;&gt;&lt;strong&gt;Отчет по реализации (API)&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;Co0e&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7d/ae/7daebad6-0e72-41a6-9d48-e5b51b813674.png&quot; width=&quot;2838&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>google_sheets:androids</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/androids?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>Напишем-ка бота!</title><published>2021-06-23T08:41:18.975Z</published><updated>2021-06-24T09:20:12.913Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/f6/a4/f6a45bff-6c3a-4040-9a09-be1a3012a515.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/2f/3b/2f3bc398-b9cf-4bce-8b72-7d87e5ccae6d.png&quot;&gt;Друзья, привет!</summary><content type="html">
  &lt;h2&gt;Телеграм бот, который бегает за данными в Таблицу @t.me/google_sheets&lt;/h2&gt;
  &lt;p&gt;Друзья, привет!&lt;/p&gt;
  &lt;p&gt;Сейчас на моём экране прекрасный датасет – &amp;quot;Отзывы, поступившие через виджет обратной связи АИС &amp;quot;Мониторинг Госcайтов&amp;quot;, я скачал его как CSV из &lt;a href=&quot;https://data.gov.ru/&quot; target=&quot;_blank&quot;&gt;https://data.gov.ru/&lt;/a&gt; и открыл в &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1ovL6iIOUNg2JPIa2dBpg3ZOPTSNjrpLrFtIqFM-E0pU/edit#gid=1250525682&quot; target=&quot;_blank&quot;&gt;Таблице&lt;/a&gt;&lt;a href=&quot;true&quot;&gt;.&lt;/a&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2f/3b/2f3bc398-b9cf-4bce-8b72-7d87e5ccae6d.png&quot; width=&quot;2242&quot; /&gt;
    &lt;figcaption&gt;Cсылки не работаёт, приложение мёртвое, зато у меня айфон :)&lt;br /&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;В Таблице – 16 000 строк и 16 же столбцов: отзыв, информация о нём и информация про ответ. &lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Что будем с этим делать?&lt;/strong&gt; Сегодня я покажу &lt;strong&gt;простой&lt;/strong&gt; скрипт, с помощью него вы сможете развернуть своего Telegram бота, который будет запрашивать информацию из вашей Таблицы.&lt;/p&gt;
  &lt;p&gt;Мы будем использовать Таблицу с отзывами - запросим конкретные строки или выбранные даты, ну а вы сможете применить это к вашему делу: узнавать остатки на складе, продажи и курс любимой криптовалюты.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;В чём вообще проблема с ботами? &lt;/strong&gt;На самом деле – это сложно, причём не только писать с 0, а даже пытаться адаптировать решение, которое полностью готово и к которому есть инструкция. Самый частый вопрос в нашем чате – всё сделал по инструкции, но у меня не заработало (на самом деле не всё :)&lt;/p&gt;
  &lt;p&gt;Поэтому сейчас мы напишем очень простой код, а самое сложное действие (как развернуть приложение, получить ссылку и создать вебхук) – я покажу на гифке.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Поехали&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Телеграм нам нужен  для того, чтобы создать бота (&lt;a href=&quot;https://t.me/botfather&quot; target=&quot;_blank&quot;&gt;https://t.me/botfather&lt;/a&gt;) и получить его токен (там же).&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Немного теории: как работает бот на вебхуках&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;1) Мы пишем серверную часть в Таблице / GAS скриптах и разворачиваем приложение, получаем его ссылку;&lt;/p&gt;
  &lt;p&gt;2) Далее к этой ссылке мы привязываем токен нашего бота (создаём вебхук);&lt;/p&gt;
  &lt;p&gt;3) Далее, когда бот кому-то пишет или пишут боту- объект с информацией  сообщения отправляется на адрес развернутого приложения;&lt;/p&gt;
  &lt;p&gt;4) Приложение получает этот объект и работает с ним в соответствии с кодом, который мы напишем. Может отправлять сообщение пользователю, например.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Объект от Telegram API выглядит примерно так, на скриншоте не всё, могут быть разные ключи и значения в зависимости от ситуации, в которой находится пользователь - отправляет сообщение, отвечает на чужое, редактирует..&lt;/p&gt;
  &lt;figure class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/92/74/9274e741-0343-477e-90b8-e4ea13583878.png&quot; width=&quot;441&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Ну, к коду – пусть пользователь отправляет в бота строку с датой, бот принимает это сообщение, берёт данные, фильтрует по дате, соединяет и возвращает пользователю в нескольких сообщениях результат из Таблицы.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Первая функция – загрузка данных из Таблицы.&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Обращаемся к Таблице по ссылке, к конкретному листу в ней и забираем все данные этого листа.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b0/dd/b0ddbbbc-f35a-4cd5-a938-796ab1027166.png&quot; width=&quot;672&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;code&gt;function getBigData() {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;return SpreadsheetApp.openByUrl(&amp;#x27;https://docs.google.com/s&amp;#x27;)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;.getSheetByName(&amp;#x27;обратная связь&amp;#x27;)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;.getDataRange().getValues();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Вторая функция – фильтрация&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Окей, представим, что нам нужно отобрать данные c 1 февраля по 2 февраля, фидбек старый - поэтому ставим 2015 год.&lt;/p&gt;
  &lt;p&gt;И у нас сразу сложный случай – работа с датами в JavaScript. Есть много способов, я сделаю так - приведу даты к МС и уже числа сравниваем внутри фильтра.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9a/e0/9ae0383f-8775-47c8-89b0-0153b6982dba.png&quot; width=&quot;1702&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;em&gt;y[6] - это седьмая колонка данных, в этой колонке как раз дата отзыва, она седьмая, а на ней написано 6 потому, что элементы в массивах в JS начинаются с 0&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Также в этой функции у нас работа с сообщением телеграма&lt;/strong&gt; (преобразование сообщения в даты)&lt;/p&gt;
  &lt;p&gt;Давайте представим что пользователи будут отправлять в бота месяц-день и месяц-день, разделенные запятой.&lt;/p&gt;
  &lt;p&gt;Мы с помощью &lt;code&gt;=split&lt;/code&gt; делим строку на две части и аккуратно вставляем в конструктор даты.&lt;/p&gt;
  &lt;p&gt;Смотрите на журнал внизу - вставлено правильно, а вот если бы я удалил &lt;code&gt;T&lt;/code&gt; у времени - была бы ошибка и январь :)&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0e/25/0e25c079-daa1-4570-a4cc-28df8ca74135.png&quot; width=&quot;599&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Целиком вторая функция, фильтрация данных по датам&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/16/2f/162fc537-d4e9-4c8b-8cff-50087a47dbd8.png&quot; width=&quot;755.3924050632911&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;code&gt;function mixerBigData(msg) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;msg = msg.split(&amp;#x27;,&amp;#x27;);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;date1 = new Date((&amp;#x27;2015-&amp;#x27; + msg[0] + &amp;#x27;T00:00:00&amp;#x27;));&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;date2 = new Date((&amp;#x27;2015-&amp;#x27; + msg[1] + &amp;#x27;T00:00:00&amp;#x27;));&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Logger.log([date1, date2])&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;return data = getBigData().filter(y =&amp;gt; (new Date(y[6]).getTime() &amp;gt;= date1.getTime())&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;&amp;amp;&amp;amp; (new Date(y[6]).getTime() &amp;lt;= date2.getTime()))&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Третья функция - оставляем только нужные столбцы&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Нам не нужны все отобранные данные - оставим только дату, обратную связь и ответ на обратную связь, это столбцы 7, 10 и 11.&lt;/p&gt;
  &lt;p&gt;И  объединяем отзывы через перенос строки, а столбцы через тире.&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/24/f8/24f83f44-007d-4705-bc1c-79b4248cb85b.png&quot; width=&quot;736.0000000000001&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;code&gt;function mergeBigData() {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;return mixerBigData(&amp;quot;02-01,02-05&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;.map(t =&amp;gt; t[6] + &amp;#x27;––––&amp;#x27; + t[9] + &amp;#x27;––––&amp;#x27; + t[10])&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;.join(&amp;#x27;\n\n&amp;#x27;)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Ну что - часть про данные у нас полностью готова, теперь научимся работать с ботом.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Четвертая функция - doPost()&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Функция называется doPost(), она будет развёрнута как приложение и в её аргумент &lt;code&gt;e&lt;/code&gt; будет попадать объект от нашего бота.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Итак, по блокам, - парсим пришедший объект и достаём то, что нам нужно - само сообщение, chatId отправителя и username отправителя в телеграме&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;function doPost(e) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//парсим объет, который пришёо&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;e = JSON.parse(e.postData.contents)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const msg = e[&amp;#x27;message&amp;#x27;][&amp;#x27;text&amp;#x27;];&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const fromId = e[&amp;#x27;message&amp;#x27;][&amp;#x27;from&amp;#x27;][&amp;#x27;id&amp;#x27;]&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const fromUsername = e[&amp;#x27;message&amp;#x27;][&amp;#x27;from&amp;#x27;][&amp;#x27;username&amp;#x27;]&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Этот блок логирует полученный объект целиком в нашу таблицу, на лист &amp;quot;логи&amp;quot;, добавляя таймстемп. Удобная штука, можно посмотреть, кто писал в бота и попытаться разобраться с ошибками.&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//логируем в таблицу&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const ss = SpreadsheetApp.openByUrl(urlSs);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;ss.getSheetByName(&amp;#x27;логи&amp;#x27;).appendRow([new Date(), JSON.stringify(e)])&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Дальше я придумал что-то вроде проверки, чтобы наша команда запускалась только у авторизованных пользователей (их, то есть свой три раза, юзернем я добавил в массив &lt;code&gt;trueList&lt;/code&gt;).&lt;/p&gt;
  &lt;p&gt;А еще мы проверяем, что наше сообщение с запятой внутри и после этого скрипт запускает функции сбора и фильтрации данных.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Последнее - мы делим сообщение на отдельные сообщения по 4096 символов - максимальная длина сообщения для телеграм API.&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//список юзернеймов телеграма, которым вы разрешили использовать функционал бота&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const trueList = [&amp;#x27;namokonov&amp;#x27;, &amp;#x27;namokonov&amp;#x27;, &amp;#x27;namokonov&amp;#x27;];&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//проверяем, правильный ли юзернейм написал&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;if (trueList.includes(fromUsername)) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;// проверяем присланное сообщение, пусть метрикой будет наличие запятой&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;if (/\,/.test(msg)) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//кажется всё ок - отправляем пользоователя ответ&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//собираем наше сообщение и отправляем по 4096 символов –&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//(максимум для отправкм в телеграме&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;var messages = mergeBigData(mixerBigData(msg))&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;sendMessage(fromId, message = messages.slice(0, 4095))&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;};&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;И пятая функция - функции &lt;/strong&gt;- это сниппеты для отправки сообщения в телеграм и для создания / удаления вебхука&lt;/p&gt;
  &lt;p&gt;Я их поместил на лист telegram Bot Api, на нём вам нужно будет заполнить токен бота и ссылку на веб-приложение.&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2c/3e/2c3e224b-4b22-43b7-a3aa-77fc00d4f365.png&quot; width=&quot;775.2398956975229&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h3&gt;&lt;strong&gt;Гифка-инструкция по установке с нуля &lt;/strong&gt;&lt;/h3&gt;
  &lt;p&gt;- в ней я скопирую текущую Таблицу и все сделаю для того, чтобы копия заработала. &lt;/p&gt;
  &lt;p&gt;Когда будете говорить, что у вас не работает - смотрите гифку :)&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://drive.google.com/file/d/1eFScmxC5mXxWV_TOL-GZUWRFv9XRkfkp/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;https://drive.google.com/file/d/1eFScmxC5mXxWV_TOL-GZUWRFv9XRkfkp/view?usp=sharing&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1ovL6iIOUNg2JPIa2dBpg3ZOPTSNjrpLrFtIqFM-E0pU/edit#gid=1250525682&quot; target=&quot;_blank&quot;&gt;И Таблица со всем кодом&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://pastebin.com/FAxCTa4y&quot; target=&quot;_blank&quot;&gt;Код отдельно&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Ребята, если будут вопросы – не пишите ночью в личку :) У нас для этого есть чатик: &lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_spreadsheets_chat&quot; target=&quot;_blank&quot;&gt;https://t.me/google_spreadsheets_chat&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; в коде Таблицы и в pastebin изменил обращение к Таблице - теперь ходим в текущую и активную Таблицу и из неё забираем данные и в неё пишем логи.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;МЫ:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;Канал “Google Таблицы” в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://goo.gl/HdS2qn&quot; target=&quot;_blank&quot;&gt;Оглавление канала — все статьи&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_spreadsheets_chat&quot; target=&quot;_blank&quot;&gt;Наш чат в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://money.yandex.ru/to/41001891748860&quot; target=&quot;_blank&quot;&gt;Донаты&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>google_sheets:start_gas2</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/start_gas2?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>Скрипты для новичков. Часть 2 | @google_sheets</title><published>2021-06-08T11:00:51.815Z</published><updated>2021-06-08T11:21:47.010Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/49/db/49db7cc3-0f2e-4c2b-bebd-dba300a993e5.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/0a/fc/0afc51d2-a41b-4f69-9855-0b576efed195.png&quot;&gt;Часть 1 – обращаемся к текущей Таблице, к выбранному листу, забираем диапазон заполненных ячеек и разбираемся, что нам возвращается.</summary><content type="html">
  &lt;p&gt;&lt;a href=&quot;https://spreadsheets.ru/start_gas1&quot; target=&quot;_blank&quot;&gt;Часть 1&lt;/a&gt; – обращаемся к текущей Таблице, к выбранному листу, забираем диапазон заполненных ячеек и разбираемся, что нам возвращается.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Часть 2:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Итак, у нас есть массив с данными. Разберёмся, как обращаться к нему, как посчитать количество строк, как найти последнюю строку вообще, последнюю строку в выбранном столбце, последний столбец.&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0a/fc/0afc51d2-a41b-4f69-9855-0b576efed195.png&quot; width=&quot;815&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;0) Создадим новую функцию, в которой обратимся к функции, которая возвращает все ячейки с данными&lt;/h3&gt;
  &lt;p&gt;&lt;code&gt;function part2() {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const data = getData();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;....&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h3&gt;1) Поехали. Обращаемся к выбранной строке&lt;/h3&gt;
  &lt;p&gt;Чтобы обратиться к элементу массива нужно написать: &lt;/p&gt;
  &lt;p&gt;&lt;code&gt;название массива[номер элемента]&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;(Учитываем, что нумерация элементов массива в JS начинаются с 0, поэтому нулевой элемент - первый)&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Обращаемся к первой строке нашего массива, выводим её в лог:&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;function getRows() {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const data = getData();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Logger.log(data[0])&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1f/fd/1ffd878a-fe27-46aa-857e-4dfba4f26745.png&quot; width=&quot;413.27016129032256&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;&lt;strong&gt;2) Первая строка, пятый столбец&lt;/strong&gt;&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b1/be/b1be1f1c-3f76-4bde-aa41-9d46ef20c252.png&quot; width=&quot;1174&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Добавляем &lt;code&gt;[4]&lt;/code&gt; -&amp;gt; &lt;code&gt;data[0][4]&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;Помним, что элементы массивов начинаются с 0, поэтому обращаясь &lt;code&gt;data[0][4]&lt;/code&gt; к массиву, который сформирован из данных, которые мы забрали из листа - мы обращаемся к первой строке и пятому столбцу.&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b0/f6/b0f605e5-c1b3-4bba-96d6-27a9f956bdd2.png&quot; width=&quot;537&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;&lt;/h3&gt;
  &lt;p&gt;&lt;strong&gt;3) Определяем индекс (номер) последней строки&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/89/bd/89bd42d7-e72a-4deb-87a8-bbbbb8c35848.png&quot; width=&quot;732.0771704180064&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Используем метод &lt;code&gt;length&lt;/code&gt;,  метод возвращает число элементов массива. &lt;/p&gt;
  &lt;p&gt;Если применить его к нашему массиву массивов – метод вернёт количество внутренних массивов, в нашем случае - строк.&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const data = getData();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Logger.log(data.length);&lt;/code&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0a/fc/0afc51d2-a41b-4f69-9855-0b576efed195.png&quot; width=&quot;1260&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/36/b5/36b524da-1227-438e-ac50-97de2b47074f.png&quot; width=&quot;310&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Чудно, последняя строка действительно двенадцатая. &lt;/p&gt;
  &lt;h3&gt;&lt;/h3&gt;
  &lt;h3&gt;4) Обращаемся к последней строке&lt;/h3&gt;
  &lt;p&gt;Длина  массива - 12 строк, индексация массивов в JS начинается с 0, поэтому, чтобы обратиться к последней строке, нам нужно обратиться к 11 элементу (длина массива - 1)&lt;/p&gt;
  &lt;p&gt; &lt;code&gt;data[length - 1]&lt;/code&gt; &lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e5/f1/e5f15293-fa14-4944-a6ba-7cadbaab9202.png&quot; width=&quot;750&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h3&gt;5) Оставляем только строки с данными&lt;/h3&gt;
  &lt;p&gt;В нашем случае 12 - это еще и количество строк с данными, но это только потому, что в середине нашего массива нет пустых строк.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;С помощью &lt;code&gt;filter&lt;/code&gt; и &lt;code&gt;some&lt;/code&gt; мы сможем гарантировано отфильтровать наш массив от пустых строк, метод оставит строки с заполненной хотя бы одной ячейкой.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Поменяем данные, пусть они выглядят так.&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0d/9d/0d9df2a1-5e69-4b3e-861f-7aba84371815.png&quot; width=&quot;463&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;И отфильтруем:&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//фильтруем массив от пустых строк&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const rowsWithData = data.filter(t =&amp;gt; t.some(t =&amp;gt; t))&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Logger.log(rowsWithData)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Logger.log(rowsWithData.length)&lt;/code&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/41/29/41292824-68e1-488e-a8c9-cbb857a1cc50.png&quot; width=&quot;748&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;code&gt;rowsWithData&lt;/code&gt; – отфильтрованный с помощью &lt;code&gt;filter&lt;/code&gt; массив из скриншота выше, теперь он без пустых строк;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;rowsWithData.length&lt;/code&gt; – количество строк отфильтрованного массива – их 6;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h3&gt;6) Находим последнюю строку с данными в выбранном столбце&lt;/h3&gt;
  &lt;p&gt;Для этого используем любой цикл, который переберёт наши строки, возвращая индекс строки, если выбранный столбец содержит значение.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;например&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;function getLastRow(data, column) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  var lr;&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  for (x in data) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;    if (data[x][column - 1]) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;      lr = x;&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;   }&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  return lr*1 + 1;&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;или&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;function getLastRow(data, column){&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;   return Math.max(...(data.map((g, i) =&amp;gt; !g[column-1] ? &amp;#x27;&amp;#x27; : ++i)));&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2c/c9/2cc9b03a-6572-4cd5-863c-89d312c3a854.png&quot; width=&quot;501.99999999999994&quot; /&gt;
    &lt;figcaption&gt;передаем в функцию диапазон данных и столбец, фунция возвращает последнюю заполненную ячейку в столбце (6&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Используем функцию в скриптах, передаем в нее наш массив данных и столбец поиска и возвращаем индекс последней строки в лог:&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;function getRowI(){&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const data = getData();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const lr = getLastRow(data, 2)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Logger.log(lr)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/17/63/1763f295-7db9-4bc8-9a3a-0e477b1351c0.png&quot; width=&quot;626&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;a href=&quot;https://pastebin.com/teJvbxqV&quot; target=&quot;_blank&quot;&gt;Скрипт в pastebin&lt;/a&gt; (будет пополняться)&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1L_-NJntp0y2Z5hz4KxR-rRYghl7wwG8cma4oIZubowg/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;Таблица со скриптом&lt;/a&gt; (будет пополнятся)&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Мы:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;Канал “Google Таблицы” в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://goo.gl/HdS2qn&quot; target=&quot;_blank&quot;&gt;Оглавление канала — все статьи&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_spreadsheets_chat&quot; target=&quot;_blank&quot;&gt;Наш чат в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://money.yandex.ru/to/41001891748860&quot; target=&quot;_blank&quot;&gt;Донаты&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>google_sheets:start_gas1</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/start_gas1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>Скрипты для новичков. Часть 1 | @google_sheets</title><published>2021-05-24T11:03:06.249Z</published><updated>2021-05-24T11:26:27.206Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/49/db/49db7cc3-0f2e-4c2b-bebd-dba300a993e5.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/7b/19/7b19a53e-25f1-4854-8fe2-78ae054872d0.png&quot;&gt;Привет! Открываем серию, в которой мы планируем вам показывать простые приёмы работы с Таблицей (и не только) скриптами, также будем слега касаться JS (языка, на основе которого написан Google Apps Script, язык, на котором мы пишем скрипты в Google Docs)</summary><content type="html">
  &lt;p&gt;Привет! Открываем серию, в которой мы планируем вам показывать простые приёмы работы с Таблицей (и не только) скриптами, также будем слега касаться JS (языка, на основе которого написан Google Apps Script, язык, на котором мы пишем скрипты в Google Docs)&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;В этой статье:&lt;/strong&gt; обращаемся к текущей Таблице, к выбранному листу, забираем диапазон заполненных ячеек и разбираемся, что нам возвращается.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;Обращаемся к Таблице, Листу, забираем данные&lt;/h2&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/7b/19/7b19a53e-25f1-4854-8fe2-78ae054872d0.png&quot; width=&quot;544&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Базовая и простая функция - берём все значения выбранного листа.&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;function getData() {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//определяем активную таблицу&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  const ss = SpreadsheetApp.getActive();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//определяем в ней Лист1&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  const sheet = ss.getSheetByName(&amp;#x27;Лист1&amp;#x27;);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//определяем на Лист1 диапазон с данными и забираем его значения&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  const data = sheet.getDataRange().getValues();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;//возвращаем эти значения&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  Logger.log(data);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  return data;&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;Мы используем метод &lt;code&gt;getDataRange()&lt;/code&gt;, он сформирует диапазон от ячейки А1 по последнюю строку / столбец с данными, пустые строки и столбцы дальше, если они будут - в диапазон не попадают.&lt;/p&gt;
  &lt;p&gt;Запускаем функцию в редакторе скриптов – функция выводит в лог заполненные ячейки.&lt;/p&gt;
  &lt;p&gt;Помимо этого функция возвращает массив заполненных ячеек (&lt;code&gt;return data)&lt;/code&gt; и его можно использовать в другой функции, что нам пригодится дальше.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/c5/2a/c52a3126-aaeb-4b14-ab10-da191a95fde2.png&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Что нам вообще возвращается&lt;/h2&gt;
  &lt;p&gt;Функция возвращает несколько массивов (array) в массиве.&lt;/p&gt;
  &lt;p&gt;Каждый внутренний массив - это строка с данными из &amp;quot;Лист1&amp;quot; нашей Таблицы, &lt;/p&gt;
  &lt;p&gt;например &lt;code&gt;[Дата, Название, Коммент, , Словарь, ]&lt;/code&gt; - первая строка.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/94/94/9494c89b-cf4e-4d4e-bf86-57992fd0f52c.png&quot; width=&quot;650&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Строк с данными несколько, они отделены от друг-друга запятыми и объединены внешним массивом.&lt;/p&gt;
  &lt;p&gt;Если бы у вас было только две строки с данными по две ячейки в каждой, то эта конструкция выглядела бы так:&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;[&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;[1 строка 1 столбец , 1 строка 2 столбец] ,&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;[2 строка 1 столбец , 2 строка 2 столбец]&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;]&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Три строки, в первых двух заполнены столбцы A и B, в третьей - только C&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;[&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;[1 строка 1 столбец , 1 строка 2 столбец] ,&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;[2 строка 1 столбец , 2 строка 2 столбец],&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;[                   ,                    , 3 строка 3 столбец]&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;]&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;А ЕЩЕ&lt;/strong&gt; наша функция сможет работать как пользовательская функция, её можно вызвать просто на листе, не запуская скрипт (смотрите скриншот)&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/74/8b/748b1c5a-2955-45d8-b4a7-9ce49510ff9b.png&quot; width=&quot;1079&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Итак, у нас есть прекрасный массив с данными, как обращаться к нему, как посчитать количество строк с данными, как найти последнюю строку вообще, последнюю строку и выбранном столбце, последний столбец – мы разберёмся в следующей главе.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0a/fc/0afc51d2-a41b-4f69-9855-0b576efed195.png&quot; width=&quot;1260&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://pastebin.com/teJvbxqV&quot; target=&quot;_blank&quot;&gt;Скрипт в pastebin&lt;/a&gt; (будет пополняться)&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1L_-NJntp0y2Z5hz4KxR-rRYghl7wwG8cma4oIZubowg/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;Таблица со скриптом&lt;/a&gt; (будет пополнятся)&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Документация:&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getSheetByName(String)&quot; target=&quot;_blank&quot;&gt;getSheetByName&lt;/a&gt;, &lt;a href=&quot;https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getdatarange&quot; target=&quot;_blank&quot;&gt;getDataRange&lt;/a&gt;, &lt;a href=&quot;https://developers.google.com/apps-script/reference/spreadsheet/range?hl=en#getvalues&quot; target=&quot;_blank&quot;&gt;getValues&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Мы:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;Канал “Google Таблицы” в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://goo.gl/HdS2qn&quot; target=&quot;_blank&quot;&gt;Оглавление канала — все статьи&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_spreadsheets_chat&quot; target=&quot;_blank&quot;&gt;Наш чат в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://money.yandex.ru/to/41001891748860&quot; target=&quot;_blank&quot;&gt;Донаты&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>google_sheets:simple_api_get</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/simple_api_get?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>Пишем простое обращение к API на Google Apps Script</title><published>2021-05-12T12:22:20.439Z</published><updated>2021-05-12T13:00:26.511Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/e7/30/e730a090-ac89-453f-945e-b2f0a3d3feb0.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/95/27/95270d98-7fb7-4247-ac97-d02cbd70f9f1.png&quot;&gt;Друзья, недавно для своего клиента М. я сделал обращение к API площадки, которая занимается криптовалютой.</summary><content type="html">
  &lt;p&gt;Друзья, недавно для своего клиента М. я сделал обращение к API площадки, которая занимается криптовалютой.&lt;/p&gt;
  &lt;p&gt;В этой статье попробуем достать из этого API список проектов (криптовалют), которые есть на площадке, разбираясь с каждым этапом отдельно.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;С чего начнём&lt;/h2&gt;
  &lt;p&gt;Наш главный документ – это документация API, в документации есть всё (обычно 😁): как получить ключ, возможные методы обращение к API c примерами.&lt;/p&gt;
  &lt;p&gt;Документация нашей площадки: &lt;a href=&quot;https://api-docs-v2.flipsidecrypto.com/#how-to-get-access&quot; target=&quot;_blank&quot;&gt;https://api-docs-v2.flipsidecrypto.com/#how-to-get-access&lt;/a&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/95/27/95270d98-7fb7-4247-ac97-d02cbd70f9f1.png&quot; width=&quot;934&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;1. Получаем api-ключ&lt;/h2&gt;
  &lt;p&gt;Тут всё просто – находим в документации &amp;quot;How to get access&amp;quot;, переходим по ссылке, регистрируемся и нажимаем &amp;quot;Create Access Key&amp;quot;.&lt;/p&gt;
  &lt;p&gt;Копируем ключ.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/6a/c3/6ac33a37-61da-43aa-a5f7-379bec778118.png&quot; width=&quot;1289&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;2. Берём ключ и делаем запрос в браузере&lt;/h2&gt;
  &lt;p&gt;Напомню, что мы получаем список криптовалют, которые есть на площадке.  Наш метод – Get Projects.&lt;/p&gt;
  &lt;p&gt;Ниже - скриншот из документации.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9e/de/9edea5f7-2ad7-4422-9c5c-3fc1c3357167.png&quot; width=&quot;531&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Из скриншота можно понять четыре вещи:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;1) тип запроса, который нам нужен: GET&lt;/p&gt;
  &lt;p&gt;2) ссылка на метод: &lt;a href=&quot;https://api.flipsidecrypto.com/api/v2/metrics/projects?api_key=&quot; target=&quot;_blank&quot;&gt;https://api.flipsidecrypto.com/api/v2/metrics/projects?api_key=&lt;/a&gt;{{api_key}}&lt;/p&gt;
  &lt;p&gt;3) параметр – только api_key и он подставляется в ссылку&lt;/p&gt;
  &lt;p&gt;4) при успешном вызове API вернёт нам объект, с массивом объектов (в каждом объекте - один проект) с ключами: project_id, name, slug, cmc_id, symbol&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Собираем ссылку руками и просто запускаем её в браузере (GET-запрос не требует передачи тела и открывается просто в браузере)&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b4/1d/b41dfc89-6b21-4fdd-88cb-9235b551b44a.png&quot; width=&quot;1886&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Супер, что-то выводится, значит метод и ключ – работают, теперь автоматизируем.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;3. Автоматизируем это&lt;/h2&gt;
  &lt;p&gt;Все запросы, GET, POST, ..., отправляются из Google Apps Script с помощью метода &lt;code&gt;UrlFetchApp.fetch&lt;/code&gt; (или fetchAll, если вы хотите отправлять запросы пачкой, как мы делали &lt;a href=&quot;https://t.me/google_sheets/686&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;)&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h3&gt;Итак, переходим к практике, код.  Вызываем метод, декодируем и превращаем в объект ответ:&lt;/h3&gt;
  &lt;p&gt;&lt;code&gt;function давай_уже_скрипт() {&lt;/code&gt; &lt;/p&gt;
  &lt;p&gt;//Простой GET отправляется с помощью UrlFetchApp.fetch(наша ссылка на метод + ключ) без дополнений.&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const response = UrlFetchApp.fetch(&amp;#x27;&lt;a href=&quot;https://api.flipsidecrypto.com/api/v2/metrics/projects?api_key=f850915e-72d8-49d0-967c-4c4b17a3a254&quot; target=&quot;_blank&quot;&gt;https://api.flipsidecrypto.com/api/v2/metrics/projects?api_key=f850915e-72d8-49d0-967c-4c4b17a3a254&lt;/a&gt;&amp;#x27;);&lt;/code&gt; &lt;/p&gt;
  &lt;p&gt;//Декодируем строку ответа&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const content = response.getContentText();&lt;/code&gt; &lt;/p&gt;
  &lt;p&gt;//Превращаем всё еще строку в объект, с которым можно работать и выводим в лог&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const result = JSON.parse(content); &lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Logger.log(result);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;В логе видим такое:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/aa/bd/aabd0048-6c9a-444e-983c-1e92b3a81a80.png&quot; width=&quot;777&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Это объект, если его привести к читабельному виду, то он будет выглядеть как на скриншоте ниже. Внутри него есть объект status (информация о вашем запросе) и объект data, внутри которого массив объектов проектов, которые есть на площадке, то, что мы и хотели получить.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/fa/c3/fac350b1-7dbb-4756-8789-dce1d98fc0bf.png&quot; width=&quot;604&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;&lt;strong&gt;Дописываем скрипт, парсим результат&lt;/strong&gt;&lt;/h3&gt;
  &lt;p&gt;//обращаемся к массиву data внутри ответа&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const data = result.data&lt;/code&gt; &lt;/p&gt;
  &lt;p&gt;//задаём пустой массив&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const arr = []; &lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;//обходим data в цикле, обращаясь к каждому внутреннему объекту и вставляем его данные в новый массив&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;for (n in data) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const coin = data[n];&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;arr.push(Object.values(coin));&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Logger.log(arr)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;Всё, теперь вместо сложного объекта с объектами внутри мы получаем привычную структуру (ряд строк, массив массивов, лист листов, Игорь – привет), которую можно вставить в нашу Таблицу.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0a/45/0a45c43e-582c-4faa-90c9-a3b154e96284.png&quot; width=&quot;777&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Добавляем еще пару строк кода и вставляем данные в Таблицу:&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const sh = SpreadsheetApp.getActive().getSheetByName(&amp;#x27;PROJECTS&amp;#x27;);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;sh.getRange(2, 1, arr.length, arr[0].length).setValues(arr);&lt;/code&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ec/ee/ecee7489-2bf0-417e-8774-61d22076d8c8.png&quot; width=&quot;698&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Итак, мы разобрались как получить ключ, как написать простой GET-запрос, как декодировать его результат, как обратиться к нужному элементу ответа и привести его к формату, который можно вставить. &lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Код целиком&lt;/strong&gt;: &lt;a href=&quot;https://pastebin.com/eWs6r0vE&quot; target=&quot;_blank&quot;&gt;https://pastebin.com/eWs6r0vE&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Документация:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String)&quot; target=&quot;_blank&quot;&gt;Fetch&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developers.google.com/apps-script/reference/url-fetch/http-response#getContentText()&quot; target=&quot;_blank&quot;&gt;getContentText&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse&quot; target=&quot;_blank&quot;&gt;JSON.parse&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/values&quot; target=&quot;_blank&quot;&gt;Object.values&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/for...in&quot; target=&quot;_blank&quot;&gt;Object, for..in&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getsheetbynamename&quot; target=&quot;_blank&quot;&gt;getSheetByName&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developers.google.com/apps-script/reference/spreadsheet/range#setvaluesvalues&quot; target=&quot;_blank&quot;&gt;setValues&lt;/a&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Мы:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;Канал “Google Таблицы” в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://goo.gl/HdS2qn&quot; target=&quot;_blank&quot;&gt;Оглавление канала — все статьи&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_spreadsheets_chat&quot; target=&quot;_blank&quot;&gt;Наш чат в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://money.yandex.ru/to/41001891748860&quot; target=&quot;_blank&quot;&gt;Донаты&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>google_sheets:searchNadd</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/searchNadd?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>Как мы добавляли лист &quot;про нас&quot; в сто Таблиц</title><published>2021-05-05T06:43:09.022Z</published><updated>2021-05-05T07:43:08.850Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/17/0b/170be890-2c8a-4052-981f-af10ba460486.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/92/af/92af860b-f399-4404-bf2d-e9af1d31a598.png&quot;&gt;Привет, сегодня рассмотрим конкретную рабочую задачу – мы нарисовали лист &quot;⚡️ ПРО НАС&quot;, с нашими ссылками и решили добавить этот лист во все Таблицы с примерами, которые были опубликованы на канале за почти пять лет.</summary><content type="html">
  &lt;p&gt;Привет, сегодня рассмотрим конкретную рабочую задачу – мы нарисовали лист &amp;quot;⚡️ ПРО НАС&amp;quot;, с нашими ссылками и решили добавить этот лист во все Таблицы с примерами, которые были опубликованы на канале за почти пять лет.&lt;/p&gt;
  &lt;p&gt;(мы решили, что это улучшит конверсию в оглавление / чат / &lt;a href=&quot;http://clck.ru/UUqWy&quot; target=&quot;_blank&quot;&gt;и ботов заказывайте!&lt;/a&gt;) &lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/92/af/92af860b-f399-4404-bf2d-e9af1d31a598.png&quot; width=&quot;424&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;В задаче два этапа – сначала мы создаём список Таблиц, в которые будем добавлять наш лист, а потом проходимся по этому списку и этот лист добавляем.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h3&gt;Создаём список Таблиц&lt;/h3&gt;
  &lt;p&gt;Сейчас в оглавлении нашего канала 368 постов. Таблица с примером приложена не к каждому, но все равно Таблиц много, где-то сто. Найдём все нужные Таблицы.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;1. Сперва создаём запрос для DriveApp:&lt;/strong&gt; нам нужны файлы, в которых я владелец, с mimeType Таблицы и эти файлы должны быть открыты для всех по ссылке:&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;function q() {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  var userEmail = Session.getActiveUser().getEmail()&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  return &amp;#x60;&amp;#x27;${userEmail}&amp;#x27; in owners and mimeType = &amp;#x27;application/vnd.google-apps.spreadsheet&amp;#x27; and (visibility = &amp;#x27;anyoneWithLink&amp;#x27; or visibility = &amp;#x27;anyoneCanFind&amp;#x27;)&amp;#x60;;&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;2. Используем этот запрос в функции, которая создаст реестр Таблиц&lt;/strong&gt; и вставит его на активный лист&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;function searchDOCs() {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  var array = []&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  var t = 0&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  var max = 5000&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  var query = q();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  var files = DriveApp.searchFiles(q())&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  while (files.hasNext() &amp;amp;&amp;amp; t &amp;lt; max) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;    t++&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;    var file = files.next();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;    try {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;      array = array.concat([[file.getName(), file.getUrl(),            file.getSharingAccess(), file.getDateCreated(),  file.getOwner().getEmail()]]);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;         } catch (err) { }&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;   var r = ss.getRange(4, 1, array.length, array[0].length)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;   r.clearContent()&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;   r.setValues(array)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;3. Вставляем скрипт в Таблицу, запускаем&lt;/strong&gt;, скрипт создаёт массив с названием файлов / ссылками на них/ типом доступа / датой создания и владельцем&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e0/31/e031e677-e8c0-47ee-aa6a-88f4bb7d0d9c.png&quot; width=&quot;1372&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;4. Дополнительно фильтруем по имени.&lt;/strong&gt; Обычно в названии Таблиц с нашими примерами есть @google_sheets, поэтому дополнительно фильтруем формулой массив, чтобы оставить в нём файлы с google в названии:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/23/3f/233f2bb7-2b0f-4980-9b78-554fa245f8ce.png&quot; width=&quot;1438&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;&lt;strong&gt;Добавляем в каждую Таблицу лист &amp;quot;⚡️ ПРО НАС&amp;quot;.&lt;/strong&gt; &lt;/h3&gt;
  &lt;p&gt;Еще помните, что мы тут делаем? :) Список Таблиц мы подготовили, теперь вставляем в Таблицу со скриптом лист, который будет копировать и пишем функцию копирования.&lt;/p&gt;
  &lt;p&gt;Функция ниже идёт диапазону с ссылками (у меня он i:i) открывает каждую Таблицу, проверяет, если ли в ней лист с названием &amp;#x27;⚡️ ПРО НАС&amp;#x27;, если нет, то копирует этот лист из Таблицы со скрипом и переименовывает (так как при копировании к названию листа добавится (копия). &lt;/p&gt;
  &lt;p&gt;&lt;code&gt;const shName = &amp;#x27;⚡️ ПРО НАС&amp;#x27;;&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;function myFunction() {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  const ss = SpreadsheetApp.getActive();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  const sh = ss.getActiveSheet()&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  const template = ss.getSheetByName(shName);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  const range = sh.getRange(&amp;quot;i1:i100&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  const colours = range.getBackgrounds();&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  range.getValues()&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;  .forEach((url, i) =&amp;gt; {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;    url = url[0];&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;    if (url &amp;amp;&amp;amp; colours[i][0] != &amp;#x27;red&amp;#x27;) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;      const shTo = SpreadsheetApp.openByUrl(url);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;      const shToCheck = shTo.getSheetByName(shName);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;      if (!shToCheck) {&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;         template.copyTo(shTo).setName(shName);&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;         Logger.log(&amp;#x27;OK &amp;#x27; + shTo.getName())&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;         sh.getRange(&amp;quot;i&amp;quot; + (i + 1)).setBackground(&amp;#x27;red&amp;#x27;)&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;     }&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;   }&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;})&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Код целиком:&lt;/strong&gt; &lt;a href=&quot;https://pastebin.com/Cp5wB3J0&quot; target=&quot;_blank&quot;&gt;https://pastebin.com/Cp5wB3J0&lt;/a&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;strong&gt;МЫ:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;Канал “Google Таблицы” в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://goo.gl/HdS2qn&quot; target=&quot;_blank&quot;&gt;Оглавление канала — все статьи&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_spreadsheets_chat&quot; target=&quot;_blank&quot;&gt;Наш чат в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://money.yandex.ru/to/41001891748860&quot; target=&quot;_blank&quot;&gt;Донаты&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>google_sheets:sobirator</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/sobirator?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>Собиратор 4.0</title><published>2021-03-06T09:09:54.685Z</published><updated>2021-03-11T09:45:51.248Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/44/72/4472d733-b925-4b11-a1d4-48f9ce514308.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/28/78/2878dfe4-866a-4b85-bddb-ebbd3a5804f8.png&quot;&gt;Решение для регулярного копирования ваших Таблиц от https://t.me/google_sheets</summary><content type="html">
  &lt;p&gt;Решение для регулярного копирования ваших Таблиц от &lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;https://t.me/google_sheets&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1ztA4aV951Yx8KV0T4e69WNLKyyyEYCrjg8xUkJAGtcA/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;Таблица со скриптом&lt;/a&gt; &lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/28/78/2878dfe4-866a-4b85-bddb-ebbd3a5804f8.png&quot; width=&quot;299&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p&gt;Друзья! В прошлом году мы выпустили свой СОБИРАТОР – интерфейс для сбора других Таблиц через sheets api (самый быстрый скриптовый способ).&lt;/p&gt;
  &lt;p&gt;Задаёте правила сбора Таблиц в другие Таблицы и собираете, к примеру, 50 Таблиц ваших продавцов в одну сводную Таблицу и 30 Таблиц в другую сводную Таблицу, на лету фильтруя и оставляя только нужные столбцы.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Сегодня выпускаем обновление:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;— теперь можно указать частоту загрузки каждой таблицы в минутах;&lt;/p&gt;
  &lt;p&gt;— появился тип копирования данных (formula / formatted_value / unformatted_value);&lt;/p&gt;
  &lt;p&gt;— решена проблема с добавлением новых данных, в предыдущей версии они (иногда) вставлялись со сдвигом&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Главное:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Решение стало полностью автономным и автоматическим – теперь один раз заполняете конфиг сбора, выставляете частоту обновления в минутах, устанавливаете главный скрипт на триггер и вуаля – данные собираются автоматически, регулярно и уже без вашего участия.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;&lt;strong&gt;Инструкция, заставляем Собиратор работать:&lt;/strong&gt;&lt;/h2&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/d3/48/d348874d-ae4b-444a-9a02-ac52966d2bcf.png&quot; width=&quot;532&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;1) копируете &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1ztA4aV951Yx8KV0T4e69WNLKyyyEYCrjg8xUkJAGtcA/edit#gid=300809483&quot; target=&quot;_blank&quot;&gt;Таблицу со скриптом&lt;/a&gt; к себе (файл – создать копию);&lt;/p&gt;
  &lt;p&gt;2) заполняете конфиг копирования (одна строка – одно правило копирования одного листа Таблицы в другую Таблицу);&lt;/p&gt;
  &lt;p&gt;3) проверяете, как всё работает, запустив скрипт из меню;&lt;/p&gt;
  &lt;p&gt;4) если всё работает правильно – ставите скрипт в расписание и каждые 30 минут скрипт будет запускаться, проверять, есть ли строки в конфиге, которые нужно обработать (скрипт посмотрит на частоту обновления в минутах и на дату / время последнего запуска)&lt;/p&gt;
  &lt;p&gt;4) получаете регулярно обновляемые Таблицы, радуетесь и &lt;a href=&quot;https://t.me/google_spreadsheets_chat/168481&quot; target=&quot;_blank&quot;&gt;поддерживаете наше сообщество донатами&lt;/a&gt; :)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;Как заполнить конфиг?&lt;/h2&gt;
  &lt;p&gt;Одна строка – одно правило копирования. Разберём все поля.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/5a/09/5a096e53-9509-4c92-b90c-908541acc2a8.png&quot; width=&quot;2808&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;Блок &amp;quot;ОТКУДА&amp;quot;&lt;/h2&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/67/6c/676c3709-22c4-4507-bfb8-85975d5f7f75.png&quot; width=&quot;1076&quot; /&gt;
    &lt;figcaption&gt;(отвечая на вопрос откуда Блок – из Питера)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt; – URL Таблицы, из которой берём данные;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;ЛИСТ&lt;/strong&gt; – Название листа в Таблице, из которого берём данные;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;СТОЛБЦЫ&lt;/strong&gt; – Номера колонок, которые наш скрипт будет забирать на этом листе;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;ОТСТУП&lt;/strong&gt; – Количество строк с данными сверху листа, которые скрипт пропустит и не заберет;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;FILTER&lt;/strong&gt; – условия фильтрации данных, которые мы заберем из источника:&lt;/p&gt;
  &lt;p&gt;Примеры:&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;row[4]&lt;/code&gt; – в пятом столбце есть данные;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;row[3] || row[0] == 1&lt;/code&gt; непустой четвёртый столбец в  данных или первый столбец, значения в котором будут равны 1;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;row[0] == &amp;#x27;Москва&amp;#x27; || row[0] ==&amp;#x27;Спб&amp;#x27;&lt;/code&gt; – Москва или Спб в первом столбце;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;row[2] &amp;gt; 10 &amp;amp;&amp;amp; row[4] != &amp;#x27;Вася&amp;#x27;&lt;/code&gt; – третий столбец больше 10 и в пятом столбце не имя Вася;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;&lt;strong&gt;Блок &amp;quot;КУДА И КАК&amp;quot;&lt;/strong&gt;&lt;/h2&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f1/1c/f11c968a-d68c-4e3a-9eb6-a0bfacc8f78b.png&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt; - URL Таблицы, в которую мы будем вставлять данные;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;ЛИСТ&lt;/strong&gt; – Название листа в Таблице, в который вставляем данные;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Ячейка старта&lt;/strong&gt; – С этой ячейки будут вставляться данные;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Способ вставки&lt;/strong&gt; – удалить / дополнять:&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Удалять&lt;/code&gt; – скрипт удаляет данные от ячейки вставки и вставляет отфильтрованные данные начиная с ячейки вставки;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Дополнять&lt;/code&gt; – скрипт вставляет от ячейки вставки требуемое количество новых пустых строк и далее вставляет в них данные, никакие строки на листе вставки не удаляются;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Пример: допустим, на один лист нужно вставить данные нескольких Таблиц:  для первой Таблицы в конфиге выбираем &amp;quot;удаление&amp;quot; (этот метод очистит лист и вставит данные первой Таблицы), для последующих Таблиц выбираем &amp;quot;дополнять&amp;quot;;&lt;/code&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ed/1e/ed1ed12e-ace5-4764-86a0-05490ad89fa9.png&quot; width=&quot;630&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;МАРКЕР&lt;/strong&gt; – строка, которая будет добавлена ко вставленным данным (новым первым столбцом) если не заполнен – пустого столбца не будет;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Тип копирования&lt;/strong&gt; (по умолч. unformatted value)&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;formula&lt;/code&gt; – формулы будут перенесены как формулы; &lt;/p&gt;
  &lt;p&gt;&lt;code&gt;unformatted_value&lt;/code&gt; – данные без числового форматирования источника;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;formatted_value&lt;/code&gt; – данные с числовым форматированием источника;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://developers.google.com/sheets/api/reference/rest/v4/ValueRenderOption&quot; target=&quot;_blank&quot;&gt;Подробнее&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Подвал&lt;/strong&gt; - количество строк внизу листа для вставки, которое скрипт не будет удалять (актуально только для режима копирования &amp;quot;удалять&amp;quot;, режим копирования &amp;quot;добавлять&amp;quot; вообще ничего не удаляет)  ;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;&lt;strong&gt;Блок &amp;quot;Частота и информация&amp;quot;&lt;/strong&gt;&lt;/h2&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/c4/c7/c4c7852e-b74a-44b1-ba41-3a6f323a9f57.png&quot; width=&quot;742&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;ЗАГРУЖЕНО&lt;/strong&gt; – сколько строк / столбцов было загружено в последний запуск скрипта по строке, если увидите ❌ – что-по пошло не так, проверьте, как вы заполнили строку конфига;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Дата и время последней загрузки;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;ЧАСТОТА обновления&lt;/strong&gt; – частота обновления, в минутах&lt;/p&gt;
  &lt;p&gt;Внимание – если последний запуск по строке был 8 марта в 12-05 и частота обновления – 30 минут, то необязательно скрипт обновит эту строку именно в 12-35, скрипт её обновит, когда запустится в следующий раз по расписанию, которое вы установили и если время при этом будет &amp;gt;=12-35. &lt;/p&gt;
  &lt;p&gt;Через меню вы устанавливаете скрипт в расписание на каждые 30 минут. Он будет запускаться и проверять, есть ли строки для обновления, если их не будет – скрипт сразу же завершится;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;strong&gt;МЫ:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;Канал “Google Таблицы” в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://goo.gl/HdS2qn&quot; target=&quot;_blank&quot;&gt;Оглавление канала — все статьи&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_spreadsheets_chat&quot; target=&quot;_blank&quot;&gt;Наш чат в Телеграме&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://money.yandex.ru/to/41001891748860&quot; target=&quot;_blank&quot;&gt;Донаты&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>google_sheets:evotor</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/evotor?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>ЭВОТОР + Google Таблица</title><published>2020-11-20T13:40:26.299Z</published><updated>2021-01-24T17:49:05.929Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/42/54/42542166-44b3-425d-a327-dd5a714455fd.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/2a/28/2a286939-5959-4a9b-a035-b30c43edc225.png&quot;&gt;Краткая инструкция по установке</summary><content type="html">
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2a/28/2a286939-5959-4a9b-a035-b30c43edc225.png&quot; width=&quot;2476&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Краткая инструкция по установке&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Чат поддержки в Телеграм&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/sheets_evotor&quot; target=&quot;_blank&quot;&gt;https://t.me/sheets_evotor&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Поехали&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;=&lt;/p&gt;
  &lt;p&gt;1) устанавливаете наше приложение из магазина Google Таблица (&lt;u&gt;&lt;a href=&quot;https://workspace.google.com/marketplace/app/%25D0%25BE%25D0%25BD%25D0%25BB%25D0%25B0%25D0%25B9%25D0%25BD_%25D0%25BA%25D0%25B0%25D1%2581%25D1%2581%25D1%258B/978990150260&quot; target=&quot;_blank&quot;&gt;ссылка&lt;/a&gt;&lt;/u&gt;)&lt;/p&gt;
  &lt;p&gt;2) копируете токен от облака Эвотор и задаёте его через меню приложения в Таблице &amp;quot;задать ключ&amp;quot;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ab/bb/abbbbdec-2ecd-48cf-b09f-328dff1b83a3.png&quot; width=&quot;1326&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;3) вставляете в Таблицу все нужные для работы листы, запустив пункт меню &amp;quot;создать первоначальную структуру&amp;quot;&lt;/p&gt;
  &lt;p&gt;4) всё, приложением можно пользоваться: получайте чеки за день / за месяц через пункт в меню, чтобы получать чеки автоматически раз в час - активируйте автоматическое получение из меню&lt;/p&gt;
  &lt;p&gt;5) еще можно настроить автоматическую отправку данных (любых ячеек любых таблиц, к которым у вас есть доступ) в Телеграм, проверить отправку можно через пункт в меню &amp;quot;Телеграм, обработать все строки&amp;quot;, автоматическая отправка заработает после установки триггера &amp;quot;ставим триггер: автоматическое получение чеков&amp;quot;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;== &lt;/p&gt;

</content></entry><entry><id>google_sheets:sender</id><link rel="alternate" type="text/html" href="https://teletype.in/@google_sheets/sender?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=google_sheets"></link><title>отправлятор таблиц в телеграм чаты https://t.me/google_sheets</title><published>2020-11-11T07:05:31.502Z</published><updated>2020-11-12T13:51:19.485Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/d6/82/d682b081-c2b9-409e-a3f1-066309823f0b.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/e3/ac/e3acb15b-c4bf-4b83-af3f-4df0e951201a.png&quot;&gt;бесплатно и по расписанию</summary><content type="html">
  &lt;p&gt;&lt;strong&gt;бесплатно и по расписанию&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;Ссылки:&lt;/h2&gt;
  &lt;p&gt;Таблица с решением: (&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1tw4h2P8BeN91MKSp8Ozbe2WOyXVgJLqhvundvyeXtBM/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;)&lt;/p&gt;
  &lt;p&gt;Наш канал: &lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;https://t.me/google_sheets&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Оглавление: (&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1u0aRlwb0rQHbjE9avbgCqIJSQ3EvPfTxT-h54jTQh8I/edit#gid=0&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;)&lt;/p&gt;
  &lt;p&gt;Наш чат: &lt;a href=&quot;https://t.me/google_spreadsheets_chat&quot; target=&quot;_blank&quot;&gt;https://t.me/google_spreadsheets_chat&lt;/a&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;Что может отправлятор?&lt;/h2&gt;
  &lt;p&gt;0) есть конфиг, там вы задаете таблицы и диапазоны, кому их отправлять и как часто&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e3/ac/e3acb15b-c4bf-4b83-af3f-4df0e951201a.png&quot; width=&quot;1796&quot; /&gt;
    &lt;figcaption&gt;конфиг = лист //&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;1) брать заданные в конфиге диапазоны&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/cb/6b/cb6bf8a3-302a-4cab-a6af-985754641edd.png&quot; width=&quot;1400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;2) и отправлять их в телеграм чаты исходя из расписания в конфиге&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/8e/04/8e042246-0db7-4dd9-9715-c42a225405ca.png&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;Как настроить отправку в Telegram&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Создаём своего бота и получаем его токен:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Поехали:&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;заходим в телеграм, ищем пользователя @BotFather&lt;/li&gt;
    &lt;li&gt;создаем нового бота командой /newbot&lt;/li&gt;
    &lt;li&gt;выбираем имя и username, username должен заканчиваться на _bot&lt;/li&gt;
    &lt;li&gt;видим токен бота, копируем и вставляем в код (первая строка кода)&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9a/f8/9af81be5-d6a3-4736-9e35-7d0c2a5347dd.png&quot; width=&quot;1242&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1b/e5/1be5146b-4fec-4c99-9b68-b7aedc3b0c1a.png&quot; width=&quot;1116&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Как узнать chat_id&lt;/h2&gt;
  &lt;p&gt;Бот не отправляет сообщения по нику, а отправляет их по chat_id - это цифровой аналог ника для API. Chat_id есть и для юзеров и для чатов.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Как узнать?&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;1) добавляем бота @myidbot в чат, chat_id которого нужно узнать и отправляем команду &lt;code&gt;/getgroupid@myidbot&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;2) либо отправляем боту @myidbot в личное сообщения команду &lt;code&gt;/getid@myidbot&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;3) получаем chat_id и вставляем его в наш код, можно вставить несколько через запятую&lt;/p&gt;
  &lt;p&gt;4) чтобы бот мог отправлять сообщения вам - его нужно найти и нажать в первый &lt;code&gt;/start&lt;/code&gt;, так он получит права после этого отправлять вам сообщения&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/42/10/421067d9-fc6e-4917-9462-6739967a79c4.png&quot; width=&quot;1078&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;Создаём триггер, чтобы скрипт запускался регулярно&lt;/h2&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;1) Инструменты &amp;gt; Редактор скриптов&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/87/57/87570543-86f5-4039-8598-98de07083cbd.png&quot; width=&quot;1450&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;2) Кликаем на таймер&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0a/ce/0acecbba-68dc-4730-b05a-76ccb2e9b331.png&quot; width=&quot;388&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;3) Cоздать триггер &lt;/p&gt;
  &lt;p&gt;- название функции – main&lt;/p&gt;
  &lt;p&gt;- триггер по времени, по минутам, раз в 30 минут (или любой другой нужный вам интервал)&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/82/e2/82e281fe-d7f5-49d5-ba64-c15d806593a4.png&quot; width=&quot;2116&quot; /&gt;
    &lt;figcaption&gt;триггер будет запускать функцию регулярно, не переживайте про квоту, если функции будет нечего обрабатывать и отправлять, то она  сразу отключится&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;h2&gt;Пользуйтесь :)&lt;/h2&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/google_sheets&quot; target=&quot;_blank&quot;&gt;https://t.me/google_sheets&lt;/a&gt;&lt;/p&gt;

</content></entry></feed>