<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Eugeny N</title><generator>teletype.in</generator><description><![CDATA[Eugeny N]]></description><image><url>https://teletype.in/files/2c/cf/2ccfaa49-3162-4039-8d8b-2c4546203f15.png</url><title>Eugeny N</title><link>https://teletype.in/@google_sheets</link></image><link>https://teletype.in/@google_sheets?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=google_sheets</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/google_sheets?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/google_sheets?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 04 Apr 2026 04:43:11 GMT</pubDate><lastBuildDate>Sat, 04 Apr 2026 04:43:11 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@google_sheets/rashodusi</guid><link>https://teletype.in/@google_sheets/rashodusi?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=google_sheets</link><comments>https://teletype.in/@google_sheets/rashodusi?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=google_sheets#comments</comments><dc:creator>google_sheets</dc:creator><title>Создаём телеграм бота для подсчета расходов</title><pubDate>Wed, 05 Jul 2023 14:28:54 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/4e/c1/4ec1e4f4-e3cd-4bd3-9070-b5a875d2ab12.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/27/94/2794627f-4478-4f28-ba18-2c3e75ff9493.jpeg"></img>Друзья, сегодня статья-урок. Попробуем считать наши расходы лучше, экономить больше. Ну либо просто научимся соединять Телеграм бота и Google Таблицу :)]]></description><content:encoded><![CDATA[
  <figure id="nunf" class="m_retina">
    <img src="https://img3.teletype.in/files/27/94/2794627f-4478-4f28-ba18-2c3e75ff9493.jpeg" width="640" />
  </figure>
  <p id="hJ0l">Друзья, сегодня статья-урок. Попробуем считать наши расходы лучше, экономить больше. Ну либо просто научимся соединять Телеграм бота и Google Таблицу :)</p>
  <p id="vZPa"></p>
  <p id="GDXT">Концепция такая — мы создаём приватный Телеграм канал, чтобы отправлять в него расходы. Помимо вас, расходы смогут отправлять любые люди, которых вы добавите к каналу.</p>
  <figure id="50v2" class="m_original">
    <img src="https://img1.teletype.in/files/02/71/0271259e-cb11-4103-bcbc-8712f38d2b13.png" width="644" />
  </figure>
  <p id="2wSQ">А причём тут Таблицы, спросите вы? А мы добавим в этот канал Телеграм бота и пусть все расходы отправляет в Таблицу, добавляя к ним дату и время. </p>
  <p id="lIYb">Сообщение в канал будем отправлять одним сообщением <strong>[сумма] / [на что пошли кровные]</strong>, а наш бот в канале будет ловить это сообщение и делить его по <strong>/</strong> и число помещать в одну колонку, а предмет расхода в другую.</p>
  <figure id="SYJz" class="m_retina">
    <img src="https://img4.teletype.in/files/3c/c2/3cc2a317-9e6e-467a-afd4-ae8bd3fa5d64.png" width="576" />
    <figcaption>масло дешёвое нашел, маргарин, наверное, а вот хлеб дорогой, видимо с семечками :)</figcaption>
  </figure>
  <p id="YmQv"></p>
  <p id="r668"><strong>Поехали делать.</strong></p>
  <p id="TjHy">1) Создавайте Телеграм бота в <a href="http://t.me/botfather" target="_blank">t.me/botfather</a> и получайте его токен</p>
  <p id="MfV1">2) Создавайте канал в Телеграм и добавляйте бота в него как администратора</p>
  <figure id="mdIJ" class="m_retina">
    <img src="https://img4.teletype.in/files/71/06/7106d461-75f3-455e-9942-f046fbf888ed.png" width="178" />
    <figcaption>если сделаете канал &quot;приватным&quot; то его никто не сможет найти через поиск в Телеграм</figcaption>
  </figure>
  <p id="5Stx">3)Копируйте нашу <a href="https://docs.google.com/spreadsheets/d/1XOyu5XL95j0W7jYOhJ0KGutgb59WzC1KR4GXqtsdSq8/edit#gid=0" target="_blank">Таблицу с кодом</a> и открывайте в копии редактор скриптов.</p>
  <p id="oKvB">4) Вставьте в переменную <strong>botToken</strong> токен вашего Телеграм бота, который вы получили от <a href="http://t.me/botfather" target="_blank">@botfather</a></p>
  <p id="BPyx"></p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="weux">Собственно весь наш код с комментариями (их лучше читать в вашей Таблице)</p>
    <pre id="fW6v">/*
1) вставляем токен бота
2) публикуем код как веб-приложение (начать развертывание &gt; новое развертывание &gt; веб-приложение &gt; от моего имени (ваш аккаунт) &gt; доступ для всех пользователей)
3) получаем ссылку приложения, вставляем её в webAppUrl
4) запускаем скрипт setWebhook()
5) при любом изменении кода публикуем веб-приложение под новой версией, setWebhook() повторно запускать не надо 
*/

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

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

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

/*
LOG принимает объект от doPost, парсит, достаёт сообщение и автора далее делит сообщение на две части по &#x27;/&#x27;, собирает это всё, добавляет дату и вставляет на лист &quot;расходы&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(&#x27;/&#x27;)[0], message.split(&#x27;/&#x27;)?.[1]]];

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

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

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@google_sheets/wb_headers</guid><link>https://teletype.in/@google_sheets/wb_headers?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=google_sheets</link><comments>https://teletype.in/@google_sheets/wb_headers?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=google_sheets#comments</comments><dc:creator>google_sheets</dc:creator><title>ДЛЯ ПРОДАВЦОВ НА WILDBERRIES</title><pubDate>Mon, 27 Jun 2022 07:50:42 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f7/c9/f7c95dd4-c7f9-4da2-b3a0-43c66a3360c7.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/1a/37/1a37026e-b2f4-416c-91dc-6369a361119d.png"></img>Остатки / размеры]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="BobN">Как выглядят данные, которые загружаются</h2>
  </section>
  <p id="10Q8"><strong>Остатки / размеры</strong></p>
  <p id="YKqN">Остаток на одном складе = одна строка</p>
  <figure id="PznI" class="m_original">
    <img src="https://img2.teletype.in/files/1a/37/1a37026e-b2f4-416c-91dc-6369a361119d.png" width="2994" />
  </figure>
  <p id="s8xt"></p>
  <p id="dgyq"><strong>Все товары продавца</strong></p>
  <figure id="Mq78" class="m_original">
    <img src="https://img3.teletype.in/files/21/be/21be0773-b712-4b96-98f9-a1e7990c4393.png" width="2868" />
  </figure>
  <p id="jHwL"></p>
  <p id="rEC4"><strong>Остатки (API)</strong></p>
  <figure id="SHUH" class="m_original">
    <img src="https://img1.teletype.in/files/44/d1/44d18738-3a7e-4463-a144-cd2ee99b7c47.png" width="3026" />
  </figure>
  <p id="zHO4"><strong>Заказы (API)</strong></p>
  <figure id="O8ea" class="m_original">
    <img src="https://img1.teletype.in/files/0b/e2/0be23c24-f3f6-4f8c-a527-4343b4b33255.png" width="3172" />
  </figure>
  <p id="cHTV"><strong>Продажи (API)</strong></p>
  <figure id="Abs3" class="m_original">
    <img src="https://img4.teletype.in/files/7d/37/7d379dd8-119b-4d33-ab1c-1ae20ce03ca6.png" width="2702" />
  </figure>
  <p id="0mOz"><strong>Отчет по реализации (API)</strong></p>
  <figure id="Co0e" class="m_original">
    <img src="https://img4.teletype.in/files/7d/ae/7daebad6-0e72-41a6-9d48-e5b51b813674.png" width="2838" />
  </figure>

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

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

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

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

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

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@google_sheets/evotor</guid><link>https://teletype.in/@google_sheets/evotor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=google_sheets</link><comments>https://teletype.in/@google_sheets/evotor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=google_sheets#comments</comments><dc:creator>google_sheets</dc:creator><title>ЭВОТОР + Google Таблица</title><pubDate>Fri, 20 Nov 2020 13:40:26 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/42/54/42542166-44b3-425d-a327-dd5a714455fd.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/2a/28/2a286939-5959-4a9b-a035-b30c43edc225.png"></img>Краткая инструкция по установке]]></description><content:encoded><![CDATA[
  <figure class="m_column">
    <img src="https://teletype.in/files/2a/28/2a286939-5959-4a9b-a035-b30c43edc225.png" width="2476" />
  </figure>
  <p><strong>Краткая инструкция по установке</strong></p>
  <p></p>
  <p><strong>Чат поддержки в Телеграм</strong></p>
  <p><a href="https://t.me/sheets_evotor" target="_blank">https://t.me/sheets_evotor</a></p>
  <p></p>
  <p><strong>Поехали</strong></p>
  <p>=</p>
  <p>1) устанавливаете наше приложение из магазина Google Таблица (<u><a href="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" target="_blank">ссылка</a></u>)</p>
  <p>2) копируете токен от облака Эвотор и задаёте его через меню приложения в Таблице &quot;задать ключ&quot;</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/ab/bb/abbbbdec-2ecd-48cf-b09f-328dff1b83a3.png" width="1326" />
  </figure>
  <p>3) вставляете в Таблицу все нужные для работы листы, запустив пункт меню &quot;создать первоначальную структуру&quot;</p>
  <p>4) всё, приложением можно пользоваться: получайте чеки за день / за месяц через пункт в меню, чтобы получать чеки автоматически раз в час - активируйте автоматическое получение из меню</p>
  <p>5) еще можно настроить автоматическую отправку данных (любых ячеек любых таблиц, к которым у вас есть доступ) в Телеграм, проверить отправку можно через пункт в меню &quot;Телеграм, обработать все строки&quot;, автоматическая отправка заработает после установки триггера &quot;ставим триггер: автоматическое получение чеков&quot;</p>
  <p></p>
  <p>== </p>

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

]]></content:encoded></item></channel></rss>