<?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>Maxim Arbuzov</title><generator>teletype.in</generator><description><![CDATA[stRAW Analytics]]></description><link>https://teletype.in/@maxarbuzov?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=maxarbuzov</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/maxarbuzov?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/maxarbuzov?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 23 Oct 2026 01:52:44 GMT</pubDate><lastBuildDate>Fri, 23 Oct 2026 01:52:44 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@maxarbuzov/upload_from_googlesheets_to_bigquery</guid><link>https://teletype.in/@maxarbuzov/upload_from_googlesheets_to_bigquery?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=maxarbuzov</link><comments>https://teletype.in/@maxarbuzov/upload_from_googlesheets_to_bigquery?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=maxarbuzov#comments</comments><dc:creator>maxarbuzov</dc:creator><title>Загрузка данных из Google Sheets в BigQuery</title><pubDate>Fri, 09 Jul 2021 11:54:25 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/30/f3/30f33fea-d79e-4bf7-8a32-215da22c029b.png"></media:content><category>GoogleSheets</category><description><![CDATA[<img src="https://img2.teletype.in/files/dd/1b/dd1b4fa9-faf6-4917-83e2-4bb220320d61.png"></img>Иногда, а зачастую всегда, если вы работаете с отчетами по требованию от менеджеров, возникает необходимость объединить данные из гугл таблицы и той базой что уже у вас есть в бигквери. Например, менеджер себе в гугл таблице набросал периоды какой-либо акции или распродажи и вам нужно вытащить данные за этот период. ]]></description><content:encoded><![CDATA[
  <p>Иногда, а зачастую всегда, если вы работаете с отчетами по требованию от менеджеров, возникает необходимость объединить данные из гугл таблицы и той базой что уже у вас есть в бигквери. Например, менеджер себе в гугл таблице набросал периоды какой-либо акции или распродажи и вам нужно вытащить данные за этот период. </p>
  <p>Сделать это можно несколькими способами, в зависимости от того надо ли вам чтобы ваши данные из таблицы периодически обновлялись или же это будет единоразовая выгрузка. </p>
  <p>Представим что у вас есть таблица, содержащая айдишку и какой-либо набор параметров. В примере мне, конечно же, было лень создавать большой файл, поэтому я ограничился одной строкой. В реальности у вас будет файл гораздо большего размера, но сути это не меняет</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure class="m_retina">
      <img src="https://img2.teletype.in/files/dd/1b/dd1b4fa9-faf6-4917-83e2-4bb220320d61.png" width="448" />
      <figcaption>Пример таблицы для импорта из Google Sheets в BigQuery</figcaption>
    </figure>
  </section>
  <h3>Загрузка данных через CSV</h3>
  <p>Здесь все понятно. Скачиваем наш лист с данными из гугл таблицы в формате CSV. <br />Открываем в нашей таблице меню Файл - Скачать - CSV файл. </p>
  <p>Этот вариант отлично подойдет если данные нужно загрузить единоразово.<br />Поскольку пример я составлял из под рабочей учетки - все конфиденциальные, не побоюсь этого слова, данные на картинках будут замазаны черным цветом. Другого цвета под рукой не оказалось.</p>
  <p>Идем в настройки своего датасета BQ</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure class="m_retina">
      <img src="https://img3.teletype.in/files/ab/43/ab432365-d1a3-4da6-addb-809af8dd1561.png" width="288.5" />
      <figcaption>Открываем настройки датасета в BigQuery</figcaption>
    </figure>
  </section>
  <p>создаем новую таблицу: create table - upload - csv.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure class="m_retina">
      <img src="https://img1.teletype.in/files/00/e7/00e76cdd-ed57-4a2f-b90c-4718da15449e.png" width="1078" />
      <figcaption>Создаем новую таблицу</figcaption>
    </figure>
  </section>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure class="m_retina">
      <img src="https://img3.teletype.in/files/23/a7/23a7bbc5-ce7d-4536-929b-dde0f6998ce6.png" width="696" />
      <figcaption>Загружаем CSV файл в BQ</figcaption>
    </figure>
  </section>
  <p>В целом, грузить данные через csv в целом можно, но есть ограничение на размер файла(100MB). Если файл больше то надо уже заморочаивтаьс яи грузить его через cloud storage.  <br />Но если вам понадобится эти данные периодически обновлять, то такой вариант уже не подойдет, поскольку каждый раз придется пересоздавать таблицу и грузить данные заново, а это в общем-то так себе развлечение. <br />Поэтому есть второй более удобный метод, о котором я сам, к своему стыду, узнал недавно, потому что никогда не скролил ниже варианта загрузки через цсв.</p>
  <h3>Подключаем google sheets к bigquery</h3>
  <p>Процесс такой же, как и в случае, с CSV файлом, только в списке вариантов загрузки выбираем drive и вставляем ссылку на нашу гугл таблицу.  Дополнительно можно указать диапазон который мы хотим импортировать, а также обязательно, как и в случае с csv, указываем что нам нужно пропустить первую строку в качестве заголовка и автоматически создать схему таблицы. <br /></p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure class="m_retina">
      <img src="https://img1.teletype.in/files/01/54/015482ce-7a6f-42c2-b3e7-b5f0004df8eb.png" width="745" />
      <figcaption>Подключаем Google Sheets к GBQ</figcaption>
    </figure>
  </section>
  <p>Наша таблица импортировалась, но здесь как раз и есть один момент,на котором я застопорился и долго думал что моя таблица импортировалась неправильно. Импортированная таблица не импортируется целиком, в классическом понимании, как в случае с импортом через csv, а как бы связывается. Поэтому вы можетет увидеть, что размер вашей таблицы равен нулю. И сделать превью данных тоже не получится в таком случае.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure class="m_retina">
      <img src="https://img2.teletype.in/files/d9/02/d902ab61-95d1-4435-8648-ffcf11958a75.png" width="937" />
      <figcaption>Настройки импортированной таблицы.</figcaption>
    </figure>
  </section>
  <p>Но если написать простой селект запрос то данные в результаты подтянутся.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure class="m_retina">
      <img src="https://img3.teletype.in/files/69/d9/69d9fb20-f316-45a0-8954-f6ffeefbd9b4.png" width="1072" />
      <figcaption>Данные из гугл таблицы в результатах запроса бигквери</figcaption>
    </figure>
  </section>
  <p>Как видим из запроса данные отобразились. Теперь вы можете джойнить эту таблицу к любым данным и ссылаться на нее в своих запросах как на обычную таблицу BQ, а ваш менеджер будет счастлив.</p>
  <p>Главное напишите понятную инструкцию и следите чтобы данные в гугл таблицу вносили корректно. А то будет как у меня, когда в столбце для даты вместо нужного формата 2021-03-20 написали просто 20 марта. Зашибись, че. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@maxarbuzov/emails_extract_in_google_sheets_or_r</guid><link>https://teletype.in/@maxarbuzov/emails_extract_in_google_sheets_or_r?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=maxarbuzov</link><comments>https://teletype.in/@maxarbuzov/emails_extract_in_google_sheets_or_r?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=maxarbuzov#comments</comments><dc:creator>maxarbuzov</dc:creator><title>Извлекаем email адреса из текста при помощи Google Sheets или R</title><pubDate>Mon, 28 Dec 2020 14:04:15 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/da/2b/da2b8290-afdb-4f9e-a645-e214ec8f77b1.png"></media:content><category>GoogleSheets</category><description><![CDATA[<img src="https://teletype.in/files/2c/41/2c411499-37bd-47f5-9600-b140617e88be.jpeg"></img>Предположим что у вас есть задача извлечь адреса электронных почт из ячеек, в которых кроме имейлов содержится и другая информация в текстовом формате. ]]></description><content:encoded><![CDATA[
  <p>Предположим что у вас есть задача извлечь адреса электронных почт из ячеек, в которых кроме имейлов содержится и другая информация в текстовом формате. </p>
  <p>Это можно сделать тремя способами: </p>
  <p><strong>Руками </strong>- мы понятно его рассматривать не будем. Хотя если есть чужие и очень дешевые руки, а также непреодолимое желание почувствовать себя рабовладельцем - то конечно можно. Кто я такой чтобы запрещать?</p>
  <p><strong>Через Google Sheets</strong> - наиболее оптимальный и с низким порогом вхождения.</p>
  <p><strong>Через язык программирования R</strong> - тот же результат, но изящнее и проще реализовывается, если необходимо работать с большим количеством однотипных файлов. </p>
  <h3>Данные для работы</h3>
  <p>В моем примере есть небольшой файл, который содержит выгрузку аккаунтов из instagram с описанием из шапки профиля(description или biography кто как называет). Из этого поля мы и будем извлекать имейлы. </p>
  <p>Небольшой файл с примером доступен <a href="https://docs.google.com/spreadsheets/d/1yYKssONDRhFDAeM3W8fZ3CVuXInc0KqJnz6Slg43Eko/edit?usp=sharing" target="_blank">по ссылке</a></p>
  <h3>Регулярное выражение</h3>
  <p>Если быть честным, то по сути данный способ подходит для любых языков программирования, потому что в его основе лежит простое регулярное выражение. А уже где вы его будете использовать это вам решать. </p>
  <p>Сама регулярка выглядит так:</p>
  <blockquote data-align="center">[A-z0-9._%+-]+@[A-z0-9.-]+\.[A-z]{2,4}</blockquote>
  <p>ее мы и будем использовать в обоих случаях</p>
  <h3>Извлекаем адреса электронных почт при помощи регулярных выражений в Google Sheets</h3>
  <p>Насколько я знаю, в Microsoft Excel такой возможности &quot;из коробки&quot; нет и там придется извращаться через макросы VBA. Поэтому мы и используем гугл таблицы. Но киньте в меня справочником если я ошибаюсь. </p>
  <p>Для этого нам понадобится всего одна функция, которая и сделает всю работу за нас. </p>
  <p><strong>REGEXEXTRACT</strong></p>
  <p>Формула работает по принципу REGEXEXTRACT(текст; регулярное выражение)</p>
  <p>Вписываем формулу в ячейку и вместо парметра &quot;текст&quot; ставим ссылку на нужную нам ячейку таблицы(в примере это ячейка А2). Вторым параметром пишем нашу регулярку(обязательно в кавычках)</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/2c/41/2c411499-37bd-47f5-9600-b140617e88be.jpeg" width="1168" />
  </figure>
  <p>Протягиваем по всему столбцу и получаем результат. Как видно, в тех строках, которые не содержат имейлов, формула выдает ошибку. Можно удариться в перфекционизм и добавить другую формулу IFERROR (ЕСЛИОШИБКА) которая заменит стандартный текст ошибки на какой нибудь другой, например &quot;No email&quot;</p>
  <p>Конечная формула и результат выглядят так:</p>
  <blockquote data-align="center">ЕСЛИОШИБКА(REGEXEXTRACT(A2;&quot;[A-z0-9._%+-]+@[A-z0-9.-]+\.[A-z]{2,4}&quot;);&quot;No email&quot;)</blockquote>
  <figure class="m_column">
    <img src="https://teletype.in/files/a2/4b/a24b78db-33a1-4ab7-8e60-ef1cbcba665c.jpeg" width="1173" />
  </figure>
  <p>Готово! Наш список электронных почт готов. Остается только использовать его в правильных и непротивозаконных целях. </p>
  <h3>Извлекаем адреса электронных почт при помощи регулярных выражений в R</h3>
  <p>Здесь логика примерно такая же. Для извлечения текста из строки я буду использовать библиотеку &quot;stringr&quot;, а для работы с CSV файлами &quot;vroom&quot;. Устанавливаем библиотеки если еще нет и подключаем их</p>
  <pre>install.packages(&#x27;stringr&#x27;) # Установка
install.packages(&#x27;vroom&#x27;) 
library(&#x27;stringr&#x27;) # Подключение
library(&#x27;vroom&#x27;)</pre>
  <p>Загрузим CSV файл и преобразуем его в таблицу</p>
  <pre>our_table &lt;- vroom(&quot;{PATH TO FOLDER}\\Filename.csv&quot;)</pre>
  <p>Если же у вас много файлов, у которых одинаковая структура, и их надо собрать в одну большую таблицу, то это также можно автоматизировать через R</p>
  <pre>files &lt;- dir(path = &quot;{PATH TO FOLDER}&quot;, pattern = &quot;\\.csv&quot;)
our_table &lt;- vroom(files)</pre>
  <p>Для удобства создадим переменную regex в которую запишем уже знакомое нам регулярное выражение. Обратите внимание что в R спецзнаки экранируются через двойной обратный слеш.</p>
  <pre>regex &lt;-&#x27;[A-z0-9\\._%+-]+@[A-z0-9\\.-]+\\.[A-z]{2,4}&#x27;</pre>
  <p>Пишем финальную формулу, в которой добавляем в существующую таблицу новый столбец для извлеченных имейлов</p>
  <pre>our_table$extract_emails &lt;- str_extract(our_table$biography, regex)</pre>
  <p>Экспортируем получившийся результат в CSV файл</p>
  <pre>write.csv(our_table,&quot;{PATH TO FOLDER}\\our_table.csv&quot;)</pre>
  <p>Для удобства можно отфильтровать таблицу, оставив в ней только те строки, для которых есть извлеченные имейлы. </p>
  <pre>our_table_fin &lt;- our_table %&gt;%
    filter(!is.na(our_table$extract_emails))</pre>
  <p>Конечны скрипт выглядит как-то так</p>
  <pre>#Устанавливаем и подключаем библиотеки
install.packages(&#x27;stringr&#x27;) 
install.packages(&#x27;vroom&#x27;) 
library(&#x27;stringr&#x27;) 
library(&#x27;vroom&#x27;)
#Грузим таблицу из CSV файла
our_table &lt;- vroom(&quot;{PATH TO FOLDER}\\Filename.csv&quot;)
#Если файлов несколько то собираем их в одну таблицу
files &lt;- dir(path = &quot;{PATH TO FOLDER}&quot;, pattern = &quot;\\.csv&quot;)
our_table &lt;- vroom(files)
# Пишем регулярку в переменную
regex &lt;-&#x27;[A-z0-9\\._%+-]+@[A-z0-9\\.-]+\\.[A-z]{2,4}&#x27;
#Добавляем новый столбец в таблицу и одновременно применяем функцию str_extract 
#которая достанет нужный текст по паттерну регулярного выражения
our_table$extract_emails &lt;- str_extract(our_table$biography, regex)
# Если нужно то фильтруем таблицу оставив в ней только строки с имейлами
our_table_fin &lt;- our_table %&gt;%
   filter(!is.na(our_table$extract_emails))
#выгружаем результат в красивую CSVшку
write.csv(our_table_fin,&quot;{PATH TO FOLDER}\\our_table.csv&quot;)</pre>
  <p>Вот и все. Теперь вы умеете извлекать имейлы из текста при помощи гугл таблиц, R и регулярных выражений. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@maxarbuzov/rJGV5914V</guid><link>https://teletype.in/@maxarbuzov/rJGV5914V?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=maxarbuzov</link><comments>https://teletype.in/@maxarbuzov/rJGV5914V?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=maxarbuzov#comments</comments><dc:creator>maxarbuzov</dc:creator><title>Получаем значение курса валют в Google Таблицах с помощью функции IMPORTXML</title><pubDate>Wed, 30 Jan 2019 21:48:29 GMT</pubDate><description><![CDATA[<img src="https://teletype.in/files/34/3414ccfb-d2e7-4aa7-b085-a5a1d26548bc.jpeg"></img>Как следует из названия функция IMPORTXML позволяет импортировать любые данные из xml файлов. Один из вариантов ее применения - импорт значений курсов валют - текущих или для конкретной даты/диапазона.]]></description><content:encoded><![CDATA[
  <p>Как следует из названия функция IMPORTXML позволяет импортировать любые данные из xml файлов. Один из вариантов ее применения - импорт значений курсов валют - текущих или для конкретной даты/диапазона.</p>
  <p>Я проверил работу функции на примере API двух банков - Приватбанка и ЦБ РФ.</p>
  <h2>Приватбанк</h2>
  <p><strong>Текущее значение курса</strong></p>
  <p>XML файл с актуальным курсом находится по ссылке: <a href="https://api.privatbank.ua/p24api/pubinfo?exchange&coursid=11%22;%22//exchangerates/row[1]/exchangerate/@sale" target="_blank">https://api.privatbank.ua/p24api/pubinfo?exchange&amp;coursid=11</a></p>
  <p>Данные из него нужно парсить при помощи языка запросов XPath</p>
  <p>Формула:</p>
  <pre>IMPORTXML(&quot;https://api.privatbank.ua/p24api/pubinfo?exchange&amp;coursid=11&quot;;&quot;//exchangerates/row[1]/exchangerate/@sale&quot;)
</pre>
  <p>Получаем текущее значение USD. Прописав слева в ячейке А функцию TODAY получим отображение текущей даты.</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/34/3414ccfb-d2e7-4aa7-b085-a5a1d26548bc.jpeg" width="946" />
  </figure>
  <p><strong>Курс валют для даты или диапазона дат </strong></p>
  <p>Файл с архивными значениями находится по ссылке: <a href="https://api.privatbank.ua/p24api/exchange_rates?date=01.12.2014" target="_blank">https://api.privatbank.ua/p24api/exchange_rates?date=dd.mm.yyy</a>,</p>
  <p>где вместо <strong>dd.mm.yyyy</strong> необходимо подставить нужное значение даты. В данном случае это 30.01.2019. Конечная формула получения значения курса валют для даты</p>
  <pre>IMPORTXML(&quot;https://api.privatbank.ua/p24api/exchange_rates?date=30.01.2019; &quot;//exchangerate[@currency=&#x27;USD&#x27; and baseCurrency=&#x27;UAH&#x27;]/@saleRateNB&quot;)
</pre>
  <p>Чтобы нужная дата автоматически подставлялась в формулу указываем в диапазон дат и используем функцию СЦЕПИТЬ (CONCATENATE). Для корректной работы формулы дату необходимо перевести в текстовый формат.</p>
  <pre>IMPORTXML(CONCATENATE(&quot;https://api.privatbank.ua/p24api/exchange_rates?date=&quot;;A2); &quot;//exchangerate[@currency=&#x27;USD&#x27; and @baseCurrency=&#x27;UAH&#x27;]/@saleRateNB&quot;)
</pre>
  <figure class="m_column">
    <img src="https://teletype.in/files/33/33f756d6-5288-4bfc-9bca-b2cc151ed67a.jpeg" width="1150" />
  </figure>
  <h2>ЦБ РФ</h2>
  <p><strong>Ссылка для ежедневного значения</strong></p>
  <p><a href="http://www.cbr.ru/scripts/XML_daily.asp" target="_blank">http://www.cbr.ru/scripts/XML_daily.asp</a></p>
  <p>Формула имеет вид</p>
  <pre>IMPORTXML(&quot;http://www.cbr.ru/scripts/XML_daily.asp&quot;; &quot;//ValCurs/Valute[CharCode=&quot;&quot;USD&quot;&quot;]/Value&quot;)
</pre>
  <p><strong>Получаем данные для даты или диапазона</strong></p>
  <pre>IMPORTXML(&quot;http://www.cbr.ru/scripts/XML_daily.asp?date_req=30/01/2019&quot;; &quot;//ValCurs/Valute[CharCode=&quot;&quot;USD&quot;&quot;]/Value&quot;)
</pre>
  <p>Здесь также необходимо перевести дату в текстовый формат и обратить внимание на разделители.</p>
  <p>На выходе получаем файл, в котором автоматически будут обновляться/добавляться данные о курсе валют.</p>
  <p>Файл с примерами рабочих формул находится <a href="https://docs.google.com/spreadsheets/d/1z5D5SNJkiawJUXOtbefCkMVXIXc64yj4BQu6vY4q9Y8/edit?usp=sharing" target="_blank">здесь</a></p>

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