<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wiki.raskrutka.com.ua/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ilonamaksimova</id>
	<title>Raskrutka - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.raskrutka.com.ua/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ilonamaksimova"/>
	<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Ilonamaksimova"/>
	<updated>2026-07-15T05:32:04Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%81%D0%B5_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D1%8B_%D1%82%D0%B0%D1%80%D0%B3%D0%B5%D1%82%D0%B8%D0%BD%D0%B3%D0%B0_%D0%B2_%D0%9A%D0%9C%D0%A1_Google_Ads&amp;diff=1894</id>
		<title>Все варианты таргетинга в КМС Google Ads</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%81%D0%B5_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D1%8B_%D1%82%D0%B0%D1%80%D0%B3%D0%B5%D1%82%D0%B8%D0%BD%D0%B3%D0%B0_%D0%B2_%D0%9A%D0%9C%D0%A1_Google_Ads&amp;diff=1894"/>
		<updated>2019-10-28T15:16:29Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://drive.google.com/file/d/1JdMfkqPTXOvljF0jteUeSapeEQT5oUsE/view?usp=sharing Все темы и интересы 09.01.2019]&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BA_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%D0%BC_%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BE%D0%B2&amp;diff=1893</id>
		<title>Требования к спискам электронных адресов</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BA_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%D0%BC_%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BE%D0%B2&amp;diff=1893"/>
		<updated>2019-10-28T15:15:55Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Файлы должны быть в формате CSV.&lt;br /&gt;
* Все идентификаторы, относящиеся к одной и той же записи о пользователе, должны быть перечислены через запятую. В качестве разделителя между записями о разных пользователях используйте символ перевода строки \n (по стандарту UNIX) или разрыв строки (а не пробел или точку с запятой).&lt;br /&gt;
* В файле должны быть только следующие заголовки столбцов: ''Email (Адрес электронной почты), Phone (Телефон), First Name (Имя), Last Name (Фамилия), Country (Страна), Zip (Почтовый индекс), User ID (Идентификатор пользователя) и Mobile Device ID (Идентификатор мобильного устройства)''. Столбцов Email и Zip может быть несколько.&lt;br /&gt;
* Эл. почта&lt;br /&gt;
Каждый адрес электронной почты должен содержать название домена (например, gmail.com или mail.ru).&lt;br /&gt;
* Имя&lt;br /&gt;
Имена не должны содержать обращения (например, &amp;quot;г-н&amp;quot;). &lt;br /&gt;
Разрешено использовать диакритические знаки.&lt;br /&gt;
* Фамилия&lt;br /&gt;
Не должна содержать дополнительные слова (например, &amp;quot;младший&amp;quot;).&lt;br /&gt;
Разрешено использовать диакритические знаки.&lt;br /&gt;
* Код страны для телефонных номеров.&lt;br /&gt;
Используйте двухбуквенные коды стран ISO.&lt;br /&gt;
Указывайте код страны, даже если все ваши клиенты из одной страны.&lt;br /&gt;
* Почтовый индекс&lt;br /&gt;
Разрешено использовать почтовые индексы США и международные почтовые индексы.&lt;br /&gt;
Для США:&lt;br /&gt;
допускаются пятизначные коды;&lt;br /&gt;
после пятизначного кода можно указать четырехзначный добавочный код, чтобы повысить коэффициент соответствия.&lt;br /&gt;
Для всех остальных стран не указывайте добавочные почтовые индексы.&lt;br /&gt;
&lt;br /&gt;
*Идентификатор мобильного устройства&lt;br /&gt;
Используйте один столбец с заголовком Mobile Device ID.&lt;br /&gt;
Файл должен содержать только идентификаторы мобильных устройств. В нем не должно быть никаких других данных.&lt;br /&gt;
Срок хранения данных составляет не больше 540 дней. &lt;br /&gt;
&lt;br /&gt;
Если вы хешируете файл перед загрузкой, то должны выполняться следующие дополнительные требования:&lt;br /&gt;
&lt;br /&gt;
# Столбцы Country и Zip не должны быть хешированы.&lt;br /&gt;
# Все символы должны быть в нижнем регистре. Необходимо удалить лишние пробелы до и после имен и адресов электронной почты, а также между ними.&lt;br /&gt;
# Адреса электронной почты, содержащие символы с надстрочными знаками (например, è, é, ê и ë), не будут сопоставляться с аккаунтами Google. Впрочем, такие символы можно использовать в именах (поле First Name) и фамилиях (поле Last Name).&lt;br /&gt;
# Форматирование телефонных номеров с использованием формата E.164&lt;br /&gt;
&lt;br /&gt;
'''Пример форматирования файла в виде таблицы.'''&lt;br /&gt;
&lt;br /&gt;
В первой строке должны быть заголовки столбцов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Email !! Email !! First Name !! Last Name !! Country !! Zip !! Zip&lt;br /&gt;
|-&lt;br /&gt;
| test@gmail.com|| test2@gmail.com || john || smith || us || 94016 || &lt;br /&gt;
|-&lt;br /&gt;
| test3@gmail.com || || newtest || test || cn || 101300 || 101500&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Пример правильно составленного файла в формате CSV.''' &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Email,First Name,Last Name,Country,Zip&lt;br /&gt;
|-&lt;br /&gt;
| test@gmail.com,test2@gmail.com,john,smith,us,94016&lt;br /&gt;
|-&lt;br /&gt;
| test3@gmail.com,newtest,test,cn,101300,101500&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1SbOSwMNrExsV7VRLntAhjz18xq00x1Tm/view?usp=sharing Шаблон файла]&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=PPC_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=1892</id>
		<title>PPC отдел</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=PPC_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=1892"/>
		<updated>2019-10-28T15:14:41Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Прочее */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Структура отдела: ==&lt;br /&gt;
&lt;br /&gt;
'''1. Назначение подразделения'''&lt;br /&gt;
&lt;br /&gt;
'''2. Определение бизнес-процесса подразделения (основной или обеспечительный)'''&lt;br /&gt;
&lt;br /&gt;
'''3. Цель и задачи деятельности'''&lt;br /&gt;
&lt;br /&gt;
'''4. Организационная структура'''&lt;br /&gt;
&lt;br /&gt;
'''5. Распределение ответственности между сотрудниками'''&lt;br /&gt;
&lt;br /&gt;
'''6. Показатели эффективности работы подразделения (KPI)'''&lt;br /&gt;
&lt;br /&gt;
'''7. Информационно-деловой обмен подразделения'''&lt;br /&gt;
&lt;br /&gt;
'''8. Система стимулирования и мотивации'''&lt;br /&gt;
&lt;br /&gt;
'''9. Штатное расписание'''&lt;br /&gt;
&lt;br /&gt;
'''10. Планирование выполнения Заявки'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Задача отдела PPC]]&lt;br /&gt;
&lt;br /&gt;
[[Бизнес процесс]]&lt;br /&gt;
&lt;br /&gt;
[[Должностные инструкции]]&lt;br /&gt;
&lt;br /&gt;
= Процессы =&lt;br /&gt;
[https://drive.google.com/file/d/1kideyhFkLN4snsxKKx7o3_c6cD1mYZfM/view?usp=sharing Работы PPC+FB (список + время)]&lt;br /&gt;
&lt;br /&gt;
[[Передача задач перед отпуском]]&lt;br /&gt;
&lt;br /&gt;
[[Передача проекта]]&lt;br /&gt;
&lt;br /&gt;
[[Пополнение аккаунта]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет по проекту за месяц]]&lt;br /&gt;
&lt;br /&gt;
[[Аудит аккаунта]]&lt;br /&gt;
&lt;br /&gt;
= Google Ads =&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Алгоритмы ==&lt;br /&gt;
[[Подготовительные работы]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка аналитики]]&lt;br /&gt;
&lt;br /&gt;
[[Поисковая рекламная кампания]] &lt;br /&gt;
&lt;br /&gt;
[[Рекламная кампания КМС]]&lt;br /&gt;
&lt;br /&gt;
[[Ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Днамический ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Торговая кампания Google Merchant]]&lt;br /&gt;
&lt;br /&gt;
[[Видеореклама YouTube]]&lt;br /&gt;
&lt;br /&gt;
[[Ведение кампаний (работы на месяц)]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Перенос списков ремаркетинга в Google Adwords]]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Скрипты  ==&lt;br /&gt;
&lt;br /&gt;
[[Инструмент проверки ссылок (один аккаунт)]]&lt;br /&gt;
&lt;br /&gt;
[[Изменение формата объявлений на новый]]&lt;br /&gt;
&lt;br /&gt;
[[Ставки для позиции]]&lt;br /&gt;
&lt;br /&gt;
[[Поиск тематических каналов на YouTube]]&lt;br /&gt;
&lt;br /&gt;
[[Чистка мест размещения]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет эффективности объявлений]]&lt;br /&gt;
&lt;br /&gt;
[[Тепловая карта для управления ставками]]&lt;br /&gt;
&lt;br /&gt;
[[Ставки 24/7]]&lt;br /&gt;
&lt;br /&gt;
[[Проверка остатка баланса в аккаунте (для MCC)]]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Исключения для кампаний ==&lt;br /&gt;
=== Медийные кампании ===&lt;br /&gt;
[[Мобильные приложения]]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1LbE2AMjAMKEAOdXt-jWCXcP45_Hf9Oe4/view?usp=sharing Сайты знакомств/чаты]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1i0KimE69nD14HNHWz3ReABAx8A0egLF0/view?usp=sharing Игровые сайты]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1V_iy3_MGJqv5WxoKMBS6ju9CEEGz0acz/view?usp=sharing Детские YouTube каналы]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1wO89FJ5hf-0lDHGIoS9AtcpilHOxwaBv/view?usp=sharing GDN-2700-Bad-Placements]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1LpQT-NmqZrpjDBE9VwgLPorThn29uD4HFid2LnvrW8Y/edit#gid=648103664 2019 - All Bad Placements (Apps, Sites, YouTube Channel]&lt;br /&gt;
&lt;br /&gt;
=== Поисковые кампании ===&lt;br /&gt;
[https://drive.google.com/file/d/1Dz56pRYH1cReoqVtiYdtBj9kxsTsTinO/view?usp=sharing Универсальный список минус-слов]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1bxGEYj3hUS77bk0c9wKGJER-ajHuNPHe/view?usp=sharing Маркеры фото/видео]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1NiB1M_7ASBGOKWhACh0oWe_KoQ52zFe_/view?usp=sharing Маркеры Отзывы]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1g8BomzAtF6xNAu37lbA6xFAgrHwhEwT9/view?usp=sharing Маркеры Поиск работы]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1rJFTNcDCxgSLTBOXV229F2bZYhReLsja/view?usp=sharing Города РФ]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/12fcS3RieyWJqdFSDLe8sIn0tVW1kIs2x/view?usp=sharing Города Украины]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Фиды ==&lt;br /&gt;
[[Подстановка городов в текст объявления]]&lt;br /&gt;
&lt;br /&gt;
[[Динамический ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Фид Merchant Center]]&lt;br /&gt;
&lt;br /&gt;
= Facebook Ads =&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Подготовительные работы ==&lt;br /&gt;
&lt;br /&gt;
[[Создание/подключение страниц Facebook/Instagram]]&lt;br /&gt;
&lt;br /&gt;
[[Создание/подключение рекламного аккаунта Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка целей/событий Facebook Pixel]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка сложных аудиторий для ремаркетинга в Facebook Pixel]]&lt;br /&gt;
&lt;br /&gt;
[[Пополнение аккаунта Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Создание рекламных кампаний ==&lt;br /&gt;
&lt;br /&gt;
[[Формирование структуры аккаунта;]]&lt;br /&gt;
&lt;br /&gt;
[[Создание кампании с определенной целью]]&lt;br /&gt;
&lt;br /&gt;
[[Создание группы объявлений]]&lt;br /&gt;
&lt;br /&gt;
[[Создание объявления]]&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Фиды ==&lt;br /&gt;
&lt;br /&gt;
[[Фид Facebook]]&lt;br /&gt;
&lt;br /&gt;
[[Динамический ремаркетинг Facebook]]&lt;br /&gt;
&lt;br /&gt;
= Прочее =&lt;br /&gt;
[https://drive.google.com/file/d/1eQu2qL0EYWzPErkVP3FKKLSKHchhbznI/view?usp=sharing Требования к рекламным объявлениям]&lt;br /&gt;
&lt;br /&gt;
[[Требования к спискам электронных адресов]]&lt;br /&gt;
&lt;br /&gt;
[[Все варианты таргетинга Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Все варианты таргетинга в КМС Google Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Требования к условиям возврата  товара и денег]]&lt;br /&gt;
&lt;br /&gt;
[[Требования к форме заказа]]&lt;br /&gt;
&lt;br /&gt;
[[Полезные ссылки]]&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%80%D0%B5%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3&amp;diff=1891</id>
		<title>Динамический ремаркетинг</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%80%D0%B5%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3&amp;diff=1891"/>
		<updated>2019-10-28T15:13:43Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Шаблоны фидов: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
'''Требования к файлу''': &lt;br /&gt;
Формат: CSV, TSV, XLS, XLSX. &lt;br /&gt;
&lt;br /&gt;
Кодировка: UTF-8 (рекомендуется), UTF-16 или UTF-32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Данные фида: ==&lt;br /&gt;
&lt;br /&gt;
''* - обязательный параметр''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Атрибут&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Спецификации&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Примеры значений&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Отображение в объявлении&lt;br /&gt;
|-&lt;br /&gt;
|ID*&lt;br /&gt;
''(соответствует настраиваемому параметру dynx_itemid)''&lt;br /&gt;
|Любая последовательность букв и цифр. Идентификаторы должны быть уникальными и соответствовать значениям из вашего тега ремаркетинга.&lt;br /&gt;
|Седан&lt;br /&gt;
|Не отображается&lt;br /&gt;
|-&lt;br /&gt;
|ID2&lt;br /&gt;
''(соответствует настраиваемому параметру dynx_itemid2)''&lt;br /&gt;
|Любая последовательность букв и цифр. Сочетание идентификаторов (например, ID и ID2 или только ID) должно быть уникальным.&lt;br /&gt;
|Красный&lt;br /&gt;
|Не отображается&lt;br /&gt;
|-&lt;br /&gt;
|Item title*&lt;br /&gt;
|Максимальная длина – 25 символов (12 для языков с двухбайтовыми символами).	&lt;br /&gt;
|Седан среднего размера	&lt;br /&gt;
|Отображается&lt;br /&gt;
|-&lt;br /&gt;
|Final URL&lt;br /&gt;
''(рекомендуется)''&lt;br /&gt;
|Адрес должен содержать домен, соответствующий домену вашего сайта. Адрес должен начинаться с &amp;quot;http://&amp;quot; или &amp;quot;https://&amp;quot;.&lt;br /&gt;
|http://www.example.com/cars&lt;br /&gt;
|Не отображается&lt;br /&gt;
|-&lt;br /&gt;
|Image URL&lt;br /&gt;
''(рекомендуется)''&lt;br /&gt;
|Поддерживаемые форматы: PNG (рекомендуется), JPG или GIF. Файлы JPG и GIF должны быть сохранены в цветовой кодировке RGB с профилем ICC. Рекомендуемое разрешение – 300 x 300 пикселей, 72 DPI. Максимальный размер файла – 11,4 МБ. Максимальное число пикселей – 6 млн.	&lt;br /&gt;
|http://www.example.com/image.png&lt;br /&gt;
|Отображается&lt;br /&gt;
|-&lt;br /&gt;
|Item subtitle&lt;br /&gt;
|Максимальная длина – 25 символов (12 для языков с двухбайтовыми символами).&lt;br /&gt;
|Автодилер в Москве&lt;br /&gt;
|Отображается&lt;br /&gt;
|-&lt;br /&gt;
|Item description&lt;br /&gt;
''(рекомендуется)''&lt;br /&gt;
|Максимальная длина – 25 символов (12 для языков с двухбайтовыми символами).&lt;br /&gt;
|Лучший седан C-класса	&lt;br /&gt;
|Отображается&lt;br /&gt;
|-&lt;br /&gt;
|Item Category&lt;br /&gt;
|Текстовое поле.&lt;br /&gt;
|Седаны&lt;br /&gt;
|Не отображается&lt;br /&gt;
|-&lt;br /&gt;
|Price&lt;br /&gt;
''(рекомендуется)''&lt;br /&gt;
|Число и код валюты в кодировке ISO 4217. Используйте точку (.) в качестве десятичного разделителя.	&lt;br /&gt;
|20 тыс. долл. США&lt;br /&gt;
|Отображается&lt;br /&gt;
|-&lt;br /&gt;
|Sale Price&lt;br /&gt;
|Число и код валюты в кодировке ISO 4217. Используйте точку (.) в качестве десятичного разделителя. Цена со скидкой должна быть ниже обычной цены.	&lt;br /&gt;
|15,000.00 USD&lt;br /&gt;
|Отображается&lt;br /&gt;
|-&lt;br /&gt;
|Contextual keywords&lt;br /&gt;
|Текстовое поле. Перечисляйте ключевые слова через точку с запятой.&lt;br /&gt;
|Cеданы; четырехдверные седаны&lt;br /&gt;
|Не отображается&lt;br /&gt;
|-&lt;br /&gt;
|Item address&lt;br /&gt;
|Используйте один из следующих методов форматирования:&lt;br /&gt;
&lt;br /&gt;
– Город, область, индекс, страна.&lt;br /&gt;
&lt;br /&gt;
– Полный адрес с почтовым индексом.&lt;br /&gt;
&lt;br /&gt;
– Координаты широты и долготы в градусах с десятичной дробью.&lt;br /&gt;
|&lt;br /&gt;
– Королев, Московская обл., Россия&lt;br /&gt;
&lt;br /&gt;
– Бульвар 123, Маунтин-Вью, Калифорния, 94043&lt;br /&gt;
&lt;br /&gt;
– 41.40338, 2.17403&lt;br /&gt;
|Не отображается&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Шаблоны фидов: ==&lt;br /&gt;
&lt;br /&gt;
Шаблон Образование:[https://drive.google.com/file/d/1SeDBmndawuA3sGv7zHZ99Xlp91-MrMpo/view?usp=sharing Образование]&lt;br /&gt;
&lt;br /&gt;
Шаблон Авиабилеты: [https://drive.google.com/file/d/1aCoAAmVcfYVnIbi_4jNbiRYRodMF3NR7/view?usp=sharing Авиабилеты]&lt;br /&gt;
&lt;br /&gt;
Шаблон Отели и аренда жилья:&lt;br /&gt;
[https://drive.google.com/file/d/1i885YyYfxgxN7r-M1pc77oaMNht4fKbk/view?usp=sharing Отели и аренда жилья]&lt;br /&gt;
&lt;br /&gt;
Шаблон Вакансии:&lt;br /&gt;
[https://drive.google.com/file/d/15BjSsBy9C-j8az7hgrCrLr5Ymr8QEaRf/view?usp=sharing Вакансии]&lt;br /&gt;
&lt;br /&gt;
Шаблон Местные предложения:&lt;br /&gt;
[https://drive.google.com/file/d/1_HJXP39Y6mXuVlUoNNYtpUK5tCXoYomp/view?usp=sharing Местные предложения]&lt;br /&gt;
&lt;br /&gt;
Шаблон Недвижимость:[https://drive.google.com/file/d/15sEMYxNZC7qfvIaqfPkMFiwlMYkDZsyG/view?usp=sharing Недвижимость]&lt;br /&gt;
&lt;br /&gt;
Шаблон Путешествия:&lt;br /&gt;
[https://drive.google.com/file/d/1vDnaF-RmD32dc6LHCere9a2fPdVyFueD/view?usp=sharing Путешествия]&lt;br /&gt;
&lt;br /&gt;
Пользовательский шаблон:&lt;br /&gt;
[https://drive.google.com/file/d/1gmv_vegED2XdXLKCMzWfXWf7ebmWGg1r/view?usp=sharing Пользовательский]&lt;br /&gt;
&lt;br /&gt;
== Настройка параметров на сайте==&lt;br /&gt;
&lt;br /&gt;
В шаблон на сайте, на странице товара, добавить автоматические скрытые поля с ID, артикулом (ID2) и ценой&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:none;&amp;quot; id=&amp;quot;dynamic_product_id&amp;quot;&amp;gt;32742+14-01-00-1100&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:none;&amp;quot; id=&amp;quot;dynamic_product_code&amp;quot;&amp;gt;14-01-00-1100&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:none;&amp;quot; id=&amp;quot;dynamic_product_price&amp;quot;&amp;gt;341.00&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка параметров GTM ==&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
(Собственный код JavaScript)&lt;br /&gt;
&lt;br /&gt;
'''itemid'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(){&lt;br /&gt;
	if(document.getElementById('dynamic_product_id')){&lt;br /&gt;
		var divofid = document.getElementById('dynamic_product_id');&lt;br /&gt;
		if (divofid.innerHTML.length&amp;gt;0){&lt;br /&gt;
			return divofid.innerHTML;&lt;br /&gt;
		}else{&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''itemid2'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(){&lt;br /&gt;
	if(document.getElementById('dynamic_product_code')){&lt;br /&gt;
		var divofid = document.getElementById('dynamic_product_code');&lt;br /&gt;
		if (divofid.innerHTML.length&amp;gt;0){&lt;br /&gt;
			return divofid.innerHTML;&lt;br /&gt;
		}else{&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''pagetype'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(){&lt;br /&gt;
	if(document.getElementById('dynamic_product_id')){&lt;br /&gt;
		var divofid = document.getElementById('dynamic_product_id');&lt;br /&gt;
		if (divofid.innerHTML.length&amp;gt;0){&lt;br /&gt;
			return 'product';&lt;br /&gt;
		}else{&lt;br /&gt;
			return 'other';&lt;br /&gt;
		}&lt;br /&gt;
	}else{&lt;br /&gt;
		return 'other';&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''totalvalue'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(){&lt;br /&gt;
	if(document.getElementById('dynamic_product_price')){&lt;br /&gt;
		var divofid = document.getElementById('dynamic_product_price');&lt;br /&gt;
		if (divofid.innerHTML.length&amp;gt;0){&lt;br /&gt;
			return divofid.innerHTML;&lt;br /&gt;
		}else{&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Теги ===&lt;br /&gt;
1. Ремаркетинг AdWords&lt;br /&gt;
&lt;br /&gt;
''Идентификатор конверсии'' взять из кода Тега ремаркетинга в AdWords&lt;br /&gt;
&lt;br /&gt;
Пользовательские параметры:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	ecomm_prodid {{itemid}}&lt;br /&gt;
	ecomm_pagetype {{pagetype}}&lt;br /&gt;
	ecomm_totalvalue {{totalvalue}}&lt;br /&gt;
	dynx_itemid {{itemid}}&lt;br /&gt;
	dynx_itemid2 {{itemid2}}&lt;br /&gt;
	dynx_pagetype {{pagetype}}&lt;br /&gt;
	dynx_totalvalue {{totalvalue}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Триггер - Модель DOM готова&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%B2_%D0%B2_%D1%82%D0%B5%D0%BA%D1%81%D1%82_%D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=1890</id>
		<title>Подстановка городов в текст объявления</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%B2_%D0%B2_%D1%82%D0%B5%D0%BA%D1%81%D1%82_%D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=1890"/>
		<updated>2019-10-28T15:03:33Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1. Скачать один из готовых фидов ([https://drive.google.com/file/d/1XC-jlTsnTHx742pq0MskMxJY9L6BTpQF/view?usp=sharing города Украины], [https://drive.google.com/file/d/1kqHviiVqpbtVTS6BKsVzCujbHKxs0M6C/view?usp=sharing города РФ], [https://drive.google.com/file/d/1OTco_0HKzqx_U9J38l995je7yC1Q5v5V/view?usp=sharing города Польши])&lt;br /&gt;
&lt;br /&gt;
2. Добавить в объявления модификатор&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=PPC_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=1889</id>
		<title>PPC отдел</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=PPC_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=1889"/>
		<updated>2019-10-28T15:00:52Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Google Ads| Исключения для кампаний */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Структура отдела: ==&lt;br /&gt;
&lt;br /&gt;
'''1. Назначение подразделения'''&lt;br /&gt;
&lt;br /&gt;
'''2. Определение бизнес-процесса подразделения (основной или обеспечительный)'''&lt;br /&gt;
&lt;br /&gt;
'''3. Цель и задачи деятельности'''&lt;br /&gt;
&lt;br /&gt;
'''4. Организационная структура'''&lt;br /&gt;
&lt;br /&gt;
'''5. Распределение ответственности между сотрудниками'''&lt;br /&gt;
&lt;br /&gt;
'''6. Показатели эффективности работы подразделения (KPI)'''&lt;br /&gt;
&lt;br /&gt;
'''7. Информационно-деловой обмен подразделения'''&lt;br /&gt;
&lt;br /&gt;
'''8. Система стимулирования и мотивации'''&lt;br /&gt;
&lt;br /&gt;
'''9. Штатное расписание'''&lt;br /&gt;
&lt;br /&gt;
'''10. Планирование выполнения Заявки'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Задача отдела PPC]]&lt;br /&gt;
&lt;br /&gt;
[[Бизнес процесс]]&lt;br /&gt;
&lt;br /&gt;
[[Должностные инструкции]]&lt;br /&gt;
&lt;br /&gt;
= Процессы =&lt;br /&gt;
[https://drive.google.com/file/d/1kideyhFkLN4snsxKKx7o3_c6cD1mYZfM/view?usp=sharing Работы PPC+FB (список + время)]&lt;br /&gt;
&lt;br /&gt;
[[Передача задач перед отпуском]]&lt;br /&gt;
&lt;br /&gt;
[[Передача проекта]]&lt;br /&gt;
&lt;br /&gt;
[[Пополнение аккаунта]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет по проекту за месяц]]&lt;br /&gt;
&lt;br /&gt;
[[Аудит аккаунта]]&lt;br /&gt;
&lt;br /&gt;
= Google Ads =&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Алгоритмы ==&lt;br /&gt;
[[Подготовительные работы]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка аналитики]]&lt;br /&gt;
&lt;br /&gt;
[[Поисковая рекламная кампания]] &lt;br /&gt;
&lt;br /&gt;
[[Рекламная кампания КМС]]&lt;br /&gt;
&lt;br /&gt;
[[Ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Днамический ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Торговая кампания Google Merchant]]&lt;br /&gt;
&lt;br /&gt;
[[Видеореклама YouTube]]&lt;br /&gt;
&lt;br /&gt;
[[Ведение кампаний (работы на месяц)]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Перенос списков ремаркетинга в Google Adwords]]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Скрипты  ==&lt;br /&gt;
&lt;br /&gt;
[[Инструмент проверки ссылок (один аккаунт)]]&lt;br /&gt;
&lt;br /&gt;
[[Изменение формата объявлений на новый]]&lt;br /&gt;
&lt;br /&gt;
[[Ставки для позиции]]&lt;br /&gt;
&lt;br /&gt;
[[Поиск тематических каналов на YouTube]]&lt;br /&gt;
&lt;br /&gt;
[[Чистка мест размещения]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет эффективности объявлений]]&lt;br /&gt;
&lt;br /&gt;
[[Тепловая карта для управления ставками]]&lt;br /&gt;
&lt;br /&gt;
[[Ставки 24/7]]&lt;br /&gt;
&lt;br /&gt;
[[Проверка остатка баланса в аккаунте (для MCC)]]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Исключения для кампаний ==&lt;br /&gt;
=== Медийные кампании ===&lt;br /&gt;
[[Мобильные приложения]]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1LbE2AMjAMKEAOdXt-jWCXcP45_Hf9Oe4/view?usp=sharing Сайты знакомств/чаты]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1i0KimE69nD14HNHWz3ReABAx8A0egLF0/view?usp=sharing Игровые сайты]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1V_iy3_MGJqv5WxoKMBS6ju9CEEGz0acz/view?usp=sharing Детские YouTube каналы]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1wO89FJ5hf-0lDHGIoS9AtcpilHOxwaBv/view?usp=sharing GDN-2700-Bad-Placements]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1LpQT-NmqZrpjDBE9VwgLPorThn29uD4HFid2LnvrW8Y/edit#gid=648103664 2019 - All Bad Placements (Apps, Sites, YouTube Channel]&lt;br /&gt;
&lt;br /&gt;
=== Поисковые кампании ===&lt;br /&gt;
[https://drive.google.com/file/d/1Dz56pRYH1cReoqVtiYdtBj9kxsTsTinO/view?usp=sharing Универсальный список минус-слов]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1bxGEYj3hUS77bk0c9wKGJER-ajHuNPHe/view?usp=sharing Маркеры фото/видео]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1NiB1M_7ASBGOKWhACh0oWe_KoQ52zFe_/view?usp=sharing Маркеры Отзывы]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1g8BomzAtF6xNAu37lbA6xFAgrHwhEwT9/view?usp=sharing Маркеры Поиск работы]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1rJFTNcDCxgSLTBOXV229F2bZYhReLsja/view?usp=sharing Города РФ]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/12fcS3RieyWJqdFSDLe8sIn0tVW1kIs2x/view?usp=sharing Города Украины]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Фиды ==&lt;br /&gt;
[[Подстановка городов в текст объявления]]&lt;br /&gt;
&lt;br /&gt;
[[Динамический ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Фид Merchant Center]]&lt;br /&gt;
&lt;br /&gt;
= Facebook Ads =&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Подготовительные работы ==&lt;br /&gt;
&lt;br /&gt;
[[Создание/подключение страниц Facebook/Instagram]]&lt;br /&gt;
&lt;br /&gt;
[[Создание/подключение рекламного аккаунта Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка целей/событий Facebook Pixel]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка сложных аудиторий для ремаркетинга в Facebook Pixel]]&lt;br /&gt;
&lt;br /&gt;
[[Пополнение аккаунта Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Создание рекламных кампаний ==&lt;br /&gt;
&lt;br /&gt;
[[Формирование структуры аккаунта;]]&lt;br /&gt;
&lt;br /&gt;
[[Создание кампании с определенной целью]]&lt;br /&gt;
&lt;br /&gt;
[[Создание группы объявлений]]&lt;br /&gt;
&lt;br /&gt;
[[Создание объявления]]&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Фиды ==&lt;br /&gt;
&lt;br /&gt;
[[Фид Facebook]]&lt;br /&gt;
&lt;br /&gt;
[[Динамический ремаркетинг Facebook]]&lt;br /&gt;
&lt;br /&gt;
= Прочее =&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1px34aztXFLvZ8Rotbz1ZT1x8-H0EYBMZionfODcFBLM/edit?usp=sharing Требования к рекламным объявлениям]&lt;br /&gt;
&lt;br /&gt;
[[Требования к спискам электронных адресов]]&lt;br /&gt;
&lt;br /&gt;
[[Все варианты таргетинга Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Все варианты таргетинга в КМС Google Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Требования к условиям возврата  товара и денег]]&lt;br /&gt;
&lt;br /&gt;
[[Требования к форме заказа]]&lt;br /&gt;
&lt;br /&gt;
[[Полезные ссылки]]&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A2%D0%B5%D0%BF%D0%BB%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=1888</id>
		<title>Тепловая карта для управления ставками</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A2%D0%B5%D0%BF%D0%BB%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=1888"/>
		<updated>2019-10-28T14:54:03Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт создает тепловые карты, которые представляют собой визуализированные данные аккаунта AdWords, с распределением кликов, показов, конверсий и других метрик по времени и устройствам.&lt;br /&gt;
&lt;br /&gt;
1. Cкопировать [https://docs.google.com/spreadsheets/d/1LFHbhgAKCRbvr5vTMI67qhsgIw0axfdK/edit#gid=2015463341 шаблон] тепловой карты на свой Google Диск.&lt;br /&gt;
&lt;br /&gt;
2. Перейти в аккаунт Google AdWords на вкладку &amp;quot;Скрипты&amp;quot;. Добавить код, приведенный ниже&lt;br /&gt;
&lt;br /&gt;
3. Настроить скрипт&lt;br /&gt;
&lt;br /&gt;
'''spreadsheetUrl''' — это адрес документа с шаблоном тепловой карты;&lt;br /&gt;
&lt;br /&gt;
'''dateRanges''' - отображает период, за который нужно получить данные. Каждый диапазон дат использует формат «гггг-мм-дд,гггг-мм-дд», например [«2018-05-01,2018-07-31»]. Также можно указать несколько диапазонов дат, достаточно разделить их запятыми, например [«2018-05-01,2018-06-30», «2018-08-01,2018-09-30»];&lt;br /&gt;
&lt;br /&gt;
'''ignoreDates''' - используется, когда необходимо исключить данные определенных дней. Это список дат, разделенных запятыми, в формате «гггг-мм-дд». Например, с помощью [&amp;quot;2018-03-08&amp;quot;,&amp;quot;2018-05-01«] исключены праздники 8 марта и 1 мая;&lt;br /&gt;
&lt;br /&gt;
'''fields''' — в этом поле нужно добавить показатели, для которых будут созданы тепловые карты. Поместите их в кавычки, разделенные запятыми;&lt;br /&gt;
&lt;br /&gt;
'''calculateFields''' — это метрики, которые должны рассчитываться из показателей fields. Например [«Clicks/Impressions», «Conversions/Clicks»]. Первое — CTR, второе — коэффициент конверсии;&lt;br /&gt;
&lt;br /&gt;
'''devices''' — позволяет разделить тепловые карты по типам устройств, можно указать desktop, mobile, tablet. Если нужен только общий трафик, оставьте это поле пустым;&lt;br /&gt;
&lt;br /&gt;
'''campaignNameContains''' и '''campaignNameDoesNotContain''' — фильтр для определенных кампаний. Если нужно проанализировать определенные кампании, добавьте их название в первое поле. Во втором добавьте те кампании, данные которых нужно исключить из тепловой карты. Оставьте поле пустым, чтобы данные всех кампаний были внесены в таблицу;&lt;br /&gt;
&lt;br /&gt;
'''ignorePausedCampaigns''' — игнорирует приостановленные кампании. Установить значение «true», если нужно посмотреть данные только активных кампаний, или «false», чтобы включить в карту приостановленные кампании.&lt;br /&gt;
&lt;br /&gt;
Важно! Удаленные кампании всегда игнорируются и не учитываются в картах.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*&lt;br /&gt;
* Heat Map Creation Tool - with Devices&lt;br /&gt;
*&lt;br /&gt;
* This script calculates the smoothed average performance of each hour of each day&lt;br /&gt;
* of the week, and outputs this into a heat map and graph in a Google Sheet. This&lt;br /&gt;
* can be done for all data and for device data. It also suggests ad schedules and&lt;br /&gt;
* device bid adjustments based on conversion rates.&lt;br /&gt;
*&lt;br /&gt;
* Version: 2.0&lt;br /&gt;
* Google AdWords Script maintained on brainlabsdigital.com&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Options &lt;br /&gt;
&lt;br /&gt;
var spreadsheetUrl = &amp;quot;https://docs.google.com/YOUR-SPREADSHEET-URL-HERE&amp;quot;;&lt;br /&gt;
// The URL of the Google Doc the results will be put into.&lt;br /&gt;
// so you have the correct formatting and charts set up.&lt;br /&gt;
&lt;br /&gt;
var dateRanges = [&amp;quot;2016-09-01,2016-10-31&amp;quot;];&lt;br /&gt;
// The start and end date of the date range for your data&lt;br /&gt;
// You can have multiple ranges, eg [&amp;quot;2016-06-01,2016-07-31&amp;quot;,&amp;quot;2016-09-01,2016-10-31&amp;quot;]&lt;br /&gt;
// would get data from June, July, September and October 2015.&lt;br /&gt;
// Format for each range is &amp;quot;yyyy-mm-dd,yyyy-mm-dd&amp;quot; (where the first date is the&lt;br /&gt;
// start of the range and the second is the end).&lt;br /&gt;
&lt;br /&gt;
var ignoreDates = [];&lt;br /&gt;
// List any single days that are within your date range but whose data you do not&lt;br /&gt;
// want to use in calculations, for instance if they had atypical performance or&lt;br /&gt;
// there were technical issues with your site.&lt;br /&gt;
// eg [&amp;quot;2016-02-14&amp;quot;,&amp;quot;2016-03-27&amp;quot;] would mean data from Valentine's Day and Easter&lt;br /&gt;
// 2016 would be ignored.&lt;br /&gt;
// Format for each day is &amp;quot;yyyy-mm-dd&amp;quot;&lt;br /&gt;
// Leave as [] if unwanted.&lt;br /&gt;
&lt;br /&gt;
var fields = [&amp;quot;Impressions&amp;quot;, &amp;quot;Clicks&amp;quot;, &amp;quot;Conversions&amp;quot;];&lt;br /&gt;
// Make heat maps of these fields.&lt;br /&gt;
// Allowed values: &amp;quot;Impressions&amp;quot;, &amp;quot;Clicks&amp;quot;, &amp;quot;Cost&amp;quot;, &amp;quot;Conversions&amp;quot;,&lt;br /&gt;
// &amp;quot;ConversionValue&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var calculatedFields = [&amp;quot;Clicks/Impressions&amp;quot;,&amp;quot;Conversions/Clicks&amp;quot;];&lt;br /&gt;
// Make heat maps of a stat calculated by dividing one field by another. &lt;br /&gt;
// For example &amp;quot;Clicks/Impressions&amp;quot; will give the average clicks divided by the&lt;br /&gt;
// average impressions (ie the CTR).&lt;br /&gt;
// Allowed fields: &amp;quot;Impressions&amp;quot;, &amp;quot;Clicks&amp;quot;, &amp;quot;Cost&amp;quot;, &amp;quot;Conversions&amp;quot;,&lt;br /&gt;
// &amp;quot;ConversionValue&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var devices = [&amp;quot;Mobile&amp;quot;];&lt;br /&gt;
// Make heat maps and bid modifier suggestions for these devices&lt;br /&gt;
// Allowed fields: &amp;quot;Mobile&amp;quot;, &amp;quot;Tablet&amp;quot;, &amp;quot;Desktop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var suggestAdSchedules = true;&lt;br /&gt;
// If true, the script will suggest hourly ad schedules, based on conversion rate.&lt;br /&gt;
&lt;br /&gt;
var suggestDeviceBidModifiers = true;&lt;br /&gt;
// If true, the script will suggest bid modifiers for the devices specified above,&lt;br /&gt;
// based on the devices' conversion rates.&lt;br /&gt;
&lt;br /&gt;
var baseDeviceModifiersOnBiddingMultiplier = true;&lt;br /&gt;
// If true, then the device bid modifiers given will be adjusted to take into&lt;br /&gt;
// account the suggested ad schedules.&lt;br /&gt;
// For example suppose that at a certain hour device bids should be increased by&lt;br /&gt;
// 30%, and the suggested ad schedule for that hour is 10%.&lt;br /&gt;
// If this is false, the the device modifier will be given as 30%.&lt;br /&gt;
// If this is true, then the device modifier will be given as 18%, because when&lt;br /&gt;
// this and the 10% ad schedules are applied this increases the bid by 30%.&lt;br /&gt;
&lt;br /&gt;
var campaignNameDoesNotContain = [];&lt;br /&gt;
// Use this if you want to exclude some campaigns.&lt;br /&gt;
// For example [&amp;quot;Display&amp;quot;] would ignore any campaigns with 'Display' in the name,&lt;br /&gt;
// while [&amp;quot;Display&amp;quot;,&amp;quot;Competitors&amp;quot;] would ignore any campaigns with 'display' or&lt;br /&gt;
// 'competitors' in the name. Case insensitive.&lt;br /&gt;
// Leave as [] to not exclude any campaigns.&lt;br /&gt;
&lt;br /&gt;
var campaignNameContains = [];&lt;br /&gt;
// Use this if you only want to look at some campaigns.&lt;br /&gt;
// For example [&amp;quot;Brand&amp;quot;] would only look at campaigns with 'Brand' in the name,&lt;br /&gt;
// while [&amp;quot;Brand&amp;quot;,&amp;quot;Generic&amp;quot;] would only look at campaigns with 'brand' or 'generic'&lt;br /&gt;
// in the name. Case insensitive.&lt;br /&gt;
// Leave as [] to include all campaigns.&lt;br /&gt;
&lt;br /&gt;
var ignorePausedCampaigns = true;&lt;br /&gt;
// Set this to true to only look at currently active campaigns.&lt;br /&gt;
// Set to false to include campaigns that had impressions but are currently paused.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Advanced settings.&lt;br /&gt;
&lt;br /&gt;
var smoothingWindow = [-2,   -1,   0,   1,    2   ];&lt;br /&gt;
var smoothingWeight = [0.25, 0.75, 1,   0.75, 0.25];&lt;br /&gt;
// The weights used for smoothing.&lt;br /&gt;
// The smoothingWindow gives the relative hour (eg 0 means the current hour,&lt;br /&gt;
// -2 means 2 hours before the current hour) and the smoothingWeight gives the&lt;br /&gt;
// weighting for that hour.&lt;br /&gt;
&lt;br /&gt;
var minBidMultiplierSuggestion = -0.35;&lt;br /&gt;
var maxBidMultiplierSuggestion = 0.35;&lt;br /&gt;
// The minimum and maximum for the suggested bidding multipliers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
function main() {&lt;br /&gt;
  &lt;br /&gt;
  // Check the spreadsheet works.&lt;br /&gt;
  var spreadsheet = checkSpreadsheet(spreadsheetUrl, &amp;quot;the spreadsheet&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Check the field names are correct, and get a list with the correct capitalisation&lt;br /&gt;
  var allowedFields = [&amp;quot;Conversions&amp;quot;, &amp;quot;ConversionValue&amp;quot;, &amp;quot;Impressions&amp;quot;, &amp;quot;Clicks&amp;quot;, &amp;quot;Cost&amp;quot;];&lt;br /&gt;
  var fieldsToCheck = [];&lt;br /&gt;
  for (var i=0; i&amp;lt;calculatedFields.length; i++) {&lt;br /&gt;
    if (calculatedFields[i].indexOf(&amp;quot;/&amp;quot;) === -1) {&lt;br /&gt;
      throw &amp;quot;Calculated Field &amp;quot; + calculatedFields[i] + &amp;quot; does not contain '/'&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    var components = calculatedFields[i].split(&amp;quot;/&amp;quot;);&lt;br /&gt;
    fieldsToCheck = fieldsToCheck.concat(components);&lt;br /&gt;
    calculatedFields[i] = checkFieldNames(allowedFields, components, &amp;quot;calculatedFields&amp;quot;, false);&lt;br /&gt;
  }&lt;br /&gt;
  var fieldsToCheck = fieldsToCheck.concat(fields);&lt;br /&gt;
  if (suggestAdSchedules || suggestDeviceBidModifiers) {&lt;br /&gt;
    var fieldsToCheck = fieldsToCheck.concat([&amp;quot;Clicks&amp;quot;, &amp;quot;Conversions&amp;quot;]);&lt;br /&gt;
  }&lt;br /&gt;
  var allFields = checkFieldNames(allowedFields, fieldsToCheck, &amp;quot;fields&amp;quot;, true);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Check there are date ranges and fields&lt;br /&gt;
  // - otherwise there'd be no data to put into heat maps&lt;br /&gt;
  if (dateRanges.length == 0) {&lt;br /&gt;
    throw &amp;quot;No date ranges given.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  if (allFields.length == 0) {&lt;br /&gt;
    throw &amp;quot;No fields were specified.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Check the device names are correct, and make WHERE statements for them&lt;br /&gt;
  var allowedDevices = [&amp;quot;Mobile&amp;quot;, &amp;quot;Tablet&amp;quot;, &amp;quot;Desktop&amp;quot;];&lt;br /&gt;
  devices = checkFieldNames(allowedDevices, devices, &amp;quot;devices&amp;quot;, true);&lt;br /&gt;
  var whereStatements = [&amp;quot;&amp;quot;]; // The blank one is for all devices&lt;br /&gt;
  for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
    if (devices[i] == &amp;quot;Mobile&amp;quot;) {&lt;br /&gt;
      whereStatements.push(&amp;quot;AND Device = HIGH_END_MOBILE &amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
       whereStatements.push(&amp;quot;AND Device = &amp;quot; + devices[i].toUpperCase() + &amp;quot; &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var dayNames = [&amp;quot;Monday&amp;quot;,&amp;quot;Tuesday&amp;quot;,&amp;quot;Wednesday&amp;quot;,&amp;quot;Thursday&amp;quot;,&amp;quot;Friday&amp;quot;,&amp;quot;Saturday&amp;quot;,&amp;quot;Sunday&amp;quot;];&lt;br /&gt;
  var dailyData = {}&lt;br /&gt;
  var numberDays = {};&lt;br /&gt;
  var smoothedData = {};&lt;br /&gt;
  &lt;br /&gt;
  var fieldsIncDevice = allFields.slice();&lt;br /&gt;
  for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
    fieldsIncDevice = fieldsIncDevice.concat(allFields.map(function (a) {return devices[i] + a;}));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Initialise data&lt;br /&gt;
  for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
    smoothedData[dayNames[d]] = {};&lt;br /&gt;
    numberDays[dayNames[d]] = 0;&lt;br /&gt;
    smoothedData[dayNames[d]] = {};&lt;br /&gt;
    &lt;br /&gt;
    for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
      smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;] = {};&lt;br /&gt;
      for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
        smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Get all the campaign IDs (based on campaignNameDoesNotContain, campaignNameContains&lt;br /&gt;
  // and ignorePausedCampaigns options).&lt;br /&gt;
  var campaignIds = getCampaignIds();&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Construct the reports&lt;br /&gt;
  for (var d=0; d&amp;lt;dateRanges.length; d++) {&lt;br /&gt;
    for (var i=0; i&amp;lt;whereStatements.length; i++) {&lt;br /&gt;
      &lt;br /&gt;
      if (i == 0) {&lt;br /&gt;
        var fieldNames = allFields;&lt;br /&gt;
      } else {&lt;br /&gt;
        var fieldNames = allFields.map(function (a) {return devices[i-1] + a;});&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      var report = AdWordsApp.report(&amp;quot;SELECT DayOfWeek, Date, HourOfDay, &amp;quot; + allFields.join(&amp;quot;, &amp;quot;) + &amp;quot; &amp;quot; +&lt;br /&gt;
        &amp;quot;FROM CAMPAIGN_PERFORMANCE_REPORT &amp;quot; +&lt;br /&gt;
          &amp;quot;WHERE CampaignId IN [&amp;quot; + campaignIds.join(&amp;quot;,&amp;quot;) + &amp;quot;] &amp;quot; +&lt;br /&gt;
            whereStatements[i] +&lt;br /&gt;
              &amp;quot;DURING &amp;quot; + dateRanges[d].replace(/-/g,&amp;quot;&amp;quot;)&lt;br /&gt;
              );&lt;br /&gt;
      &lt;br /&gt;
      var rows = report.rows();&lt;br /&gt;
      while (rows.hasNext()) {&lt;br /&gt;
        var row = rows.next();&lt;br /&gt;
        if (ignoreDates.indexOf(row[&amp;quot;Date&amp;quot;]) &amp;gt; -1) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (dailyData[row[&amp;quot;Date&amp;quot;]] == undefined) {&lt;br /&gt;
          dailyData[row[&amp;quot;Date&amp;quot;]] = {};&lt;br /&gt;
          dailyData[row[&amp;quot;Date&amp;quot;]][&amp;quot;Day&amp;quot;] = row[&amp;quot;DayOfWeek&amp;quot;];&lt;br /&gt;
          for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
            dailyData[row[&amp;quot;Date&amp;quot;]][h+&amp;quot;&amp;quot;] = {};&lt;br /&gt;
            for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
              dailyData[row[&amp;quot;Date&amp;quot;]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]] = 0;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        for (var f=0; f&amp;lt;allFields.length; f++) {&lt;br /&gt;
          dailyData[row[&amp;quot;Date&amp;quot;]][row[&amp;quot;HourOfDay&amp;quot;]][fieldNames[f]] += parseInt(row[allFields[f]].replace(/,/g,&amp;quot;&amp;quot;),10);&lt;br /&gt;
        }&lt;br /&gt;
      } // end while&lt;br /&gt;
      &lt;br /&gt;
    }// end for whereStatements&lt;br /&gt;
  }// end for dateRanges&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Daily data is smoothed and totalled for each day of week&lt;br /&gt;
  for (var date in dailyData) {&lt;br /&gt;
    var day = dailyData[date][&amp;quot;Day&amp;quot;];&lt;br /&gt;
    numberDays[day]++;&lt;br /&gt;
    &lt;br /&gt;
    var dateBits = date.split(&amp;quot;-&amp;quot;);&lt;br /&gt;
    var yesterday = new Date(dateBits[0],parseInt(dateBits[1],10)-1,parseInt(dateBits[2],10)-1);&lt;br /&gt;
    var tomorrow = new Date(dateBits[0],parseInt(dateBits[1],10)-1,parseInt(dateBits[2],10)+1);&lt;br /&gt;
    yesterday = Utilities.formatDate(yesterday, &amp;quot;UTC&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
    tomorrow = Utilities.formatDate(tomorrow, &amp;quot;UTC&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
      for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
        var totalWeight = 0;&lt;br /&gt;
        var smoothedTotal = 0;&lt;br /&gt;
        &lt;br /&gt;
        for (var w=0; w&amp;lt;smoothingWindow.length; w++) {&lt;br /&gt;
          if (h + smoothingWindow[w] &amp;lt; 0) {&lt;br /&gt;
            if (dailyData[yesterday] != undefined) {&lt;br /&gt;
              totalWeight += smoothingWeight[w];&lt;br /&gt;
              smoothedTotal += smoothingWeight[w] * dailyData[yesterday][(h + smoothingWindow[w] + 24)][fieldsIncDevice[f]];&lt;br /&gt;
            }&lt;br /&gt;
          } else if (h + smoothingWindow[w] &amp;gt; 23) {&lt;br /&gt;
            if (dailyData[tomorrow] != undefined) {&lt;br /&gt;
              totalWeight += smoothingWeight[w];&lt;br /&gt;
              smoothedTotal += smoothingWeight[w] * dailyData[tomorrow][(h + smoothingWindow[w] - 24)][fieldsIncDevice[f]];&lt;br /&gt;
            }&lt;br /&gt;
          } else {&lt;br /&gt;
            totalWeight += smoothingWeight[w];&lt;br /&gt;
            smoothedTotal += smoothingWeight[w] * dailyData[date][(h + smoothingWindow[w])][fieldsIncDevice[f]];&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        if (totalWeight != 0) {&lt;br /&gt;
          smoothedData[day][h][fieldsIncDevice[f]] += smoothedTotal / totalWeight;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  } // end for dailyData&lt;br /&gt;
  Logger.log(&amp;quot;Collected daily data.&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Calculate the averages from the smoothed data&lt;br /&gt;
  var hourlyAvg = {};&lt;br /&gt;
  var totalConversions = 0;&lt;br /&gt;
  var totalClicks = 0;&lt;br /&gt;
  var deviceClicks = {};&lt;br /&gt;
  var deviceConversions = {};&lt;br /&gt;
  for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
    deviceClicks[devices[i]] = 0;&lt;br /&gt;
    deviceConversions[devices[i]] = 0;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
    hourlyAvg[dayNames[d]] = {};&lt;br /&gt;
    for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
      hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;] = {}&lt;br /&gt;
      &lt;br /&gt;
      if (numberDays[dayNames[d]] == 0) {&lt;br /&gt;
        for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]] = &amp;quot;-&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
        hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]] = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]]/numberDays[dayNames[d]];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      for (var c=0; c&amp;lt;calculatedFields.length; c++) {&lt;br /&gt;
        &lt;br /&gt;
        var multiplier = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][calculatedFields[c][0]];&lt;br /&gt;
        var divisor = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][calculatedFields[c][1]];&lt;br /&gt;
        &lt;br /&gt;
        if (divisor == 0 || divisor == &amp;quot;-&amp;quot; || multiplier == &amp;quot;-&amp;quot;) {&lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][calculatedFields[c].join(&amp;quot;/&amp;quot;)] = &amp;quot;-&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][calculatedFields[c].join(&amp;quot;/&amp;quot;)] = multiplier / divisor;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
          var multiplier = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+calculatedFields[c][0]];&lt;br /&gt;
          var divisor = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+calculatedFields[c][1]];&lt;br /&gt;
          &lt;br /&gt;
          if (divisor == 0 || divisor == &amp;quot;-&amp;quot; || multiplier == &amp;quot;-&amp;quot;) {&lt;br /&gt;
            hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+calculatedFields[c].join(&amp;quot;/&amp;quot;)] = &amp;quot;-&amp;quot;;&lt;br /&gt;
          } else {&lt;br /&gt;
            hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+calculatedFields[c].join(&amp;quot;/&amp;quot;)] = multiplier / divisor;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      // Add up the clicks and conversions, for generating the suggested ad schedules&lt;br /&gt;
      if (suggestAdSchedules || suggestDeviceBidModifiers) {&lt;br /&gt;
        totalConversions += smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Conversions&amp;quot;];&lt;br /&gt;
        totalClicks += smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Clicks&amp;quot;];&lt;br /&gt;
        if (suggestDeviceBidModifiers) {&lt;br /&gt;
          for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
            deviceClicks[devices[i]] += smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+&amp;quot;Clicks&amp;quot;];&lt;br /&gt;
            deviceConversions[devices[i]] += smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+&amp;quot;Conversions&amp;quot;];&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Calculate suggested ad schedules based on the average conversion rate&lt;br /&gt;
  if (suggestAdSchedules || suggestDeviceBidModifiers) {&lt;br /&gt;
    if (totalClicks == 0) {&lt;br /&gt;
      var meanConvRate = 0;&lt;br /&gt;
    } else {&lt;br /&gt;
      var meanConvRate = totalConversions / totalClicks;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
      for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
        if (meanConvRate == 0 || smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Clicks&amp;quot;] == 0) {&lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;AdSchedules&amp;quot;] = &amp;quot;-&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
          var convRate = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Conversions&amp;quot;] / smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Clicks&amp;quot;];&lt;br /&gt;
          &lt;br /&gt;
          // The suggested multiplier is generated from the mean.&lt;br /&gt;
          // It is dampened by taking the square root.&lt;br /&gt;
          var multiplier = Math.sqrt(convRate/meanConvRate)-1;&lt;br /&gt;
          &lt;br /&gt;
          if (multiplier &amp;gt; maxBidMultiplierSuggestion) {&lt;br /&gt;
            multiplier = maxBidMultiplierSuggestion;&lt;br /&gt;
          } else if (multiplier &amp;lt; minBidMultiplierSuggestion) {&lt;br /&gt;
            multiplier = minBidMultiplierSuggestion;&lt;br /&gt;
          } &lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;AdSchedules&amp;quot;] = multiplier;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Device level bid modifiers&lt;br /&gt;
    if (suggestDeviceBidModifiers) {&lt;br /&gt;
      var deviceConvRate = {};&lt;br /&gt;
      for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
        if (deviceClicks[devices[i]] == 0) {&lt;br /&gt;
          deviceConvRate[devices[i]] = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
          deviceConvRate[devices[i]] = deviceConversions[devices[i]] / deviceClicks[devices[i]];&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
        for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
          for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
            if (hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;AdSchedules&amp;quot;] == &amp;quot;-&amp;quot; || deviceConvRate[i] == 0 || smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;Clicks&amp;quot;] == 0) {&lt;br /&gt;
              hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;BidModifiers&amp;quot;] = &amp;quot;-&amp;quot;;&lt;br /&gt;
            } else {&lt;br /&gt;
              var convRate = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;Conversions&amp;quot;] / smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;Clicks&amp;quot;];&lt;br /&gt;
              &lt;br /&gt;
              // We calculate the multiplier we want to end up with&lt;br /&gt;
              var endMultiplier = Math.sqrt(convRate/deviceConvRate[devices[i]])-1;&lt;br /&gt;
              &lt;br /&gt;
              if (baseDeviceModifiersOnBiddingMultiplier) {&lt;br /&gt;
                // The bid modifier is calculated so that if the bidding multiplier is set up as an&lt;br /&gt;
                // ad schedule, this is the correct device bid modifier to get the desired multiplier&lt;br /&gt;
                var modifier = ((1+endMultiplier)/(1+hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;AdSchedules&amp;quot;])) - 1;&lt;br /&gt;
              } else {&lt;br /&gt;
                var modifier = endMultiplier;&lt;br /&gt;
              }&lt;br /&gt;
              &lt;br /&gt;
              if (modifier &amp;gt; maxBidMultiplierSuggestion) {&lt;br /&gt;
                modifier = maxBidMultiplierSuggestion;&lt;br /&gt;
              } else if (modifier &amp;lt; minBidMultiplierSuggestion) {&lt;br /&gt;
                modifier = minBidMultiplierSuggestion;&lt;br /&gt;
              }&lt;br /&gt;
              hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;BidModifiers&amp;quot;] = modifier;&lt;br /&gt;
            }&lt;br /&gt;
          } &lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
  } // end if suggestAdSchedules or suggestDeviceBidModifiers&lt;br /&gt;
  Logger.log(&amp;quot;Averaged and smoothed data.&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Make the heat maps on the spreadsheet&lt;br /&gt;
  var sheet0 = spreadsheet.getSheets()[0];&lt;br /&gt;
  var calculatedFieldNames = calculatedFields.map(function (arr){return arr.join(&amp;quot;/&amp;quot;)});&lt;br /&gt;
  var baseFields = checkFieldNames(allowedFields, fields, &amp;quot;&amp;quot;, true).concat(calculatedFieldNames);&lt;br /&gt;
  var allFieldNames = baseFields.slice();&lt;br /&gt;
  for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
    allFieldNames = allFieldNames.concat(baseFields.map(function (a) {return devices[i] + a;}));&lt;br /&gt;
  }&lt;br /&gt;
  if (suggestAdSchedules) {&lt;br /&gt;
    allFieldNames.push(&amp;quot;AdSchedules&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  if (suggestDeviceBidModifiers) {&lt;br /&gt;
    for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
      allFieldNames.push(devices[i] + &amp;quot;BidModifiers&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (sheet0.getName() == &amp;quot;Template&amp;quot;) {&lt;br /&gt;
    sheet0.setName(allFieldNames[0].replace(/[A-Z\/]/g, function (x){return &amp;quot; &amp;quot; + x;}).trim());&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (var f=0; f&amp;lt;allFieldNames.length; f++) {&lt;br /&gt;
    var fieldName = allFieldNames[f].replace(/[A-Z\/]/g, function (x){return &amp;quot; &amp;quot; + x;}).trim();&lt;br /&gt;
    var sheet = spreadsheet.getSheetByName(fieldName);&lt;br /&gt;
    if (sheet == null) {&lt;br /&gt;
      sheet = sheet0.copyTo(spreadsheet);&lt;br /&gt;
      sheet.setName(fieldName);&lt;br /&gt;
    }&lt;br /&gt;
    sheet.getRange(1, 1).setValue(fieldName);&lt;br /&gt;
    &lt;br /&gt;
    //Post the heat map data&lt;br /&gt;
    var sheetData = [];&lt;br /&gt;
    sheetData.push([&amp;quot;&amp;quot;].concat(dayNames)); // The header&lt;br /&gt;
    var totalValue = 0;&lt;br /&gt;
    for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
      var rowData = [h];&lt;br /&gt;
      for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
        if (hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][allFieldNames[f]] == undefined) {&lt;br /&gt;
          rowData.push(&amp;quot;-&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
          rowData.push(hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][allFieldNames[f]]);&lt;br /&gt;
        }&lt;br /&gt;
        totalValue += hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][allFieldNames[f]];&lt;br /&gt;
      }&lt;br /&gt;
      sheetData.push(rowData);&lt;br /&gt;
    }&lt;br /&gt;
    sheet.getRange(3, 1, sheetData.length, sheetData[0].length).setValues(sheetData);&lt;br /&gt;
    &lt;br /&gt;
    // Work out which format to use and format the numbers in the heat map&lt;br /&gt;
    var averageValue = totalValue / (24*7);&lt;br /&gt;
    if (averageValue &amp;lt; 50) {&lt;br /&gt;
      var format = &amp;quot;#,##0.0&amp;quot;;&lt;br /&gt;
    } else {&lt;br /&gt;
      var format = &amp;quot;#,###,##0&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (allFieldNames[f].indexOf(&amp;quot;/&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
      var components = allFieldNames[f].split(&amp;quot;/&amp;quot;);&lt;br /&gt;
      var multiplierIsMoney = (components[0] == &amp;quot;Cost&amp;quot; || components[0] == &amp;quot;ConversionValue&amp;quot;);&lt;br /&gt;
      var divisorIsMoney = (components[1] == &amp;quot;Cost&amp;quot; || components[1] == &amp;quot;ConversionValue&amp;quot;);&lt;br /&gt;
      if ((!multiplierIsMoney &amp;amp;&amp;amp; !divisorIsMoney) || (multiplierIsMoney &amp;amp;&amp;amp; divisorIsMoney)) {&lt;br /&gt;
        // If neither component is monetary, or both components are, then the result is a percentage&lt;br /&gt;
        format = &amp;quot;#,##0.00%&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (allFieldNames[f] == &amp;quot;AdSchedules&amp;quot; || allFieldNames[f].substr(-12) == &amp;quot;BidModifiers&amp;quot;) {&lt;br /&gt;
      format = &amp;quot;#,##0.00%&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    sheet.getRange(4, 2, sheetData.length, sheetData[0].length).setNumberFormat(format);&lt;br /&gt;
    &lt;br /&gt;
    // Update the chart title&lt;br /&gt;
    var charts = sheet.getCharts();&lt;br /&gt;
    if (sheet.getCharts().length === 0) {&lt;br /&gt;
      Logger.log(&amp;quot;Warning: chart missing from the &amp;quot; + fieldName + &amp;quot; sheet.&amp;quot;); &lt;br /&gt;
    } else {&lt;br /&gt;
      var chart = charts[0];&lt;br /&gt;
      chart = chart.modify().setOption('title', fieldName).build();&lt;br /&gt;
      sheet.updateChart(chart);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Logger.log(&amp;quot;Posted data to spreadsheet.&amp;quot;);&lt;br /&gt;
  Logger.log(&amp;quot;Finished.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Check the spreadsheet URL has been entered, and that it works&lt;br /&gt;
function checkSpreadsheet(spreadsheetUrl, spreadsheetName) {&lt;br /&gt;
  if (spreadsheetUrl.replace(/[AEIOU]/g,&amp;quot;X&amp;quot;) == &amp;quot;https://docs.google.com/YXXR-SPRXXDSHXXT-XRL-HXRX&amp;quot;) {&lt;br /&gt;
    throw(&amp;quot;Problem with &amp;quot; + spreadsheetName + &amp;quot; URL: make sure you've replaced the default with a valid spreadsheet URL.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  try {&lt;br /&gt;
    var spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);&lt;br /&gt;
    &lt;br /&gt;
    // Checks if you can edit the spreadsheet&lt;br /&gt;
    var sheet = spreadsheet.getSheets()[0];&lt;br /&gt;
    var sheetName = sheet.getName();&lt;br /&gt;
    sheet.setName(sheetName);&lt;br /&gt;
    &lt;br /&gt;
    return spreadsheet;&lt;br /&gt;
  } catch (e) {&lt;br /&gt;
    throw(&amp;quot;Problem with &amp;quot; + spreadsheetName + &amp;quot; URL: '&amp;quot; + e + &amp;quot;'&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Get the IDs of campaigns which match the given options&lt;br /&gt;
function getCampaignIds() {&lt;br /&gt;
  var whereStatement = &amp;quot;WHERE &amp;quot;;&lt;br /&gt;
  var whereStatementsArray = [];&lt;br /&gt;
  var campaignIds = [];&lt;br /&gt;
  &lt;br /&gt;
  if (ignorePausedCampaigns) {&lt;br /&gt;
    whereStatement += &amp;quot;CampaignStatus = ENABLED &amp;quot;;&lt;br /&gt;
  } else {&lt;br /&gt;
    whereStatement += &amp;quot;CampaignStatus IN ['ENABLED','PAUSED'] &amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (var i=0; i&amp;lt;campaignNameDoesNotContain.length; i++) {&lt;br /&gt;
    whereStatement += &amp;quot;AND CampaignName DOES_NOT_CONTAIN_IGNORE_CASE '&amp;quot; + campaignNameDoesNotContain[i].replace(/&amp;quot;/g,'\\\&amp;quot;') + &amp;quot;' &amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (campaignNameContains.length == 0) {&lt;br /&gt;
    whereStatementsArray = [whereStatement];&lt;br /&gt;
  } else {&lt;br /&gt;
    for (var i=0; i&amp;lt;campaignNameContains.length; i++) {&lt;br /&gt;
      whereStatementsArray.push(whereStatement + 'AND CampaignName CONTAINS_IGNORE_CASE &amp;quot;' + campaignNameContains[i].replace(/&amp;quot;/g,'\\\&amp;quot;') + '&amp;quot; ');&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (var i=0; i&amp;lt;whereStatementsArray.length; i++) {&lt;br /&gt;
    var report = AdWordsApp.report(&lt;br /&gt;
      &amp;quot;SELECT CampaignId &amp;quot; +&lt;br /&gt;
      &amp;quot;FROM   CAMPAIGN_PERFORMANCE_REPORT &amp;quot; +&lt;br /&gt;
      whereStatementsArray[i] +&lt;br /&gt;
      &amp;quot;DURING LAST_30_DAYS&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    var rows = report.rows();&lt;br /&gt;
    while (rows.hasNext()) {&lt;br /&gt;
      var row = rows.next();&lt;br /&gt;
      campaignIds.push(row['CampaignId']);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (campaignIds.length == 0) {&lt;br /&gt;
    throw(&amp;quot;No campaigns found with the given settings.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  return campaignIds;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Verify that all field names are valid, and return a list of them with the&lt;br /&gt;
// correct capitalisation. If deduplicate is true, the list is deduplicated&lt;br /&gt;
function checkFieldNames(allowedFields, givenFields, souceName, deduplicate) {&lt;br /&gt;
  var allowedFieldsLowerCase = allowedFields.map(function (str){return str.toLowerCase()});&lt;br /&gt;
  var wantedFields = [];&lt;br /&gt;
  var unrecognisedFields = [];&lt;br /&gt;
  for (var i=0; i&amp;lt;givenFields.length; i++) {&lt;br /&gt;
    var fieldIndex = allowedFieldsLowerCase.indexOf(givenFields[i].toLowerCase().replace(&amp;quot; &amp;quot;,&amp;quot;&amp;quot;).trim());&lt;br /&gt;
    if(fieldIndex === -1){&lt;br /&gt;
      unrecognisedFields.push(givenFields[i]);&lt;br /&gt;
    } else if(!deduplicate || wantedFields.indexOf(allowedFields[fieldIndex]) &amp;lt; 0) {&lt;br /&gt;
      wantedFields.push(allowedFields[fieldIndex]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (unrecognisedFields.length &amp;gt; 0) {&lt;br /&gt;
    throw unrecognisedFields.length + &amp;quot; field(s) not recognised in '&amp;quot; + souceName + &amp;quot;': '&amp;quot; + unrecognisedFields.join(&amp;quot;', '&amp;quot;) + &lt;br /&gt;
      &amp;quot;'. Please choose from '&amp;quot; + allowedFields.join(&amp;quot;', '&amp;quot;) + &amp;quot;'.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  return wantedFields;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A2%D0%B5%D0%BF%D0%BB%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=1887</id>
		<title>Тепловая карта для управления ставками</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A2%D0%B5%D0%BF%D0%BB%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=1887"/>
		<updated>2019-10-28T14:53:40Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт создает тепловые карты, которые представляют собой визуализированные данные аккаунта AdWords, с распределением кликов, показов, конверсий и других метрик по времени и устройствам.&lt;br /&gt;
&lt;br /&gt;
1. Cкопировать [https://drive.google.com/file/d/1LFHbhgAKCRbvr5vTMI67qhsgIw0axfdK/view?usp=sharing шаблон] тепловой карты на свой Google Диск.&lt;br /&gt;
&lt;br /&gt;
2. Перейти в аккаунт Google AdWords на вкладку &amp;quot;Скрипты&amp;quot;. Добавить код, приведенный ниже&lt;br /&gt;
&lt;br /&gt;
3. Настроить скрипт&lt;br /&gt;
&lt;br /&gt;
'''spreadsheetUrl''' — это адрес документа с шаблоном тепловой карты;&lt;br /&gt;
&lt;br /&gt;
'''dateRanges''' - отображает период, за который нужно получить данные. Каждый диапазон дат использует формат «гггг-мм-дд,гггг-мм-дд», например [«2018-05-01,2018-07-31»]. Также можно указать несколько диапазонов дат, достаточно разделить их запятыми, например [«2018-05-01,2018-06-30», «2018-08-01,2018-09-30»];&lt;br /&gt;
&lt;br /&gt;
'''ignoreDates''' - используется, когда необходимо исключить данные определенных дней. Это список дат, разделенных запятыми, в формате «гггг-мм-дд». Например, с помощью [&amp;quot;2018-03-08&amp;quot;,&amp;quot;2018-05-01«] исключены праздники 8 марта и 1 мая;&lt;br /&gt;
&lt;br /&gt;
'''fields''' — в этом поле нужно добавить показатели, для которых будут созданы тепловые карты. Поместите их в кавычки, разделенные запятыми;&lt;br /&gt;
&lt;br /&gt;
'''calculateFields''' — это метрики, которые должны рассчитываться из показателей fields. Например [«Clicks/Impressions», «Conversions/Clicks»]. Первое — CTR, второе — коэффициент конверсии;&lt;br /&gt;
&lt;br /&gt;
'''devices''' — позволяет разделить тепловые карты по типам устройств, можно указать desktop, mobile, tablet. Если нужен только общий трафик, оставьте это поле пустым;&lt;br /&gt;
&lt;br /&gt;
'''campaignNameContains''' и '''campaignNameDoesNotContain''' — фильтр для определенных кампаний. Если нужно проанализировать определенные кампании, добавьте их название в первое поле. Во втором добавьте те кампании, данные которых нужно исключить из тепловой карты. Оставьте поле пустым, чтобы данные всех кампаний были внесены в таблицу;&lt;br /&gt;
&lt;br /&gt;
'''ignorePausedCampaigns''' — игнорирует приостановленные кампании. Установить значение «true», если нужно посмотреть данные только активных кампаний, или «false», чтобы включить в карту приостановленные кампании.&lt;br /&gt;
&lt;br /&gt;
Важно! Удаленные кампании всегда игнорируются и не учитываются в картах.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*&lt;br /&gt;
* Heat Map Creation Tool - with Devices&lt;br /&gt;
*&lt;br /&gt;
* This script calculates the smoothed average performance of each hour of each day&lt;br /&gt;
* of the week, and outputs this into a heat map and graph in a Google Sheet. This&lt;br /&gt;
* can be done for all data and for device data. It also suggests ad schedules and&lt;br /&gt;
* device bid adjustments based on conversion rates.&lt;br /&gt;
*&lt;br /&gt;
* Version: 2.0&lt;br /&gt;
* Google AdWords Script maintained on brainlabsdigital.com&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Options &lt;br /&gt;
&lt;br /&gt;
var spreadsheetUrl = &amp;quot;https://docs.google.com/YOUR-SPREADSHEET-URL-HERE&amp;quot;;&lt;br /&gt;
// The URL of the Google Doc the results will be put into.&lt;br /&gt;
// so you have the correct formatting and charts set up.&lt;br /&gt;
&lt;br /&gt;
var dateRanges = [&amp;quot;2016-09-01,2016-10-31&amp;quot;];&lt;br /&gt;
// The start and end date of the date range for your data&lt;br /&gt;
// You can have multiple ranges, eg [&amp;quot;2016-06-01,2016-07-31&amp;quot;,&amp;quot;2016-09-01,2016-10-31&amp;quot;]&lt;br /&gt;
// would get data from June, July, September and October 2015.&lt;br /&gt;
// Format for each range is &amp;quot;yyyy-mm-dd,yyyy-mm-dd&amp;quot; (where the first date is the&lt;br /&gt;
// start of the range and the second is the end).&lt;br /&gt;
&lt;br /&gt;
var ignoreDates = [];&lt;br /&gt;
// List any single days that are within your date range but whose data you do not&lt;br /&gt;
// want to use in calculations, for instance if they had atypical performance or&lt;br /&gt;
// there were technical issues with your site.&lt;br /&gt;
// eg [&amp;quot;2016-02-14&amp;quot;,&amp;quot;2016-03-27&amp;quot;] would mean data from Valentine's Day and Easter&lt;br /&gt;
// 2016 would be ignored.&lt;br /&gt;
// Format for each day is &amp;quot;yyyy-mm-dd&amp;quot;&lt;br /&gt;
// Leave as [] if unwanted.&lt;br /&gt;
&lt;br /&gt;
var fields = [&amp;quot;Impressions&amp;quot;, &amp;quot;Clicks&amp;quot;, &amp;quot;Conversions&amp;quot;];&lt;br /&gt;
// Make heat maps of these fields.&lt;br /&gt;
// Allowed values: &amp;quot;Impressions&amp;quot;, &amp;quot;Clicks&amp;quot;, &amp;quot;Cost&amp;quot;, &amp;quot;Conversions&amp;quot;,&lt;br /&gt;
// &amp;quot;ConversionValue&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var calculatedFields = [&amp;quot;Clicks/Impressions&amp;quot;,&amp;quot;Conversions/Clicks&amp;quot;];&lt;br /&gt;
// Make heat maps of a stat calculated by dividing one field by another. &lt;br /&gt;
// For example &amp;quot;Clicks/Impressions&amp;quot; will give the average clicks divided by the&lt;br /&gt;
// average impressions (ie the CTR).&lt;br /&gt;
// Allowed fields: &amp;quot;Impressions&amp;quot;, &amp;quot;Clicks&amp;quot;, &amp;quot;Cost&amp;quot;, &amp;quot;Conversions&amp;quot;,&lt;br /&gt;
// &amp;quot;ConversionValue&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var devices = [&amp;quot;Mobile&amp;quot;];&lt;br /&gt;
// Make heat maps and bid modifier suggestions for these devices&lt;br /&gt;
// Allowed fields: &amp;quot;Mobile&amp;quot;, &amp;quot;Tablet&amp;quot;, &amp;quot;Desktop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var suggestAdSchedules = true;&lt;br /&gt;
// If true, the script will suggest hourly ad schedules, based on conversion rate.&lt;br /&gt;
&lt;br /&gt;
var suggestDeviceBidModifiers = true;&lt;br /&gt;
// If true, the script will suggest bid modifiers for the devices specified above,&lt;br /&gt;
// based on the devices' conversion rates.&lt;br /&gt;
&lt;br /&gt;
var baseDeviceModifiersOnBiddingMultiplier = true;&lt;br /&gt;
// If true, then the device bid modifiers given will be adjusted to take into&lt;br /&gt;
// account the suggested ad schedules.&lt;br /&gt;
// For example suppose that at a certain hour device bids should be increased by&lt;br /&gt;
// 30%, and the suggested ad schedule for that hour is 10%.&lt;br /&gt;
// If this is false, the the device modifier will be given as 30%.&lt;br /&gt;
// If this is true, then the device modifier will be given as 18%, because when&lt;br /&gt;
// this and the 10% ad schedules are applied this increases the bid by 30%.&lt;br /&gt;
&lt;br /&gt;
var campaignNameDoesNotContain = [];&lt;br /&gt;
// Use this if you want to exclude some campaigns.&lt;br /&gt;
// For example [&amp;quot;Display&amp;quot;] would ignore any campaigns with 'Display' in the name,&lt;br /&gt;
// while [&amp;quot;Display&amp;quot;,&amp;quot;Competitors&amp;quot;] would ignore any campaigns with 'display' or&lt;br /&gt;
// 'competitors' in the name. Case insensitive.&lt;br /&gt;
// Leave as [] to not exclude any campaigns.&lt;br /&gt;
&lt;br /&gt;
var campaignNameContains = [];&lt;br /&gt;
// Use this if you only want to look at some campaigns.&lt;br /&gt;
// For example [&amp;quot;Brand&amp;quot;] would only look at campaigns with 'Brand' in the name,&lt;br /&gt;
// while [&amp;quot;Brand&amp;quot;,&amp;quot;Generic&amp;quot;] would only look at campaigns with 'brand' or 'generic'&lt;br /&gt;
// in the name. Case insensitive.&lt;br /&gt;
// Leave as [] to include all campaigns.&lt;br /&gt;
&lt;br /&gt;
var ignorePausedCampaigns = true;&lt;br /&gt;
// Set this to true to only look at currently active campaigns.&lt;br /&gt;
// Set to false to include campaigns that had impressions but are currently paused.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Advanced settings.&lt;br /&gt;
&lt;br /&gt;
var smoothingWindow = [-2,   -1,   0,   1,    2   ];&lt;br /&gt;
var smoothingWeight = [0.25, 0.75, 1,   0.75, 0.25];&lt;br /&gt;
// The weights used for smoothing.&lt;br /&gt;
// The smoothingWindow gives the relative hour (eg 0 means the current hour,&lt;br /&gt;
// -2 means 2 hours before the current hour) and the smoothingWeight gives the&lt;br /&gt;
// weighting for that hour.&lt;br /&gt;
&lt;br /&gt;
var minBidMultiplierSuggestion = -0.35;&lt;br /&gt;
var maxBidMultiplierSuggestion = 0.35;&lt;br /&gt;
// The minimum and maximum for the suggested bidding multipliers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
function main() {&lt;br /&gt;
  &lt;br /&gt;
  // Check the spreadsheet works.&lt;br /&gt;
  var spreadsheet = checkSpreadsheet(spreadsheetUrl, &amp;quot;the spreadsheet&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Check the field names are correct, and get a list with the correct capitalisation&lt;br /&gt;
  var allowedFields = [&amp;quot;Conversions&amp;quot;, &amp;quot;ConversionValue&amp;quot;, &amp;quot;Impressions&amp;quot;, &amp;quot;Clicks&amp;quot;, &amp;quot;Cost&amp;quot;];&lt;br /&gt;
  var fieldsToCheck = [];&lt;br /&gt;
  for (var i=0; i&amp;lt;calculatedFields.length; i++) {&lt;br /&gt;
    if (calculatedFields[i].indexOf(&amp;quot;/&amp;quot;) === -1) {&lt;br /&gt;
      throw &amp;quot;Calculated Field &amp;quot; + calculatedFields[i] + &amp;quot; does not contain '/'&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    var components = calculatedFields[i].split(&amp;quot;/&amp;quot;);&lt;br /&gt;
    fieldsToCheck = fieldsToCheck.concat(components);&lt;br /&gt;
    calculatedFields[i] = checkFieldNames(allowedFields, components, &amp;quot;calculatedFields&amp;quot;, false);&lt;br /&gt;
  }&lt;br /&gt;
  var fieldsToCheck = fieldsToCheck.concat(fields);&lt;br /&gt;
  if (suggestAdSchedules || suggestDeviceBidModifiers) {&lt;br /&gt;
    var fieldsToCheck = fieldsToCheck.concat([&amp;quot;Clicks&amp;quot;, &amp;quot;Conversions&amp;quot;]);&lt;br /&gt;
  }&lt;br /&gt;
  var allFields = checkFieldNames(allowedFields, fieldsToCheck, &amp;quot;fields&amp;quot;, true);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Check there are date ranges and fields&lt;br /&gt;
  // - otherwise there'd be no data to put into heat maps&lt;br /&gt;
  if (dateRanges.length == 0) {&lt;br /&gt;
    throw &amp;quot;No date ranges given.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  if (allFields.length == 0) {&lt;br /&gt;
    throw &amp;quot;No fields were specified.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Check the device names are correct, and make WHERE statements for them&lt;br /&gt;
  var allowedDevices = [&amp;quot;Mobile&amp;quot;, &amp;quot;Tablet&amp;quot;, &amp;quot;Desktop&amp;quot;];&lt;br /&gt;
  devices = checkFieldNames(allowedDevices, devices, &amp;quot;devices&amp;quot;, true);&lt;br /&gt;
  var whereStatements = [&amp;quot;&amp;quot;]; // The blank one is for all devices&lt;br /&gt;
  for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
    if (devices[i] == &amp;quot;Mobile&amp;quot;) {&lt;br /&gt;
      whereStatements.push(&amp;quot;AND Device = HIGH_END_MOBILE &amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
       whereStatements.push(&amp;quot;AND Device = &amp;quot; + devices[i].toUpperCase() + &amp;quot; &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var dayNames = [&amp;quot;Monday&amp;quot;,&amp;quot;Tuesday&amp;quot;,&amp;quot;Wednesday&amp;quot;,&amp;quot;Thursday&amp;quot;,&amp;quot;Friday&amp;quot;,&amp;quot;Saturday&amp;quot;,&amp;quot;Sunday&amp;quot;];&lt;br /&gt;
  var dailyData = {}&lt;br /&gt;
  var numberDays = {};&lt;br /&gt;
  var smoothedData = {};&lt;br /&gt;
  &lt;br /&gt;
  var fieldsIncDevice = allFields.slice();&lt;br /&gt;
  for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
    fieldsIncDevice = fieldsIncDevice.concat(allFields.map(function (a) {return devices[i] + a;}));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Initialise data&lt;br /&gt;
  for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
    smoothedData[dayNames[d]] = {};&lt;br /&gt;
    numberDays[dayNames[d]] = 0;&lt;br /&gt;
    smoothedData[dayNames[d]] = {};&lt;br /&gt;
    &lt;br /&gt;
    for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
      smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;] = {};&lt;br /&gt;
      for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
        smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]] = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Get all the campaign IDs (based on campaignNameDoesNotContain, campaignNameContains&lt;br /&gt;
  // and ignorePausedCampaigns options).&lt;br /&gt;
  var campaignIds = getCampaignIds();&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Construct the reports&lt;br /&gt;
  for (var d=0; d&amp;lt;dateRanges.length; d++) {&lt;br /&gt;
    for (var i=0; i&amp;lt;whereStatements.length; i++) {&lt;br /&gt;
      &lt;br /&gt;
      if (i == 0) {&lt;br /&gt;
        var fieldNames = allFields;&lt;br /&gt;
      } else {&lt;br /&gt;
        var fieldNames = allFields.map(function (a) {return devices[i-1] + a;});&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      var report = AdWordsApp.report(&amp;quot;SELECT DayOfWeek, Date, HourOfDay, &amp;quot; + allFields.join(&amp;quot;, &amp;quot;) + &amp;quot; &amp;quot; +&lt;br /&gt;
        &amp;quot;FROM CAMPAIGN_PERFORMANCE_REPORT &amp;quot; +&lt;br /&gt;
          &amp;quot;WHERE CampaignId IN [&amp;quot; + campaignIds.join(&amp;quot;,&amp;quot;) + &amp;quot;] &amp;quot; +&lt;br /&gt;
            whereStatements[i] +&lt;br /&gt;
              &amp;quot;DURING &amp;quot; + dateRanges[d].replace(/-/g,&amp;quot;&amp;quot;)&lt;br /&gt;
              );&lt;br /&gt;
      &lt;br /&gt;
      var rows = report.rows();&lt;br /&gt;
      while (rows.hasNext()) {&lt;br /&gt;
        var row = rows.next();&lt;br /&gt;
        if (ignoreDates.indexOf(row[&amp;quot;Date&amp;quot;]) &amp;gt; -1) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (dailyData[row[&amp;quot;Date&amp;quot;]] == undefined) {&lt;br /&gt;
          dailyData[row[&amp;quot;Date&amp;quot;]] = {};&lt;br /&gt;
          dailyData[row[&amp;quot;Date&amp;quot;]][&amp;quot;Day&amp;quot;] = row[&amp;quot;DayOfWeek&amp;quot;];&lt;br /&gt;
          for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
            dailyData[row[&amp;quot;Date&amp;quot;]][h+&amp;quot;&amp;quot;] = {};&lt;br /&gt;
            for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
              dailyData[row[&amp;quot;Date&amp;quot;]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]] = 0;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        for (var f=0; f&amp;lt;allFields.length; f++) {&lt;br /&gt;
          dailyData[row[&amp;quot;Date&amp;quot;]][row[&amp;quot;HourOfDay&amp;quot;]][fieldNames[f]] += parseInt(row[allFields[f]].replace(/,/g,&amp;quot;&amp;quot;),10);&lt;br /&gt;
        }&lt;br /&gt;
      } // end while&lt;br /&gt;
      &lt;br /&gt;
    }// end for whereStatements&lt;br /&gt;
  }// end for dateRanges&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Daily data is smoothed and totalled for each day of week&lt;br /&gt;
  for (var date in dailyData) {&lt;br /&gt;
    var day = dailyData[date][&amp;quot;Day&amp;quot;];&lt;br /&gt;
    numberDays[day]++;&lt;br /&gt;
    &lt;br /&gt;
    var dateBits = date.split(&amp;quot;-&amp;quot;);&lt;br /&gt;
    var yesterday = new Date(dateBits[0],parseInt(dateBits[1],10)-1,parseInt(dateBits[2],10)-1);&lt;br /&gt;
    var tomorrow = new Date(dateBits[0],parseInt(dateBits[1],10)-1,parseInt(dateBits[2],10)+1);&lt;br /&gt;
    yesterday = Utilities.formatDate(yesterday, &amp;quot;UTC&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
    tomorrow = Utilities.formatDate(tomorrow, &amp;quot;UTC&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
      for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
        var totalWeight = 0;&lt;br /&gt;
        var smoothedTotal = 0;&lt;br /&gt;
        &lt;br /&gt;
        for (var w=0; w&amp;lt;smoothingWindow.length; w++) {&lt;br /&gt;
          if (h + smoothingWindow[w] &amp;lt; 0) {&lt;br /&gt;
            if (dailyData[yesterday] != undefined) {&lt;br /&gt;
              totalWeight += smoothingWeight[w];&lt;br /&gt;
              smoothedTotal += smoothingWeight[w] * dailyData[yesterday][(h + smoothingWindow[w] + 24)][fieldsIncDevice[f]];&lt;br /&gt;
            }&lt;br /&gt;
          } else if (h + smoothingWindow[w] &amp;gt; 23) {&lt;br /&gt;
            if (dailyData[tomorrow] != undefined) {&lt;br /&gt;
              totalWeight += smoothingWeight[w];&lt;br /&gt;
              smoothedTotal += smoothingWeight[w] * dailyData[tomorrow][(h + smoothingWindow[w] - 24)][fieldsIncDevice[f]];&lt;br /&gt;
            }&lt;br /&gt;
          } else {&lt;br /&gt;
            totalWeight += smoothingWeight[w];&lt;br /&gt;
            smoothedTotal += smoothingWeight[w] * dailyData[date][(h + smoothingWindow[w])][fieldsIncDevice[f]];&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        if (totalWeight != 0) {&lt;br /&gt;
          smoothedData[day][h][fieldsIncDevice[f]] += smoothedTotal / totalWeight;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  } // end for dailyData&lt;br /&gt;
  Logger.log(&amp;quot;Collected daily data.&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Calculate the averages from the smoothed data&lt;br /&gt;
  var hourlyAvg = {};&lt;br /&gt;
  var totalConversions = 0;&lt;br /&gt;
  var totalClicks = 0;&lt;br /&gt;
  var deviceClicks = {};&lt;br /&gt;
  var deviceConversions = {};&lt;br /&gt;
  for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
    deviceClicks[devices[i]] = 0;&lt;br /&gt;
    deviceConversions[devices[i]] = 0;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
    hourlyAvg[dayNames[d]] = {};&lt;br /&gt;
    for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
      hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;] = {}&lt;br /&gt;
      &lt;br /&gt;
      if (numberDays[dayNames[d]] == 0) {&lt;br /&gt;
        for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]] = &amp;quot;-&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      for (var f=0; f&amp;lt;fieldsIncDevice.length; f++) {&lt;br /&gt;
        hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]] = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][fieldsIncDevice[f]]/numberDays[dayNames[d]];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      for (var c=0; c&amp;lt;calculatedFields.length; c++) {&lt;br /&gt;
        &lt;br /&gt;
        var multiplier = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][calculatedFields[c][0]];&lt;br /&gt;
        var divisor = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][calculatedFields[c][1]];&lt;br /&gt;
        &lt;br /&gt;
        if (divisor == 0 || divisor == &amp;quot;-&amp;quot; || multiplier == &amp;quot;-&amp;quot;) {&lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][calculatedFields[c].join(&amp;quot;/&amp;quot;)] = &amp;quot;-&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][calculatedFields[c].join(&amp;quot;/&amp;quot;)] = multiplier / divisor;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
          var multiplier = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+calculatedFields[c][0]];&lt;br /&gt;
          var divisor = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+calculatedFields[c][1]];&lt;br /&gt;
          &lt;br /&gt;
          if (divisor == 0 || divisor == &amp;quot;-&amp;quot; || multiplier == &amp;quot;-&amp;quot;) {&lt;br /&gt;
            hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+calculatedFields[c].join(&amp;quot;/&amp;quot;)] = &amp;quot;-&amp;quot;;&lt;br /&gt;
          } else {&lt;br /&gt;
            hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+calculatedFields[c].join(&amp;quot;/&amp;quot;)] = multiplier / divisor;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      // Add up the clicks and conversions, for generating the suggested ad schedules&lt;br /&gt;
      if (suggestAdSchedules || suggestDeviceBidModifiers) {&lt;br /&gt;
        totalConversions += smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Conversions&amp;quot;];&lt;br /&gt;
        totalClicks += smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Clicks&amp;quot;];&lt;br /&gt;
        if (suggestDeviceBidModifiers) {&lt;br /&gt;
          for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
            deviceClicks[devices[i]] += smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+&amp;quot;Clicks&amp;quot;];&lt;br /&gt;
            deviceConversions[devices[i]] += smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i]+&amp;quot;Conversions&amp;quot;];&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Calculate suggested ad schedules based on the average conversion rate&lt;br /&gt;
  if (suggestAdSchedules || suggestDeviceBidModifiers) {&lt;br /&gt;
    if (totalClicks == 0) {&lt;br /&gt;
      var meanConvRate = 0;&lt;br /&gt;
    } else {&lt;br /&gt;
      var meanConvRate = totalConversions / totalClicks;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
      for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
        if (meanConvRate == 0 || smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Clicks&amp;quot;] == 0) {&lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;AdSchedules&amp;quot;] = &amp;quot;-&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
          var convRate = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Conversions&amp;quot;] / smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;Clicks&amp;quot;];&lt;br /&gt;
          &lt;br /&gt;
          // The suggested multiplier is generated from the mean.&lt;br /&gt;
          // It is dampened by taking the square root.&lt;br /&gt;
          var multiplier = Math.sqrt(convRate/meanConvRate)-1;&lt;br /&gt;
          &lt;br /&gt;
          if (multiplier &amp;gt; maxBidMultiplierSuggestion) {&lt;br /&gt;
            multiplier = maxBidMultiplierSuggestion;&lt;br /&gt;
          } else if (multiplier &amp;lt; minBidMultiplierSuggestion) {&lt;br /&gt;
            multiplier = minBidMultiplierSuggestion;&lt;br /&gt;
          } &lt;br /&gt;
          hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;AdSchedules&amp;quot;] = multiplier;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Device level bid modifiers&lt;br /&gt;
    if (suggestDeviceBidModifiers) {&lt;br /&gt;
      var deviceConvRate = {};&lt;br /&gt;
      for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
        if (deviceClicks[devices[i]] == 0) {&lt;br /&gt;
          deviceConvRate[devices[i]] = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
          deviceConvRate[devices[i]] = deviceConversions[devices[i]] / deviceClicks[devices[i]];&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
        for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
          for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
            if (hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;AdSchedules&amp;quot;] == &amp;quot;-&amp;quot; || deviceConvRate[i] == 0 || smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;Clicks&amp;quot;] == 0) {&lt;br /&gt;
              hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;BidModifiers&amp;quot;] = &amp;quot;-&amp;quot;;&lt;br /&gt;
            } else {&lt;br /&gt;
              var convRate = smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;Conversions&amp;quot;] / smoothedData[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;Clicks&amp;quot;];&lt;br /&gt;
              &lt;br /&gt;
              // We calculate the multiplier we want to end up with&lt;br /&gt;
              var endMultiplier = Math.sqrt(convRate/deviceConvRate[devices[i]])-1;&lt;br /&gt;
              &lt;br /&gt;
              if (baseDeviceModifiersOnBiddingMultiplier) {&lt;br /&gt;
                // The bid modifier is calculated so that if the bidding multiplier is set up as an&lt;br /&gt;
                // ad schedule, this is the correct device bid modifier to get the desired multiplier&lt;br /&gt;
                var modifier = ((1+endMultiplier)/(1+hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][&amp;quot;AdSchedules&amp;quot;])) - 1;&lt;br /&gt;
              } else {&lt;br /&gt;
                var modifier = endMultiplier;&lt;br /&gt;
              }&lt;br /&gt;
              &lt;br /&gt;
              if (modifier &amp;gt; maxBidMultiplierSuggestion) {&lt;br /&gt;
                modifier = maxBidMultiplierSuggestion;&lt;br /&gt;
              } else if (modifier &amp;lt; minBidMultiplierSuggestion) {&lt;br /&gt;
                modifier = minBidMultiplierSuggestion;&lt;br /&gt;
              }&lt;br /&gt;
              hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][devices[i] + &amp;quot;BidModifiers&amp;quot;] = modifier;&lt;br /&gt;
            }&lt;br /&gt;
          } &lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
  } // end if suggestAdSchedules or suggestDeviceBidModifiers&lt;br /&gt;
  Logger.log(&amp;quot;Averaged and smoothed data.&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Make the heat maps on the spreadsheet&lt;br /&gt;
  var sheet0 = spreadsheet.getSheets()[0];&lt;br /&gt;
  var calculatedFieldNames = calculatedFields.map(function (arr){return arr.join(&amp;quot;/&amp;quot;)});&lt;br /&gt;
  var baseFields = checkFieldNames(allowedFields, fields, &amp;quot;&amp;quot;, true).concat(calculatedFieldNames);&lt;br /&gt;
  var allFieldNames = baseFields.slice();&lt;br /&gt;
  for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
    allFieldNames = allFieldNames.concat(baseFields.map(function (a) {return devices[i] + a;}));&lt;br /&gt;
  }&lt;br /&gt;
  if (suggestAdSchedules) {&lt;br /&gt;
    allFieldNames.push(&amp;quot;AdSchedules&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  if (suggestDeviceBidModifiers) {&lt;br /&gt;
    for (var i=0; i&amp;lt;devices.length; i++) {&lt;br /&gt;
      allFieldNames.push(devices[i] + &amp;quot;BidModifiers&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (sheet0.getName() == &amp;quot;Template&amp;quot;) {&lt;br /&gt;
    sheet0.setName(allFieldNames[0].replace(/[A-Z\/]/g, function (x){return &amp;quot; &amp;quot; + x;}).trim());&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (var f=0; f&amp;lt;allFieldNames.length; f++) {&lt;br /&gt;
    var fieldName = allFieldNames[f].replace(/[A-Z\/]/g, function (x){return &amp;quot; &amp;quot; + x;}).trim();&lt;br /&gt;
    var sheet = spreadsheet.getSheetByName(fieldName);&lt;br /&gt;
    if (sheet == null) {&lt;br /&gt;
      sheet = sheet0.copyTo(spreadsheet);&lt;br /&gt;
      sheet.setName(fieldName);&lt;br /&gt;
    }&lt;br /&gt;
    sheet.getRange(1, 1).setValue(fieldName);&lt;br /&gt;
    &lt;br /&gt;
    //Post the heat map data&lt;br /&gt;
    var sheetData = [];&lt;br /&gt;
    sheetData.push([&amp;quot;&amp;quot;].concat(dayNames)); // The header&lt;br /&gt;
    var totalValue = 0;&lt;br /&gt;
    for (var h=0; h&amp;lt;24; h++) {&lt;br /&gt;
      var rowData = [h];&lt;br /&gt;
      for (var d=0; d&amp;lt;dayNames.length; d++) {&lt;br /&gt;
        if (hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][allFieldNames[f]] == undefined) {&lt;br /&gt;
          rowData.push(&amp;quot;-&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
          rowData.push(hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][allFieldNames[f]]);&lt;br /&gt;
        }&lt;br /&gt;
        totalValue += hourlyAvg[dayNames[d]][h+&amp;quot;&amp;quot;][allFieldNames[f]];&lt;br /&gt;
      }&lt;br /&gt;
      sheetData.push(rowData);&lt;br /&gt;
    }&lt;br /&gt;
    sheet.getRange(3, 1, sheetData.length, sheetData[0].length).setValues(sheetData);&lt;br /&gt;
    &lt;br /&gt;
    // Work out which format to use and format the numbers in the heat map&lt;br /&gt;
    var averageValue = totalValue / (24*7);&lt;br /&gt;
    if (averageValue &amp;lt; 50) {&lt;br /&gt;
      var format = &amp;quot;#,##0.0&amp;quot;;&lt;br /&gt;
    } else {&lt;br /&gt;
      var format = &amp;quot;#,###,##0&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (allFieldNames[f].indexOf(&amp;quot;/&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
      var components = allFieldNames[f].split(&amp;quot;/&amp;quot;);&lt;br /&gt;
      var multiplierIsMoney = (components[0] == &amp;quot;Cost&amp;quot; || components[0] == &amp;quot;ConversionValue&amp;quot;);&lt;br /&gt;
      var divisorIsMoney = (components[1] == &amp;quot;Cost&amp;quot; || components[1] == &amp;quot;ConversionValue&amp;quot;);&lt;br /&gt;
      if ((!multiplierIsMoney &amp;amp;&amp;amp; !divisorIsMoney) || (multiplierIsMoney &amp;amp;&amp;amp; divisorIsMoney)) {&lt;br /&gt;
        // If neither component is monetary, or both components are, then the result is a percentage&lt;br /&gt;
        format = &amp;quot;#,##0.00%&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (allFieldNames[f] == &amp;quot;AdSchedules&amp;quot; || allFieldNames[f].substr(-12) == &amp;quot;BidModifiers&amp;quot;) {&lt;br /&gt;
      format = &amp;quot;#,##0.00%&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    sheet.getRange(4, 2, sheetData.length, sheetData[0].length).setNumberFormat(format);&lt;br /&gt;
    &lt;br /&gt;
    // Update the chart title&lt;br /&gt;
    var charts = sheet.getCharts();&lt;br /&gt;
    if (sheet.getCharts().length === 0) {&lt;br /&gt;
      Logger.log(&amp;quot;Warning: chart missing from the &amp;quot; + fieldName + &amp;quot; sheet.&amp;quot;); &lt;br /&gt;
    } else {&lt;br /&gt;
      var chart = charts[0];&lt;br /&gt;
      chart = chart.modify().setOption('title', fieldName).build();&lt;br /&gt;
      sheet.updateChart(chart);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  Logger.log(&amp;quot;Posted data to spreadsheet.&amp;quot;);&lt;br /&gt;
  Logger.log(&amp;quot;Finished.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Check the spreadsheet URL has been entered, and that it works&lt;br /&gt;
function checkSpreadsheet(spreadsheetUrl, spreadsheetName) {&lt;br /&gt;
  if (spreadsheetUrl.replace(/[AEIOU]/g,&amp;quot;X&amp;quot;) == &amp;quot;https://docs.google.com/YXXR-SPRXXDSHXXT-XRL-HXRX&amp;quot;) {&lt;br /&gt;
    throw(&amp;quot;Problem with &amp;quot; + spreadsheetName + &amp;quot; URL: make sure you've replaced the default with a valid spreadsheet URL.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  try {&lt;br /&gt;
    var spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);&lt;br /&gt;
    &lt;br /&gt;
    // Checks if you can edit the spreadsheet&lt;br /&gt;
    var sheet = spreadsheet.getSheets()[0];&lt;br /&gt;
    var sheetName = sheet.getName();&lt;br /&gt;
    sheet.setName(sheetName);&lt;br /&gt;
    &lt;br /&gt;
    return spreadsheet;&lt;br /&gt;
  } catch (e) {&lt;br /&gt;
    throw(&amp;quot;Problem with &amp;quot; + spreadsheetName + &amp;quot; URL: '&amp;quot; + e + &amp;quot;'&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Get the IDs of campaigns which match the given options&lt;br /&gt;
function getCampaignIds() {&lt;br /&gt;
  var whereStatement = &amp;quot;WHERE &amp;quot;;&lt;br /&gt;
  var whereStatementsArray = [];&lt;br /&gt;
  var campaignIds = [];&lt;br /&gt;
  &lt;br /&gt;
  if (ignorePausedCampaigns) {&lt;br /&gt;
    whereStatement += &amp;quot;CampaignStatus = ENABLED &amp;quot;;&lt;br /&gt;
  } else {&lt;br /&gt;
    whereStatement += &amp;quot;CampaignStatus IN ['ENABLED','PAUSED'] &amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (var i=0; i&amp;lt;campaignNameDoesNotContain.length; i++) {&lt;br /&gt;
    whereStatement += &amp;quot;AND CampaignName DOES_NOT_CONTAIN_IGNORE_CASE '&amp;quot; + campaignNameDoesNotContain[i].replace(/&amp;quot;/g,'\\\&amp;quot;') + &amp;quot;' &amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (campaignNameContains.length == 0) {&lt;br /&gt;
    whereStatementsArray = [whereStatement];&lt;br /&gt;
  } else {&lt;br /&gt;
    for (var i=0; i&amp;lt;campaignNameContains.length; i++) {&lt;br /&gt;
      whereStatementsArray.push(whereStatement + 'AND CampaignName CONTAINS_IGNORE_CASE &amp;quot;' + campaignNameContains[i].replace(/&amp;quot;/g,'\\\&amp;quot;') + '&amp;quot; ');&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for (var i=0; i&amp;lt;whereStatementsArray.length; i++) {&lt;br /&gt;
    var report = AdWordsApp.report(&lt;br /&gt;
      &amp;quot;SELECT CampaignId &amp;quot; +&lt;br /&gt;
      &amp;quot;FROM   CAMPAIGN_PERFORMANCE_REPORT &amp;quot; +&lt;br /&gt;
      whereStatementsArray[i] +&lt;br /&gt;
      &amp;quot;DURING LAST_30_DAYS&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    var rows = report.rows();&lt;br /&gt;
    while (rows.hasNext()) {&lt;br /&gt;
      var row = rows.next();&lt;br /&gt;
      campaignIds.push(row['CampaignId']);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (campaignIds.length == 0) {&lt;br /&gt;
    throw(&amp;quot;No campaigns found with the given settings.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  return campaignIds;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Verify that all field names are valid, and return a list of them with the&lt;br /&gt;
// correct capitalisation. If deduplicate is true, the list is deduplicated&lt;br /&gt;
function checkFieldNames(allowedFields, givenFields, souceName, deduplicate) {&lt;br /&gt;
  var allowedFieldsLowerCase = allowedFields.map(function (str){return str.toLowerCase()});&lt;br /&gt;
  var wantedFields = [];&lt;br /&gt;
  var unrecognisedFields = [];&lt;br /&gt;
  for (var i=0; i&amp;lt;givenFields.length; i++) {&lt;br /&gt;
    var fieldIndex = allowedFieldsLowerCase.indexOf(givenFields[i].toLowerCase().replace(&amp;quot; &amp;quot;,&amp;quot;&amp;quot;).trim());&lt;br /&gt;
    if(fieldIndex === -1){&lt;br /&gt;
      unrecognisedFields.push(givenFields[i]);&lt;br /&gt;
    } else if(!deduplicate || wantedFields.indexOf(allowedFields[fieldIndex]) &amp;lt; 0) {&lt;br /&gt;
      wantedFields.push(allowedFields[fieldIndex]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (unrecognisedFields.length &amp;gt; 0) {&lt;br /&gt;
    throw unrecognisedFields.length + &amp;quot; field(s) not recognised in '&amp;quot; + souceName + &amp;quot;': '&amp;quot; + unrecognisedFields.join(&amp;quot;', '&amp;quot;) + &lt;br /&gt;
      &amp;quot;'. Please choose from '&amp;quot; + allowedFields.join(&amp;quot;', '&amp;quot;) + &amp;quot;'.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  return wantedFields;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A1%D1%82%D0%B0%D0%B2%D0%BA%D0%B8_24/7&amp;diff=1886</id>
		<title>Ставки 24/7</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A1%D1%82%D0%B0%D0%B2%D0%BA%D0%B8_24/7&amp;diff=1886"/>
		<updated>2019-10-28T14:51:57Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1. Корректировки ставок устанавливаются в Google Таблицах. Сохраните себе копию [https://docs.google.com/spreadsheets/d/1SuaOem0c-yYoscb_nmbCA2S0Ap9KYiBM/edit#gid=1235166581 шаблона].&lt;br /&gt;
&lt;br /&gt;
2. Выставьте в нем свои значения. &lt;br /&gt;
&lt;br /&gt;
В ячейках от B2 до H25 вводим корректировки ставок: ставки 0% не изменяют ничего, а показатели 25% и — 25% соответственно увеличивают и уменьшают ставки в кампаниях на 25%.&lt;br /&gt;
Если вы также хотите использовать корректировки для мобильных устройств, перейдите на второй лист документа и заполните таблицу.&lt;br /&gt;
&lt;br /&gt;
3. Перейдите в аккаунт Google AdWords на вкладку &amp;quot;Скрипты&amp;quot;. Добавить код, приведенный ниже&lt;br /&gt;
&lt;br /&gt;
4. Откорректируйте скрипт&lt;br /&gt;
&lt;br /&gt;
'''spreadsheetUrl''' — это адрес документа с коэффициентами ставок (добавьте URL);&lt;br /&gt;
&lt;br /&gt;
установите значение true для переменной '''shoppingCampaigns''', если нужно использовать скрипт для корректировки торговых кампаний, или false, чтобы использовать только в поисковых;&lt;br /&gt;
&lt;br /&gt;
установите для '''runMobileBids''' значение true, если хотите изменить корректировки ставок для мобильных устройств;&lt;br /&gt;
&lt;br /&gt;
чтобы использовать скрипт для определенных кампаний, используйте '''excludeCampaignNameContains''' и '''includeCampaignNameContains'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Advanced ad scheduling&lt;br /&gt;
*&lt;br /&gt;
* This script will apply ad schedules to campaigns or shopping campaigns and set&lt;br /&gt;
* the ad schedule bid modifier and mobile bid modifier at each hour according to&lt;br /&gt;
* multiplier timetables in a Google sheet.&lt;br /&gt;
*&lt;br /&gt;
* This version creates schedules with modifiers for 4 hours, then fills the rest&lt;br /&gt;
* of the day and the other days of the week with schedules with no modifier as a&lt;br /&gt;
* fail safe.&lt;br /&gt;
*&lt;br /&gt;
* Version: 3.1&lt;br /&gt;
* Updated to allow -100% bids, change mobile adjustments and create fail safes.&lt;br /&gt;
* brainlabsdigital.com&lt;br /&gt;
*&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
function main() {&lt;br /&gt;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//&lt;br /&gt;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//&lt;br /&gt;
  //Options&lt;br /&gt;
 &lt;br /&gt;
  //The Google sheet to use&lt;br /&gt;
  //The default value is the example sheet&lt;br /&gt;
  var spreadsheetUrl = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
  //Shopping or regular campaigns&lt;br /&gt;
  //Use true if you want to run script on shopping campaigns (not regular campaigns).&lt;br /&gt;
  //Use false for regular campaigns.&lt;br /&gt;
  var shoppingCampaigns = false;&lt;br /&gt;
 &lt;br /&gt;
  //Use true if you want to set mobile bid adjustments as well as ad schedules.&lt;br /&gt;
  //Use false to just set ad schedules.&lt;br /&gt;
  var runMobileBids = false;&lt;br /&gt;
 &lt;br /&gt;
  //Optional parameters for filtering campaign names. The matching is case insensitive.&lt;br /&gt;
  //Select which campaigns to exclude e.g [&amp;quot;foo&amp;quot;, &amp;quot;bar&amp;quot;] will ignore all campaigns&lt;br /&gt;
  //whose name contains 'foo' or 'bar'. Leave blank [] to not exclude any campaigns.&lt;br /&gt;
  var excludeCampaignNameContains = [];&lt;br /&gt;
 &lt;br /&gt;
  //Select which campaigns to include e.g [&amp;quot;foo&amp;quot;, &amp;quot;bar&amp;quot;] will include only campaigns&lt;br /&gt;
  //whose name contains 'foo' or 'bar'. Leave blank [] to include all campaigns.&lt;br /&gt;
  var includeCampaignNameContains = [];&lt;br /&gt;
 &lt;br /&gt;
  //When you want to stop running the ad scheduling for good, set the lastRun&lt;br /&gt;
  //variable to true to remove all ad schedules.&lt;br /&gt;
  var lastRun = false;&lt;br /&gt;
 &lt;br /&gt;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//&lt;br /&gt;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//&lt;br /&gt;
 &lt;br /&gt;
  //Initialise for use later.&lt;br /&gt;
  var weekDays = [&amp;quot;MONDAY&amp;quot;, &amp;quot;TUESDAY&amp;quot;, &amp;quot;WEDNESDAY&amp;quot;, &amp;quot;THURSDAY&amp;quot;, &amp;quot;FRIDAY&amp;quot;, &amp;quot;SATURDAY&amp;quot;, &amp;quot;SUNDAY&amp;quot;];&lt;br /&gt;
  var adScheduleCodes = [];&lt;br /&gt;
  var campaignIds = [];&lt;br /&gt;
 &lt;br /&gt;
  //Retrieving up hourly data&lt;br /&gt;
  var scheduleRange = &amp;quot;B2:H25&amp;quot;;&lt;br /&gt;
  var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
  var spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);&lt;br /&gt;
  var sheets = spreadsheet.getSheets();&lt;br /&gt;
 &lt;br /&gt;
  var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
  var date = new Date();&lt;br /&gt;
  var dayOfWeek = parseInt(Utilities.formatDate(date, timeZone, &amp;quot;uu&amp;quot;), 10) - 1;&lt;br /&gt;
  var hour = parseInt(Utilities.formatDate(date, timeZone, &amp;quot;HH&amp;quot;), 10);&lt;br /&gt;
 &lt;br /&gt;
  var sheet = sheets[0];&lt;br /&gt;
  var data = sheet.getRange(scheduleRange).getValues();&lt;br /&gt;
 &lt;br /&gt;
  //This hour's bid multiplier.&lt;br /&gt;
  var thisHourMultiplier = data[hour][dayOfWeek];&lt;br /&gt;
  var lastHourCell = &amp;quot;I2&amp;quot;;&lt;br /&gt;
  sheet.getRange(lastHourCell).setValue(thisHourMultiplier);&lt;br /&gt;
 &lt;br /&gt;
  //The next few hours' multipliers&lt;br /&gt;
  var timesAndModifiers = [];&lt;br /&gt;
  var otherDays = weekDays.slice(0);&lt;br /&gt;
  for (var h=0; h&amp;lt;5; h++) {&lt;br /&gt;
    var newHour = (hour + h)%24;&lt;br /&gt;
    if (hour + h &amp;gt; 23) {&lt;br /&gt;
      var newDay = (dayOfWeek + 1)%7;&lt;br /&gt;
    } else {&lt;br /&gt;
      var newDay = dayOfWeek;&lt;br /&gt;
    }&lt;br /&gt;
    otherDays[newDay] = &amp;quot;-&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    if (h&amp;lt;4) {&lt;br /&gt;
      // Use the specified bids for the next 4 hours&lt;br /&gt;
      var bidModifier = data[newHour][newDay];&lt;br /&gt;
      if (isNaN(bidModifier) || (bidModifier &amp;lt; -0.9 &amp;amp;&amp;amp; bidModifier &amp;gt; -1) || bidModifier &amp;gt; 9) {&lt;br /&gt;
        Logger.log(&amp;quot;Bid modifier '&amp;quot; + bidModifier + &amp;quot;' for &amp;quot; + weekDays[newDay] + &amp;quot; &amp;quot; + newHour + &amp;quot; is not valid.&amp;quot;);&lt;br /&gt;
        timesAndModifiers.push([newHour, newHour+1, weekDays[newDay], 0]);&lt;br /&gt;
      } else if (bidModifier != -1 &amp;amp;&amp;amp; bidModifier.length != 0) {&lt;br /&gt;
        timesAndModifiers.push([newHour, newHour+1, weekDays[newDay], bidModifier]);&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      // Fill in the rest of the day with no adjustment (as a back-up incase the script breaks)&lt;br /&gt;
      timesAndModifiers.push([newHour, 24, weekDays[newDay], 0]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if (hour&amp;gt;0) {&lt;br /&gt;
    timesAndModifiers.push([0, hour, weekDays[dayOfWeek], 0]);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  for (var d=0; d&amp;lt;otherDays.length; d++) {&lt;br /&gt;
    if (otherDays[d] != &amp;quot;-&amp;quot;) {&lt;br /&gt;
      timesAndModifiers.push([0, 24, otherDays[d], 0]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  //Pull a list of all relevant campaign IDs in the account.&lt;br /&gt;
  var campaignSelector = ConstructIterator(shoppingCampaigns);&lt;br /&gt;
  for(var i = 0; i &amp;lt; excludeCampaignNameContains.length; i++){&lt;br /&gt;
    campaignSelector = campaignSelector.withCondition('Name DOES_NOT_CONTAIN_IGNORE_CASE &amp;quot;' + excludeCampaignNameContains[i] + '&amp;quot;');&lt;br /&gt;
  }&lt;br /&gt;
  campaignSelector = campaignSelector.withCondition(&amp;quot;Status IN [ENABLED,PAUSED]&amp;quot;);&lt;br /&gt;
  var campaignIterator = campaignSelector.get();&lt;br /&gt;
  while(campaignIterator.hasNext()){&lt;br /&gt;
    var campaign = campaignIterator.next();&lt;br /&gt;
    var campaignName = campaign.getName();&lt;br /&gt;
    var includeCampaign = false;&lt;br /&gt;
    if(includeCampaignNameContains.length === 0){&lt;br /&gt;
      includeCampaign = true;&lt;br /&gt;
    }&lt;br /&gt;
    for(var i = 0; i &amp;lt; includeCampaignNameContains.length; i++){&lt;br /&gt;
      var index = campaignName.toLowerCase().indexOf(includeCampaignNameContains[i].toLowerCase());&lt;br /&gt;
      if(index !== -1){&lt;br /&gt;
        includeCampaign = true;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if(includeCampaign){&lt;br /&gt;
      var campaignId = campaign.getId();&lt;br /&gt;
      campaignIds.push(campaignId);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  //Return if there are no campaigns.&lt;br /&gt;
  if(campaignIds.length === 0){&lt;br /&gt;
    Logger.log(&amp;quot;There are no campaigns matching your criteria.&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  //Remove all ad scheduling for the last run.&lt;br /&gt;
  if(lastRun){&lt;br /&gt;
    checkAndRemoveAdSchedules(campaignIds, []);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // Change the mobile bid adjustment&lt;br /&gt;
  if(runMobileBids){&lt;br /&gt;
    if (sheets.length &amp;lt; 2) {&lt;br /&gt;
      Logger.log(&amp;quot;Mobile ad schedule sheet was not found in the Google spreadsheet.&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      var sheet = sheets[1];&lt;br /&gt;
      var data = sheet.getRange(scheduleRange).getValues();&lt;br /&gt;
      var thisHourMultiplier_Mobile = data[hour][dayOfWeek];&lt;br /&gt;
 &lt;br /&gt;
      if (thisHourMultiplier_Mobile.length === 0) {&lt;br /&gt;
        thisHourMultiplier_Mobile = -1;&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      if (isNaN(thisHourMultiplier_Mobile) || (thisHourMultiplier_Mobile &amp;lt; -0.9 &amp;amp;&amp;amp; thisHourMultiplier_Mobile &amp;gt; -1) || thisHourMultiplier_Mobile &amp;gt; 3) {&lt;br /&gt;
        Logger.log(&amp;quot;Mobile bid modifier '&amp;quot; + thisHourMultiplier_Mobile + &amp;quot;' for &amp;quot; + weekDays[dayOfWeek] + &amp;quot; &amp;quot; + hour + &amp;quot; is not valid.&amp;quot;);&lt;br /&gt;
        thisHourMultiplier_Mobile = 0;&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      var totalMultiplier = ((1+thisHourMultiplier_Mobile)*(1+thisHourMultiplier))-1;&lt;br /&gt;
      sheet.getRange(&amp;quot;I2&amp;quot;).setValue(thisHourMultiplier_Mobile);&lt;br /&gt;
      sheet.getRange(&amp;quot;T2&amp;quot;).setValue(totalMultiplier);&lt;br /&gt;
      ModifyMobileBidAdjustment(campaignIds, thisHourMultiplier_Mobile);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // Check the existing ad schedules, removing those no longer necessary&lt;br /&gt;
  var existingSchedules = checkAndRemoveAdSchedules(campaignIds, timesAndModifiers);&lt;br /&gt;
 &lt;br /&gt;
  // Add in the new ad schedules&lt;br /&gt;
  AddHourlyAdSchedules(campaignIds, timesAndModifiers, existingSchedules, shoppingCampaigns);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
* Function to add ad schedules for the campaigns with the given IDs, unless the schedules are&lt;br /&gt;
* referenced in the existingSchedules array. The scheduling will be added as a hour long periods&lt;br /&gt;
* as specified in the passed parameter array and will be given the specified bid modifier.&lt;br /&gt;
*&lt;br /&gt;
* @param array campaignIds array of campaign IDs to add ad schedules to&lt;br /&gt;
* @param array timesAndModifiers the array of [hour, day, bid modifier] for which to add ad scheduling&lt;br /&gt;
* @param array existingSchedules array of strings identifying already existing schedules.&lt;br /&gt;
* @param bool shoppingCampaigns using shopping campaigns?&lt;br /&gt;
* @return void&lt;br /&gt;
*/&lt;br /&gt;
function AddHourlyAdSchedules(campaignIds, timesAndModifiers, existingSchedules, shoppingCampaigns){&lt;br /&gt;
  // times = [[hour,day],[hour,day]]&lt;br /&gt;
  var campaignIterator = ConstructIterator(shoppingCampaigns)&lt;br /&gt;
  .withIds(campaignIds)&lt;br /&gt;
  .get();&lt;br /&gt;
  while(campaignIterator.hasNext()){&lt;br /&gt;
    var campaign = campaignIterator.next();&lt;br /&gt;
    for(var i = 0; i &amp;lt; timesAndModifiers.length; i++){&lt;br /&gt;
      if (existingSchedules.indexOf(&lt;br /&gt;
        timesAndModifiers[i][0] + &amp;quot;|&amp;quot; + (timesAndModifiers[i][1]) + &amp;quot;|&amp;quot; + timesAndModifiers[i][2]&lt;br /&gt;
          + &amp;quot;|&amp;quot; + Utilities.formatString(&amp;quot;%.2f&amp;quot;,(timesAndModifiers[i][3]+1)) + &amp;quot;|&amp;quot; + campaign.getId())&lt;br /&gt;
      &amp;gt; -1) {&lt;br /&gt;
 &lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      campaign.addAdSchedule({&lt;br /&gt;
        dayOfWeek: timesAndModifiers[i][2],&lt;br /&gt;
        startHour: timesAndModifiers[i][0],&lt;br /&gt;
        startMinute: 0,&lt;br /&gt;
        endHour: timesAndModifiers[i][1],&lt;br /&gt;
        endMinute: 0,&lt;br /&gt;
        bidModifier: Math.round(100*(1+timesAndModifiers[i][3]))/100&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
* Function to remove ad schedules from all campaigns referenced in the passed array&lt;br /&gt;
* which do not correspond to schedules specified in the passed timesAndModifiers array.&lt;br /&gt;
*&lt;br /&gt;
* @param array campaignIds array of campaign IDs to remove ad scheduling from&lt;br /&gt;
* @param array timesAndModifiers array of [hour, day, bid modifier] of the wanted schedules&lt;br /&gt;
* @return array existingWantedSchedules array of strings identifying the existing undeleted schedules&lt;br /&gt;
*/&lt;br /&gt;
function checkAndRemoveAdSchedules(campaignIds, timesAndModifiers) {&lt;br /&gt;
 &lt;br /&gt;
  var adScheduleIds = [];&lt;br /&gt;
 &lt;br /&gt;
  var report = AdWordsApp.report(&lt;br /&gt;
    'SELECT CampaignId, Id ' +&lt;br /&gt;
    'FROM CAMPAIGN_AD_SCHEDULE_TARGET_REPORT ' +&lt;br /&gt;
    'WHERE CampaignId IN [&amp;quot;' + campaignIds.join('&amp;quot;,&amp;quot;')  + '&amp;quot;]'&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  var rows = report.rows();&lt;br /&gt;
  while(rows.hasNext()){&lt;br /&gt;
    var row = rows.next();&lt;br /&gt;
    var adScheduleId = row['Id'];&lt;br /&gt;
    var campaignId = row['CampaignId'];&lt;br /&gt;
    if (adScheduleId == &amp;quot;--&amp;quot;) {&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
    adScheduleIds.push([campaignId,adScheduleId]);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  var chunkedArray = [];&lt;br /&gt;
  var chunkSize = 10000;&lt;br /&gt;
 &lt;br /&gt;
  for(var i = 0; i &amp;lt; adScheduleIds.length; i += chunkSize){&lt;br /&gt;
    chunkedArray.push(adScheduleIds.slice(i, i + chunkSize));&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  var wantedSchedules = [];&lt;br /&gt;
  var existingWantedSchedules = [];&lt;br /&gt;
 &lt;br /&gt;
  for (var j=0; j&amp;lt;timesAndModifiers.length; j++) {&lt;br /&gt;
    wantedSchedules.push(timesAndModifiers[j][0] + &amp;quot;|&amp;quot; + (timesAndModifiers[j][1]) + &amp;quot;|&amp;quot; + timesAndModifiers[j][2] + &amp;quot;|&amp;quot; + Utilities.formatString(&amp;quot;%.2f&amp;quot;,timesAndModifiers[j][3]+1));&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  for(var i = 0; i &amp;lt; chunkedArray.length; i++){&lt;br /&gt;
    var unwantedSchedules = [];&lt;br /&gt;
 &lt;br /&gt;
    var adScheduleIterator = AdWordsApp.targeting()&lt;br /&gt;
    .adSchedules()&lt;br /&gt;
    .withIds(chunkedArray[i])&lt;br /&gt;
    .get();&lt;br /&gt;
    while (adScheduleIterator.hasNext()) {&lt;br /&gt;
      var adSchedule = adScheduleIterator.next();&lt;br /&gt;
      var key = adSchedule.getStartHour() + &amp;quot;|&amp;quot; + adSchedule.getEndHour() + &amp;quot;|&amp;quot; + adSchedule.getDayOfWeek() + &amp;quot;|&amp;quot; + Utilities.formatString(&amp;quot;%.2f&amp;quot;,adSchedule.getBidModifier());&lt;br /&gt;
 &lt;br /&gt;
      if (wantedSchedules.indexOf(key) &amp;gt; -1) {&lt;br /&gt;
        existingWantedSchedules.push(key + &amp;quot;|&amp;quot; + adSchedule.getCampaign().getId());&lt;br /&gt;
      } else {&lt;br /&gt;
        unwantedSchedules.push(adSchedule);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    for(var j = 0; j &amp;lt; unwantedSchedules.length; j++){&lt;br /&gt;
      unwantedSchedules[j].remove();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  return existingWantedSchedules;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
* Function to construct an iterator for shopping campaigns or regular campaigns.&lt;br /&gt;
*&lt;br /&gt;
* @param bool shoppingCampaigns Using shopping campaigns?&lt;br /&gt;
* @return AdWords iterator Returns the corresponding AdWords iterator&lt;br /&gt;
*/&lt;br /&gt;
function ConstructIterator(shoppingCampaigns){&lt;br /&gt;
  if(shoppingCampaigns === true){&lt;br /&gt;
    return AdWordsApp.shoppingCampaigns();&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    return AdWordsApp.campaigns();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
* Function to set a mobile bid modifier for a set of campaigns&lt;br /&gt;
*&lt;br /&gt;
* @param array campaignIds An array of the campaign IDs to be affected&lt;br /&gt;
* @param Float bidModifier The multiplicative mobile bid modifier&lt;br /&gt;
* @return void&lt;br /&gt;
*/&lt;br /&gt;
function ModifyMobileBidAdjustment(campaignIds, bidModifier){&lt;br /&gt;
 &lt;br /&gt;
  var platformIds = [];&lt;br /&gt;
  var newBidModifier = Math.round(100*(1+bidModifier))/100;&lt;br /&gt;
 &lt;br /&gt;
  for(var i = 0; i &amp;lt; campaignIds.length; i++){&lt;br /&gt;
    platformIds.push([campaignIds[i],30001]);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  var platformIterator = AdWordsApp.targeting()&lt;br /&gt;
  .platforms()&lt;br /&gt;
  .withIds(platformIds)&lt;br /&gt;
  .get();&lt;br /&gt;
  while (platformIterator.hasNext()) {&lt;br /&gt;
    var platform = platformIterator.next();&lt;br /&gt;
    platform.setBidModifier(newBidModifier);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A1%D1%82%D0%B0%D0%B2%D0%BA%D0%B8_24/7&amp;diff=1885</id>
		<title>Ставки 24/7</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A1%D1%82%D0%B0%D0%B2%D0%BA%D0%B8_24/7&amp;diff=1885"/>
		<updated>2019-10-28T14:51:07Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1. Корректировки ставок устанавливаются в Google Таблицах. Сохраните себе копию [https://drive.google.com/file/d/1SuaOem0c-yYoscb_nmbCA2S0Ap9KYiBM/view?usp=sharing шаблона].&lt;br /&gt;
&lt;br /&gt;
2. Выставьте в нем свои значения. &lt;br /&gt;
&lt;br /&gt;
В ячейках от B2 до H25 вводим корректировки ставок: ставки 0% не изменяют ничего, а показатели 25% и — 25% соответственно увеличивают и уменьшают ставки в кампаниях на 25%.&lt;br /&gt;
Если вы также хотите использовать корректировки для мобильных устройств, перейдите на второй лист документа и заполните таблицу.&lt;br /&gt;
&lt;br /&gt;
3. Перейдите в аккаунт Google AdWords на вкладку &amp;quot;Скрипты&amp;quot;. Добавить код, приведенный ниже&lt;br /&gt;
&lt;br /&gt;
4. Откорректируйте скрипт&lt;br /&gt;
&lt;br /&gt;
'''spreadsheetUrl''' — это адрес документа с коэффициентами ставок (добавьте URL);&lt;br /&gt;
&lt;br /&gt;
установите значение true для переменной '''shoppingCampaigns''', если нужно использовать скрипт для корректировки торговых кампаний, или false, чтобы использовать только в поисковых;&lt;br /&gt;
&lt;br /&gt;
установите для '''runMobileBids''' значение true, если хотите изменить корректировки ставок для мобильных устройств;&lt;br /&gt;
&lt;br /&gt;
чтобы использовать скрипт для определенных кампаний, используйте '''excludeCampaignNameContains''' и '''includeCampaignNameContains'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Advanced ad scheduling&lt;br /&gt;
*&lt;br /&gt;
* This script will apply ad schedules to campaigns or shopping campaigns and set&lt;br /&gt;
* the ad schedule bid modifier and mobile bid modifier at each hour according to&lt;br /&gt;
* multiplier timetables in a Google sheet.&lt;br /&gt;
*&lt;br /&gt;
* This version creates schedules with modifiers for 4 hours, then fills the rest&lt;br /&gt;
* of the day and the other days of the week with schedules with no modifier as a&lt;br /&gt;
* fail safe.&lt;br /&gt;
*&lt;br /&gt;
* Version: 3.1&lt;br /&gt;
* Updated to allow -100% bids, change mobile adjustments and create fail safes.&lt;br /&gt;
* brainlabsdigital.com&lt;br /&gt;
*&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
function main() {&lt;br /&gt;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//&lt;br /&gt;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//&lt;br /&gt;
  //Options&lt;br /&gt;
 &lt;br /&gt;
  //The Google sheet to use&lt;br /&gt;
  //The default value is the example sheet&lt;br /&gt;
  var spreadsheetUrl = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
  //Shopping or regular campaigns&lt;br /&gt;
  //Use true if you want to run script on shopping campaigns (not regular campaigns).&lt;br /&gt;
  //Use false for regular campaigns.&lt;br /&gt;
  var shoppingCampaigns = false;&lt;br /&gt;
 &lt;br /&gt;
  //Use true if you want to set mobile bid adjustments as well as ad schedules.&lt;br /&gt;
  //Use false to just set ad schedules.&lt;br /&gt;
  var runMobileBids = false;&lt;br /&gt;
 &lt;br /&gt;
  //Optional parameters for filtering campaign names. The matching is case insensitive.&lt;br /&gt;
  //Select which campaigns to exclude e.g [&amp;quot;foo&amp;quot;, &amp;quot;bar&amp;quot;] will ignore all campaigns&lt;br /&gt;
  //whose name contains 'foo' or 'bar'. Leave blank [] to not exclude any campaigns.&lt;br /&gt;
  var excludeCampaignNameContains = [];&lt;br /&gt;
 &lt;br /&gt;
  //Select which campaigns to include e.g [&amp;quot;foo&amp;quot;, &amp;quot;bar&amp;quot;] will include only campaigns&lt;br /&gt;
  //whose name contains 'foo' or 'bar'. Leave blank [] to include all campaigns.&lt;br /&gt;
  var includeCampaignNameContains = [];&lt;br /&gt;
 &lt;br /&gt;
  //When you want to stop running the ad scheduling for good, set the lastRun&lt;br /&gt;
  //variable to true to remove all ad schedules.&lt;br /&gt;
  var lastRun = false;&lt;br /&gt;
 &lt;br /&gt;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//&lt;br /&gt;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//&lt;br /&gt;
 &lt;br /&gt;
  //Initialise for use later.&lt;br /&gt;
  var weekDays = [&amp;quot;MONDAY&amp;quot;, &amp;quot;TUESDAY&amp;quot;, &amp;quot;WEDNESDAY&amp;quot;, &amp;quot;THURSDAY&amp;quot;, &amp;quot;FRIDAY&amp;quot;, &amp;quot;SATURDAY&amp;quot;, &amp;quot;SUNDAY&amp;quot;];&lt;br /&gt;
  var adScheduleCodes = [];&lt;br /&gt;
  var campaignIds = [];&lt;br /&gt;
 &lt;br /&gt;
  //Retrieving up hourly data&lt;br /&gt;
  var scheduleRange = &amp;quot;B2:H25&amp;quot;;&lt;br /&gt;
  var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
  var spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);&lt;br /&gt;
  var sheets = spreadsheet.getSheets();&lt;br /&gt;
 &lt;br /&gt;
  var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
  var date = new Date();&lt;br /&gt;
  var dayOfWeek = parseInt(Utilities.formatDate(date, timeZone, &amp;quot;uu&amp;quot;), 10) - 1;&lt;br /&gt;
  var hour = parseInt(Utilities.formatDate(date, timeZone, &amp;quot;HH&amp;quot;), 10);&lt;br /&gt;
 &lt;br /&gt;
  var sheet = sheets[0];&lt;br /&gt;
  var data = sheet.getRange(scheduleRange).getValues();&lt;br /&gt;
 &lt;br /&gt;
  //This hour's bid multiplier.&lt;br /&gt;
  var thisHourMultiplier = data[hour][dayOfWeek];&lt;br /&gt;
  var lastHourCell = &amp;quot;I2&amp;quot;;&lt;br /&gt;
  sheet.getRange(lastHourCell).setValue(thisHourMultiplier);&lt;br /&gt;
 &lt;br /&gt;
  //The next few hours' multipliers&lt;br /&gt;
  var timesAndModifiers = [];&lt;br /&gt;
  var otherDays = weekDays.slice(0);&lt;br /&gt;
  for (var h=0; h&amp;lt;5; h++) {&lt;br /&gt;
    var newHour = (hour + h)%24;&lt;br /&gt;
    if (hour + h &amp;gt; 23) {&lt;br /&gt;
      var newDay = (dayOfWeek + 1)%7;&lt;br /&gt;
    } else {&lt;br /&gt;
      var newDay = dayOfWeek;&lt;br /&gt;
    }&lt;br /&gt;
    otherDays[newDay] = &amp;quot;-&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    if (h&amp;lt;4) {&lt;br /&gt;
      // Use the specified bids for the next 4 hours&lt;br /&gt;
      var bidModifier = data[newHour][newDay];&lt;br /&gt;
      if (isNaN(bidModifier) || (bidModifier &amp;lt; -0.9 &amp;amp;&amp;amp; bidModifier &amp;gt; -1) || bidModifier &amp;gt; 9) {&lt;br /&gt;
        Logger.log(&amp;quot;Bid modifier '&amp;quot; + bidModifier + &amp;quot;' for &amp;quot; + weekDays[newDay] + &amp;quot; &amp;quot; + newHour + &amp;quot; is not valid.&amp;quot;);&lt;br /&gt;
        timesAndModifiers.push([newHour, newHour+1, weekDays[newDay], 0]);&lt;br /&gt;
      } else if (bidModifier != -1 &amp;amp;&amp;amp; bidModifier.length != 0) {&lt;br /&gt;
        timesAndModifiers.push([newHour, newHour+1, weekDays[newDay], bidModifier]);&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      // Fill in the rest of the day with no adjustment (as a back-up incase the script breaks)&lt;br /&gt;
      timesAndModifiers.push([newHour, 24, weekDays[newDay], 0]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if (hour&amp;gt;0) {&lt;br /&gt;
    timesAndModifiers.push([0, hour, weekDays[dayOfWeek], 0]);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  for (var d=0; d&amp;lt;otherDays.length; d++) {&lt;br /&gt;
    if (otherDays[d] != &amp;quot;-&amp;quot;) {&lt;br /&gt;
      timesAndModifiers.push([0, 24, otherDays[d], 0]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  //Pull a list of all relevant campaign IDs in the account.&lt;br /&gt;
  var campaignSelector = ConstructIterator(shoppingCampaigns);&lt;br /&gt;
  for(var i = 0; i &amp;lt; excludeCampaignNameContains.length; i++){&lt;br /&gt;
    campaignSelector = campaignSelector.withCondition('Name DOES_NOT_CONTAIN_IGNORE_CASE &amp;quot;' + excludeCampaignNameContains[i] + '&amp;quot;');&lt;br /&gt;
  }&lt;br /&gt;
  campaignSelector = campaignSelector.withCondition(&amp;quot;Status IN [ENABLED,PAUSED]&amp;quot;);&lt;br /&gt;
  var campaignIterator = campaignSelector.get();&lt;br /&gt;
  while(campaignIterator.hasNext()){&lt;br /&gt;
    var campaign = campaignIterator.next();&lt;br /&gt;
    var campaignName = campaign.getName();&lt;br /&gt;
    var includeCampaign = false;&lt;br /&gt;
    if(includeCampaignNameContains.length === 0){&lt;br /&gt;
      includeCampaign = true;&lt;br /&gt;
    }&lt;br /&gt;
    for(var i = 0; i &amp;lt; includeCampaignNameContains.length; i++){&lt;br /&gt;
      var index = campaignName.toLowerCase().indexOf(includeCampaignNameContains[i].toLowerCase());&lt;br /&gt;
      if(index !== -1){&lt;br /&gt;
        includeCampaign = true;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if(includeCampaign){&lt;br /&gt;
      var campaignId = campaign.getId();&lt;br /&gt;
      campaignIds.push(campaignId);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  //Return if there are no campaigns.&lt;br /&gt;
  if(campaignIds.length === 0){&lt;br /&gt;
    Logger.log(&amp;quot;There are no campaigns matching your criteria.&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  //Remove all ad scheduling for the last run.&lt;br /&gt;
  if(lastRun){&lt;br /&gt;
    checkAndRemoveAdSchedules(campaignIds, []);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // Change the mobile bid adjustment&lt;br /&gt;
  if(runMobileBids){&lt;br /&gt;
    if (sheets.length &amp;lt; 2) {&lt;br /&gt;
      Logger.log(&amp;quot;Mobile ad schedule sheet was not found in the Google spreadsheet.&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      var sheet = sheets[1];&lt;br /&gt;
      var data = sheet.getRange(scheduleRange).getValues();&lt;br /&gt;
      var thisHourMultiplier_Mobile = data[hour][dayOfWeek];&lt;br /&gt;
 &lt;br /&gt;
      if (thisHourMultiplier_Mobile.length === 0) {&lt;br /&gt;
        thisHourMultiplier_Mobile = -1;&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      if (isNaN(thisHourMultiplier_Mobile) || (thisHourMultiplier_Mobile &amp;lt; -0.9 &amp;amp;&amp;amp; thisHourMultiplier_Mobile &amp;gt; -1) || thisHourMultiplier_Mobile &amp;gt; 3) {&lt;br /&gt;
        Logger.log(&amp;quot;Mobile bid modifier '&amp;quot; + thisHourMultiplier_Mobile + &amp;quot;' for &amp;quot; + weekDays[dayOfWeek] + &amp;quot; &amp;quot; + hour + &amp;quot; is not valid.&amp;quot;);&lt;br /&gt;
        thisHourMultiplier_Mobile = 0;&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      var totalMultiplier = ((1+thisHourMultiplier_Mobile)*(1+thisHourMultiplier))-1;&lt;br /&gt;
      sheet.getRange(&amp;quot;I2&amp;quot;).setValue(thisHourMultiplier_Mobile);&lt;br /&gt;
      sheet.getRange(&amp;quot;T2&amp;quot;).setValue(totalMultiplier);&lt;br /&gt;
      ModifyMobileBidAdjustment(campaignIds, thisHourMultiplier_Mobile);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // Check the existing ad schedules, removing those no longer necessary&lt;br /&gt;
  var existingSchedules = checkAndRemoveAdSchedules(campaignIds, timesAndModifiers);&lt;br /&gt;
 &lt;br /&gt;
  // Add in the new ad schedules&lt;br /&gt;
  AddHourlyAdSchedules(campaignIds, timesAndModifiers, existingSchedules, shoppingCampaigns);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
* Function to add ad schedules for the campaigns with the given IDs, unless the schedules are&lt;br /&gt;
* referenced in the existingSchedules array. The scheduling will be added as a hour long periods&lt;br /&gt;
* as specified in the passed parameter array and will be given the specified bid modifier.&lt;br /&gt;
*&lt;br /&gt;
* @param array campaignIds array of campaign IDs to add ad schedules to&lt;br /&gt;
* @param array timesAndModifiers the array of [hour, day, bid modifier] for which to add ad scheduling&lt;br /&gt;
* @param array existingSchedules array of strings identifying already existing schedules.&lt;br /&gt;
* @param bool shoppingCampaigns using shopping campaigns?&lt;br /&gt;
* @return void&lt;br /&gt;
*/&lt;br /&gt;
function AddHourlyAdSchedules(campaignIds, timesAndModifiers, existingSchedules, shoppingCampaigns){&lt;br /&gt;
  // times = [[hour,day],[hour,day]]&lt;br /&gt;
  var campaignIterator = ConstructIterator(shoppingCampaigns)&lt;br /&gt;
  .withIds(campaignIds)&lt;br /&gt;
  .get();&lt;br /&gt;
  while(campaignIterator.hasNext()){&lt;br /&gt;
    var campaign = campaignIterator.next();&lt;br /&gt;
    for(var i = 0; i &amp;lt; timesAndModifiers.length; i++){&lt;br /&gt;
      if (existingSchedules.indexOf(&lt;br /&gt;
        timesAndModifiers[i][0] + &amp;quot;|&amp;quot; + (timesAndModifiers[i][1]) + &amp;quot;|&amp;quot; + timesAndModifiers[i][2]&lt;br /&gt;
          + &amp;quot;|&amp;quot; + Utilities.formatString(&amp;quot;%.2f&amp;quot;,(timesAndModifiers[i][3]+1)) + &amp;quot;|&amp;quot; + campaign.getId())&lt;br /&gt;
      &amp;gt; -1) {&lt;br /&gt;
 &lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      campaign.addAdSchedule({&lt;br /&gt;
        dayOfWeek: timesAndModifiers[i][2],&lt;br /&gt;
        startHour: timesAndModifiers[i][0],&lt;br /&gt;
        startMinute: 0,&lt;br /&gt;
        endHour: timesAndModifiers[i][1],&lt;br /&gt;
        endMinute: 0,&lt;br /&gt;
        bidModifier: Math.round(100*(1+timesAndModifiers[i][3]))/100&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
* Function to remove ad schedules from all campaigns referenced in the passed array&lt;br /&gt;
* which do not correspond to schedules specified in the passed timesAndModifiers array.&lt;br /&gt;
*&lt;br /&gt;
* @param array campaignIds array of campaign IDs to remove ad scheduling from&lt;br /&gt;
* @param array timesAndModifiers array of [hour, day, bid modifier] of the wanted schedules&lt;br /&gt;
* @return array existingWantedSchedules array of strings identifying the existing undeleted schedules&lt;br /&gt;
*/&lt;br /&gt;
function checkAndRemoveAdSchedules(campaignIds, timesAndModifiers) {&lt;br /&gt;
 &lt;br /&gt;
  var adScheduleIds = [];&lt;br /&gt;
 &lt;br /&gt;
  var report = AdWordsApp.report(&lt;br /&gt;
    'SELECT CampaignId, Id ' +&lt;br /&gt;
    'FROM CAMPAIGN_AD_SCHEDULE_TARGET_REPORT ' +&lt;br /&gt;
    'WHERE CampaignId IN [&amp;quot;' + campaignIds.join('&amp;quot;,&amp;quot;')  + '&amp;quot;]'&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
  var rows = report.rows();&lt;br /&gt;
  while(rows.hasNext()){&lt;br /&gt;
    var row = rows.next();&lt;br /&gt;
    var adScheduleId = row['Id'];&lt;br /&gt;
    var campaignId = row['CampaignId'];&lt;br /&gt;
    if (adScheduleId == &amp;quot;--&amp;quot;) {&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
    adScheduleIds.push([campaignId,adScheduleId]);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  var chunkedArray = [];&lt;br /&gt;
  var chunkSize = 10000;&lt;br /&gt;
 &lt;br /&gt;
  for(var i = 0; i &amp;lt; adScheduleIds.length; i += chunkSize){&lt;br /&gt;
    chunkedArray.push(adScheduleIds.slice(i, i + chunkSize));&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  var wantedSchedules = [];&lt;br /&gt;
  var existingWantedSchedules = [];&lt;br /&gt;
 &lt;br /&gt;
  for (var j=0; j&amp;lt;timesAndModifiers.length; j++) {&lt;br /&gt;
    wantedSchedules.push(timesAndModifiers[j][0] + &amp;quot;|&amp;quot; + (timesAndModifiers[j][1]) + &amp;quot;|&amp;quot; + timesAndModifiers[j][2] + &amp;quot;|&amp;quot; + Utilities.formatString(&amp;quot;%.2f&amp;quot;,timesAndModifiers[j][3]+1));&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  for(var i = 0; i &amp;lt; chunkedArray.length; i++){&lt;br /&gt;
    var unwantedSchedules = [];&lt;br /&gt;
 &lt;br /&gt;
    var adScheduleIterator = AdWordsApp.targeting()&lt;br /&gt;
    .adSchedules()&lt;br /&gt;
    .withIds(chunkedArray[i])&lt;br /&gt;
    .get();&lt;br /&gt;
    while (adScheduleIterator.hasNext()) {&lt;br /&gt;
      var adSchedule = adScheduleIterator.next();&lt;br /&gt;
      var key = adSchedule.getStartHour() + &amp;quot;|&amp;quot; + adSchedule.getEndHour() + &amp;quot;|&amp;quot; + adSchedule.getDayOfWeek() + &amp;quot;|&amp;quot; + Utilities.formatString(&amp;quot;%.2f&amp;quot;,adSchedule.getBidModifier());&lt;br /&gt;
 &lt;br /&gt;
      if (wantedSchedules.indexOf(key) &amp;gt; -1) {&lt;br /&gt;
        existingWantedSchedules.push(key + &amp;quot;|&amp;quot; + adSchedule.getCampaign().getId());&lt;br /&gt;
      } else {&lt;br /&gt;
        unwantedSchedules.push(adSchedule);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    for(var j = 0; j &amp;lt; unwantedSchedules.length; j++){&lt;br /&gt;
      unwantedSchedules[j].remove();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  return existingWantedSchedules;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
* Function to construct an iterator for shopping campaigns or regular campaigns.&lt;br /&gt;
*&lt;br /&gt;
* @param bool shoppingCampaigns Using shopping campaigns?&lt;br /&gt;
* @return AdWords iterator Returns the corresponding AdWords iterator&lt;br /&gt;
*/&lt;br /&gt;
function ConstructIterator(shoppingCampaigns){&lt;br /&gt;
  if(shoppingCampaigns === true){&lt;br /&gt;
    return AdWordsApp.shoppingCampaigns();&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    return AdWordsApp.campaigns();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
* Function to set a mobile bid modifier for a set of campaigns&lt;br /&gt;
*&lt;br /&gt;
* @param array campaignIds An array of the campaign IDs to be affected&lt;br /&gt;
* @param Float bidModifier The multiplicative mobile bid modifier&lt;br /&gt;
* @return void&lt;br /&gt;
*/&lt;br /&gt;
function ModifyMobileBidAdjustment(campaignIds, bidModifier){&lt;br /&gt;
 &lt;br /&gt;
  var platformIds = [];&lt;br /&gt;
  var newBidModifier = Math.round(100*(1+bidModifier))/100;&lt;br /&gt;
 &lt;br /&gt;
  for(var i = 0; i &amp;lt; campaignIds.length; i++){&lt;br /&gt;
    platformIds.push([campaignIds[i],30001]);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  var platformIterator = AdWordsApp.targeting()&lt;br /&gt;
  .platforms()&lt;br /&gt;
  .withIds(platformIds)&lt;br /&gt;
  .get();&lt;br /&gt;
  while (platformIterator.hasNext()) {&lt;br /&gt;
    var platform = platformIterator.next();&lt;br /&gt;
    platform.setBidModifier(newBidModifier);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=1884</id>
		<title>Настройка аналитики</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=1884"/>
		<updated>2019-10-28T14:43:11Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Импорт целей из Google Analytics d Google Ads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Настройка GTM, Google Analytics, целей, связка аккаунтов, импорт основных конверсий&lt;br /&gt;
== Связка AdWords и Analytics==&lt;br /&gt;
Связь через Analytics&lt;br /&gt;
*Войти в аккаунт Google Analytics&lt;br /&gt;
*Перейти на вкладку '''''Администратор'''''&lt;br /&gt;
*В столбце '''''Ресурс''''' выбрать '''''Связь с AdWords'''''&lt;br /&gt;
*Выбрать нужный аккаунт и установить связь&lt;br /&gt;
&lt;br /&gt;
Связь через AdWords&lt;br /&gt;
*Нажать в верхнем правом углу на значок маленькой шестеренки и выбрать пункт&lt;br /&gt;
*В списке с возможными для связывания службами Google найти раздел '''''Google Analytics'''''.&lt;br /&gt;
*В разделе GA нажать на ссылку '''''Подробности''''' &lt;br /&gt;
*В списке с доступными ресурсами выбрать нужный ресурс и нажать кнопку '''''Установить связь'''''&lt;br /&gt;
&lt;br /&gt;
== Настройка сложных аудиторий для ремаркетинга в Google Analytics==&lt;br /&gt;
&lt;br /&gt;
# Войти в аккаунт Google Analytics &lt;br /&gt;
# Перейти на вкладку '''''Администратор''''' &lt;br /&gt;
# В столбце '''''Ресурс''''' выбрать вкладку '''''Настройки аудитории &amp;gt; Аудитории''''' &lt;br /&gt;
# Выбрать настройки для аудитории &lt;br /&gt;
# Ввести название аудитории &lt;br /&gt;
# Выбрать целевой аккаунт AdWords &lt;br /&gt;
&lt;br /&gt;
Настраиваем аудитории по следующим условиям:&lt;br /&gt;
 - Все посетители&lt;br /&gt;
 - Все посетители за 30 дней&lt;br /&gt;
 - Все посетители за 180 дней&lt;br /&gt;
 - Все кто совершил целевую конверсию (лид)&lt;br /&gt;
 - Все кто не совершил целевую конверсию (лид)&lt;br /&gt;
 - Все кто посетил 2 страницы&lt;br /&gt;
 - Все кто посетил 3 страницы&lt;br /&gt;
 - Все кто посетил 4 страницы&lt;br /&gt;
* Настройка аудиторий по категориям сайта&lt;br /&gt;
Условие:&amp;lt;br&amp;gt;&lt;br /&gt;
 - Определить информационные лендинги и создать аудиторию тех кто посетил именно их&lt;br /&gt;
* Настройка &amp;quot;минус&amp;quot; аудиторий для кампаний в Google Analytics&lt;br /&gt;
Условие:&amp;lt;br&amp;gt;&lt;br /&gt;
 - Источник adwords, количество посещений &amp;gt; 1, срок - 30 дней&lt;br /&gt;
 - Просмотры страниц &amp;lt;= 1, срок - 540 дней&lt;br /&gt;
&lt;br /&gt;
== Импорт целей из Google Analytics в Google Ads ==&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=PPC_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=1883</id>
		<title>PPC отдел</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=PPC_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=1883"/>
		<updated>2019-10-28T14:39:55Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Процессы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Структура отдела: ==&lt;br /&gt;
&lt;br /&gt;
'''1. Назначение подразделения'''&lt;br /&gt;
&lt;br /&gt;
'''2. Определение бизнес-процесса подразделения (основной или обеспечительный)'''&lt;br /&gt;
&lt;br /&gt;
'''3. Цель и задачи деятельности'''&lt;br /&gt;
&lt;br /&gt;
'''4. Организационная структура'''&lt;br /&gt;
&lt;br /&gt;
'''5. Распределение ответственности между сотрудниками'''&lt;br /&gt;
&lt;br /&gt;
'''6. Показатели эффективности работы подразделения (KPI)'''&lt;br /&gt;
&lt;br /&gt;
'''7. Информационно-деловой обмен подразделения'''&lt;br /&gt;
&lt;br /&gt;
'''8. Система стимулирования и мотивации'''&lt;br /&gt;
&lt;br /&gt;
'''9. Штатное расписание'''&lt;br /&gt;
&lt;br /&gt;
'''10. Планирование выполнения Заявки'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Задача отдела PPC]]&lt;br /&gt;
&lt;br /&gt;
[[Бизнес процесс]]&lt;br /&gt;
&lt;br /&gt;
[[Должностные инструкции]]&lt;br /&gt;
&lt;br /&gt;
= Процессы =&lt;br /&gt;
[https://drive.google.com/file/d/1kideyhFkLN4snsxKKx7o3_c6cD1mYZfM/view?usp=sharing Работы PPC+FB (список + время)]&lt;br /&gt;
&lt;br /&gt;
[[Передача задач перед отпуском]]&lt;br /&gt;
&lt;br /&gt;
[[Передача проекта]]&lt;br /&gt;
&lt;br /&gt;
[[Пополнение аккаунта]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет по проекту за месяц]]&lt;br /&gt;
&lt;br /&gt;
[[Аудит аккаунта]]&lt;br /&gt;
&lt;br /&gt;
= Google Ads =&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Алгоритмы ==&lt;br /&gt;
[[Подготовительные работы]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка аналитики]]&lt;br /&gt;
&lt;br /&gt;
[[Поисковая рекламная кампания]] &lt;br /&gt;
&lt;br /&gt;
[[Рекламная кампания КМС]]&lt;br /&gt;
&lt;br /&gt;
[[Ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Днамический ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Торговая кампания Google Merchant]]&lt;br /&gt;
&lt;br /&gt;
[[Видеореклама YouTube]]&lt;br /&gt;
&lt;br /&gt;
[[Ведение кампаний (работы на месяц)]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Перенос списков ремаркетинга в Google Adwords]]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Скрипты  ==&lt;br /&gt;
&lt;br /&gt;
[[Инструмент проверки ссылок (один аккаунт)]]&lt;br /&gt;
&lt;br /&gt;
[[Изменение формата объявлений на новый]]&lt;br /&gt;
&lt;br /&gt;
[[Ставки для позиции]]&lt;br /&gt;
&lt;br /&gt;
[[Поиск тематических каналов на YouTube]]&lt;br /&gt;
&lt;br /&gt;
[[Чистка мест размещения]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет эффективности объявлений]]&lt;br /&gt;
&lt;br /&gt;
[[Тепловая карта для управления ставками]]&lt;br /&gt;
&lt;br /&gt;
[[Ставки 24/7]]&lt;br /&gt;
&lt;br /&gt;
[[Проверка остатка баланса в аккаунте (для MCC)]]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Исключения для кампаний ==&lt;br /&gt;
=== Медийные кампании ===&lt;br /&gt;
[[Мобильные приложения]]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=1uWxpXsKwpT2miD-n5cRT2r7N4tlUdrQ7ZJ1kRzOkfcU Сайты знакомств/чаты]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1BMa18Ot2nhAeNBmc3u_X1G7Xq5ZTufzaVnUbxpG5cOc/edit?usp=sharing Игровые сайты]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1pJojHbKUHxcjCjXc4ALGFNDvNp5KkaRJ5JDidC6Sc3U/edit?usp=sharing Детские YouTube каналы]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1vJSYBMnQPbaUT0sdeSDAQghR5dN1svACk5IlngaUrzs/edit?usp=sharing GDN-2700-Bad-Placements]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1LpQT-NmqZrpjDBE9VwgLPorThn29uD4HFid2LnvrW8Y/edit#gid=648103664 2019 - All Bad Placements (Apps, Sites, YouTube Channel]&lt;br /&gt;
&lt;br /&gt;
=== Поисковые кампании ===&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/10Cvt-SgO8hwysrjqPDJTtEVQ04D5patrupOIjMZNEXI/edit?usp=sharing Универсальный список минус-слов]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1BorOC1656JsQqusbOFMelrLBeQ0oubG4tZAC7qz99rY/edit?usp=sharing Маркеры фото/видео]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1e-ufRW_U7YtIfcIhwB2xkzPZknB4dhio8wyPk4bzqwY/edit?usp=sharing Маркеры Отзывы]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1plzxFOPhxUOSE0w48tcthDsraxDoMsJwRh2pht4gWac/edit?usp=sharing Маркеры Поиск работы]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1NxeLczmT1CfwZusNl5hhxeyQuZGiM0gWl4Jv9ZLDZ5E/edit?usp=sharing Города РФ]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1dwnqJhlwTxmvvX4lVI4scw4w26UFuKlPsXA_X17o1zk/edit?usp=sharing Города Украины]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Фиды ==&lt;br /&gt;
[[Подстановка городов в текст объявления]]&lt;br /&gt;
&lt;br /&gt;
[[Динамический ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Фид Merchant Center]]&lt;br /&gt;
&lt;br /&gt;
= Facebook Ads =&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Подготовительные работы ==&lt;br /&gt;
&lt;br /&gt;
[[Создание/подключение страниц Facebook/Instagram]]&lt;br /&gt;
&lt;br /&gt;
[[Создание/подключение рекламного аккаунта Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка целей/событий Facebook Pixel]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка сложных аудиторий для ремаркетинга в Facebook Pixel]]&lt;br /&gt;
&lt;br /&gt;
[[Пополнение аккаунта Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Создание рекламных кампаний ==&lt;br /&gt;
&lt;br /&gt;
[[Формирование структуры аккаунта;]]&lt;br /&gt;
&lt;br /&gt;
[[Создание кампании с определенной целью]]&lt;br /&gt;
&lt;br /&gt;
[[Создание группы объявлений]]&lt;br /&gt;
&lt;br /&gt;
[[Создание объявления]]&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Фиды ==&lt;br /&gt;
&lt;br /&gt;
[[Фид Facebook]]&lt;br /&gt;
&lt;br /&gt;
[[Динамический ремаркетинг Facebook]]&lt;br /&gt;
&lt;br /&gt;
= Прочее =&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1px34aztXFLvZ8Rotbz1ZT1x8-H0EYBMZionfODcFBLM/edit?usp=sharing Требования к рекламным объявлениям]&lt;br /&gt;
&lt;br /&gt;
[[Требования к спискам электронных адресов]]&lt;br /&gt;
&lt;br /&gt;
[[Все варианты таргетинга Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Все варианты таргетинга в КМС Google Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Требования к условиям возврата  товара и денег]]&lt;br /&gt;
&lt;br /&gt;
[[Требования к форме заказа]]&lt;br /&gt;
&lt;br /&gt;
[[Полезные ссылки]]&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1882</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1882"/>
		<updated>2019-10-28T11:38:04Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота t.me/raskrutka_budget_bot , отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;); &lt;br /&gt;
[[Файл:Token.webp|500px|центр]]&lt;br /&gt;
&lt;br /&gt;
'''''НАШ ТОКЕН:''''' 1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''ССЫЛКА ВЫГЛЯДИТ ТАК:''''' https://api.telegram.org/bot1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M/getUpdates&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
==Код скрипта==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['введите email '],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['введите имя ярлыка']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: 'введите токен (без скобок)',&lt;br /&gt;
       CHAT_IDS: ['введите идентификаторы контактов']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полное описание с нуля здесь https://netpeak.net/ru/blog/kak-nastroit-otpravku-uvedomleniy-o-sostoyanii-byudzheta-akkauntov-google-ads-v-telegram-i-na-pochtu/&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1881</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1881"/>
		<updated>2019-10-28T11:36:48Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота t.me/raskrutka_budget_bot , отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;); &lt;br /&gt;
[[Файл:Token.webp|500px|центр]]&lt;br /&gt;
&lt;br /&gt;
'''''НАШ ТОКЕН:''''' 1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''ССЫЛКА ВЫГЛЯДИТ ТАК:''''' https://api.telegram.org/bot1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M/getUpdates&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
==Код скрипта==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['введите email '],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['введите имя ярлыка']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: 'введите токен (без скобок)',&lt;br /&gt;
       CHAT_IDS: ['введите идентификаторы контактов']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1880</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1880"/>
		<updated>2019-10-28T11:30:36Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота t.me/raskrutka_budget_bot , отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;); &lt;br /&gt;
[[Файл:Token.webp|500px|центр]]&lt;br /&gt;
&lt;br /&gt;
НАШ ТОКЕН 1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ССЫЛКА ВЫГЛЯДИТ ТАК: https://api.telegram.org/bot1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M/getUpdates&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
==Код скрипта==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['введите email '],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['введите имя ярлыка']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: 'введите токен (без скобок)',&lt;br /&gt;
       CHAT_IDS: ['введите идентификаторы контактов']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1879</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1879"/>
		<updated>2019-10-28T11:27:52Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;); &lt;br /&gt;
[[Файл:Token.webp|500px|центр]]&lt;br /&gt;
&lt;br /&gt;
НАШ ТОКЕН 1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ССЫЛКА ВЫГЛЯДИТ ТАК: https://api.telegram.org/bot1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M/getUpdates&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
==Код скрипта==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['введите email '],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['введите имя ярлыка']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: 'введите токен (без скобок)',&lt;br /&gt;
       CHAT_IDS: ['введите идентификаторы контактов']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1878</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1878"/>
		<updated>2019-10-28T11:27:29Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;); &lt;br /&gt;
[[Файл:Token.webp|500px|центр]]&lt;br /&gt;
&lt;br /&gt;
НАШ ТОКЕН 1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M&lt;br /&gt;
ССЫЛКА ВЫГЛЯДИТ ТАК: https://api.telegram.org/bot1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M/getUpdates&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
==Код скрипта==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['введите email '],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['введите имя ярлыка']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: 'введите токен (без скобок)',&lt;br /&gt;
       CHAT_IDS: ['введите идентификаторы контактов']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1877</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1877"/>
		<updated>2019-10-28T11:16:22Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;); ТОКЕН 1026481627:AAHqneSZt8AZ_wExB54obb4Fzp-Jxw_MF5M&lt;br /&gt;
[[Файл:Token.webp|500px|центр]]&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
==Код скрипта==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['введите email '],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['введите имя ярлыка']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: 'введите токен (без скобок)',&lt;br /&gt;
       CHAT_IDS: ['введите идентификаторы контактов']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1876</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1876"/>
		<updated>2019-10-28T11:11:38Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;); ТОКЕН 1015546004:AAGf31NN-BB7jSQdeS2BqVXrh0Y3xkvf_BY&lt;br /&gt;
[[Файл:Token.webp|500px|центр]]&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
==Код скрипта==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['введите email '],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['введите имя ярлыка']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: 'введите токен (без скобок)',&lt;br /&gt;
       CHAT_IDS: ['введите идентификаторы контактов']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1874</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1874"/>
		<updated>2019-10-25T13:09:43Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;);&lt;br /&gt;
[[Файл:Token.webp|500px|центр]]&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
==Код скрипта==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['введите email '],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['введите имя ярлыка']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: 'введите токен (без скобок)',&lt;br /&gt;
       CHAT_IDS: ['введите идентификаторы контактов']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1873</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1873"/>
		<updated>2019-10-25T13:06:46Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;);&lt;br /&gt;
[[Файл:Token.webp|500px|центр]]&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1872</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1872"/>
		<updated>2019-10-25T13:05:03Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; &lt;br /&gt;
[[Файл:Token.webp|1000px|центр]]&lt;br /&gt;
Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;);&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Token.webp&amp;diff=1871</id>
		<title>Файл:Token.webp</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Token.webp&amp;diff=1871"/>
		<updated>2019-10-25T13:04:49Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;token&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1870</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1870"/>
		<updated>2019-10-25T13:03:29Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Для добавления нового контакта для рассылки от бота: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;);&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
[[Файл:Chat id.webp|1000px|центр]]&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chat_id.webp&amp;diff=1869</id>
		<title>Файл:Chat id.webp</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chat_id.webp&amp;diff=1869"/>
		<updated>2019-10-25T13:02:49Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;chat id&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1868</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1868"/>
		<updated>2019-10-25T12:58:47Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
==Для добавление нового аккаунта в список==&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
==Для добавления нового контакта для рассылки от бота:==&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;);&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1867</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1867"/>
		<updated>2019-10-25T12:57:57Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
===Для добавление нового аккаунта в список===&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
===Для добавления нового контакта для рассылки от бота:===&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота (без скобок &amp;lt;&amp;gt;);&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1866</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1866"/>
		<updated>2019-10-25T12:56:50Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
Для добавление нового аккаунта в список&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
Для добавления нового контакта для рассылки от бота:&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt; Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота;&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1865</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1865"/>
		<updated>2019-10-25T12:56:24Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
Для добавление нового аккаунта в список&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
Для добавления нового контакта для рассылки от бота:&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере &amp;lt;pre&amp;gt; https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates &amp;lt;/pre&amp;gt;. Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота;&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1864</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1864"/>
		<updated>2019-10-25T12:55:52Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
Для добавление нового аккаунта в список&lt;br /&gt;
* заходим в МСС&lt;br /&gt;
* переходим на кладку аккаунты и находим нужный аккаунт&lt;br /&gt;
* добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
Для добавления нового контакта для рассылки от бота:&lt;br /&gt;
* открываем нашего бота, отправляем ему любое сообщение;&lt;br /&gt;
* после этого переходим по ссылке в браузере https://api.telegram.org/bot&amp;lt;ТОКЕН&amp;gt;/getUpdates. Здесь вместо &amp;lt;ТОКЕН&amp;gt; вставьте значение из ответа бота;&lt;br /&gt;
* видим ответ. Копируем цифры: &amp;quot;chat:{&amp;quot;id&amp;quot;:ХХХХХХХХХ&lt;br /&gt;
*вставляем полученные значения в переменные в скрипте&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1863</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1863"/>
		<updated>2019-10-25T11:51:51Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название '''''MCC Account Budget Control FINISH'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
Для добавление нового аккаунта в список нужно '''''зайти в МСС &amp;gt; Вкладка аккаунты &amp;gt; Найти нужный аккаунт и добавить ярлык High spend accounts'''''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1862</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1862"/>
		<updated>2019-10-25T11:51:28Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название MCC Account Budget Control FINISH.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
Для добавление нового аккаунта в список нужно '''''зайти в МСС &amp;gt; Вкладка аккаунты &amp;gt; Найти нужный аккаунт и добавить ярлык High spend accounts'''''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1861</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1861"/>
		<updated>2019-10-25T11:50:47Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название MCC Account Budget Control FINISH.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
Для добавление нового аккаунта в список нужно зайти в МСС &amp;gt; Вкладка аккаунты &amp;gt; Найти нужный аккаунт и добавить ярлык High spend accounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1860</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1860"/>
		<updated>2019-10-25T11:38:21Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название MCC Account Budget Control FINISH.&amp;lt;br&amp;gt;&lt;br /&gt;
Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1859</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1859"/>
		<updated>2019-10-25T11:38:07Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &amp;lt;br&amp;gt;&lt;br /&gt;
Название MCC Account Budget Control FINISH.&amp;lt;br&amp;gt;&lt;br /&gt;
 Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграмм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1858</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1858"/>
		<updated>2019-10-25T11:37:40Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрипт уже добавлен на наш МСС. Код скрипта приведен ниже. &lt;br /&gt;
Название MCC Account Budget Control FINISH. Ежедневно около 12:00 он выполняет сканирование подключенных аккаунтов и присылает с помощью телеграм-бота остаток бюджета всем указанным контактам.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1857</id>
		<title>Проверка остатка баланса в аккаунте (для MCC)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0_%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B0_%D0%B2_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B5_(%D0%B4%D0%BB%D1%8F_MCC)&amp;diff=1857"/>
		<updated>2019-10-25T11:34:48Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: Новая страница: « &amp;lt;pre&amp;gt; var CONFIG = {    // Указать минимальное количество дней до окончания средств на аккаунте дл…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
   // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.&lt;br /&gt;
days : 7,&lt;br /&gt;
// Указать почты для отправки уведомлений, через запятую, если больше одной&lt;br /&gt;
//email : ['mcc@raskrutka.com.ua'],&lt;br /&gt;
// Указать ники/имена кому отправляется письмо, через запятую, если больше одного&lt;br /&gt;
//names : ['Nick'],&lt;br /&gt;
// Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP&lt;br /&gt;
labelName : ['High spend accounts']&lt;br /&gt;
}&lt;br /&gt;
function main () {&lt;br /&gt;
 var accounts = MccApp.accounts()&lt;br /&gt;
 .withCondition('LabelNames CONTAINS &amp;quot;' + CONFIG.labelName + '&amp;quot;')&lt;br /&gt;
 .executeInParallel(&amp;quot;budgetControl&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
function budgetControl() {&lt;br /&gt;
   var accountName = AdWordsApp.currentAccount().getName();&lt;br /&gt;
var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();&lt;br /&gt;
   while (budgets.hasNext()) {&lt;br /&gt;
     try {&lt;br /&gt;
       var budget = budgets.next();&lt;br /&gt;
       if (budget.getSpendingLimit() !== null ) {&lt;br /&gt;
         var startDate = timeFormat(budget.getStartDateTime());&lt;br /&gt;
         var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();&lt;br /&gt;
         var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor(&amp;quot;LAST_7_DAYS&amp;quot;).getCost() / 7).toFixed();&lt;br /&gt;
         var limit = budget.getSpendingLimit();&lt;br /&gt;
         var remainingDays = rDays(limit, cost, last7DaysCostByDay);&lt;br /&gt;
         var budgetNow = (limit - cost).toFixed();&lt;br /&gt;
         if (budgetNow &amp;lt; 0) {&lt;br /&gt;
           var budgetNow = 0;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
           var budgetNow = budgetNow;&lt;br /&gt;
         }&lt;br /&gt;
         Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);&lt;br /&gt;
         if (remainingDays &amp;lt; CONFIG.days) {&lt;br /&gt;
           sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +&lt;br /&gt;
                               ' . Денег хватит на ' + remainingDays + ' дня/дней.');&lt;br /&gt;
          // MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
          //                 CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,&lt;br /&gt;
          //                 'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +&lt;br /&gt;
          //                 '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +&lt;br /&gt;
          //                 'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
     catch (e) {&lt;br /&gt;
       Logger.log(e);&lt;br /&gt;
       sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);&lt;br /&gt;
//       MailApp.sendEmail(CONFIG.email,&lt;br /&gt;
//                         'Ошибка выполнения скрипта Контроль бюджетов',&lt;br /&gt;
//                         'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
function timeFormat (date) {&lt;br /&gt;
 var year = date.year.toString();&lt;br /&gt;
 var month = date.month.toString();&lt;br /&gt;
 var day = date.day.toString();&lt;br /&gt;
 if (month.length == 1) {&lt;br /&gt;
   month = &amp;quot;0&amp;quot; + month;&lt;br /&gt;
 }&lt;br /&gt;
 if (day.length == 1) {&lt;br /&gt;
   day = &amp;quot;0&amp;quot; + day;&lt;br /&gt;
 }&lt;br /&gt;
 return [year, month, day].join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function today () {&lt;br /&gt;
 var date = new Date();&lt;br /&gt;
 var timeZone = AdWordsApp.currentAccount().getTimeZone();&lt;br /&gt;
 var format = 'yyyyMMdd';&lt;br /&gt;
 return Utilities.formatDate(date, timeZone, format);&lt;br /&gt;
}&lt;br /&gt;
function rDays(limit, cost, last7DaysCostByDay) {&lt;br /&gt;
 var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();&lt;br /&gt;
 if (remainingDays &amp;lt; 1 || remainingDays == &amp;quot;Infinity&amp;quot; || remainingDays == &amp;quot;-Infinity&amp;quot; || remainingDays == -0 ) {&lt;br /&gt;
   remainingDays = 0;&lt;br /&gt;
 }&lt;br /&gt;
 return remainingDays;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function sendTelegramMessage(text) {&lt;br /&gt;
   var CONFIG = {&lt;br /&gt;
       TOKEN: '931079256:AAH4P9rIuCFwxDg_2tPG_KfUh4-2SAaz5BU',&lt;br /&gt;
       CHAT_IDS: ['286887532',&lt;br /&gt;
                  '367561610',&lt;br /&gt;
                  '377258489']&lt;br /&gt;
       }&lt;br /&gt;
   var options = {&lt;br /&gt;
       method: 'POST',&lt;br /&gt;
       contentType: 'application/json'&lt;br /&gt;
   };&lt;br /&gt;
   CONFIG.CHAT_IDS.forEach(function(item) {&lt;br /&gt;
     UrlFetchApp.fetch('https://api.telegram.org/bot' + CONFIG.TOKEN + '/sendMessage?chat_id=' + item + '&amp;amp;text=' + encodeURIComponent(text), options);&lt;br /&gt;
   });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=PPC_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=1856</id>
		<title>PPC отдел</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=PPC_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=1856"/>
		<updated>2019-10-25T11:33:15Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Google Ads| Скрипты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Структура отдела: ==&lt;br /&gt;
&lt;br /&gt;
'''1. Назначение подразделения'''&lt;br /&gt;
&lt;br /&gt;
'''2. Определение бизнес-процесса подразделения (основной или обеспечительный)'''&lt;br /&gt;
&lt;br /&gt;
'''3. Цель и задачи деятельности'''&lt;br /&gt;
&lt;br /&gt;
'''4. Организационная структура'''&lt;br /&gt;
&lt;br /&gt;
'''5. Распределение ответственности между сотрудниками'''&lt;br /&gt;
&lt;br /&gt;
'''6. Показатели эффективности работы подразделения (KPI)'''&lt;br /&gt;
&lt;br /&gt;
'''7. Информационно-деловой обмен подразделения'''&lt;br /&gt;
&lt;br /&gt;
'''8. Система стимулирования и мотивации'''&lt;br /&gt;
&lt;br /&gt;
'''9. Штатное расписание'''&lt;br /&gt;
&lt;br /&gt;
'''10. Планирование выполнения Заявки'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Задача отдела PPC]]&lt;br /&gt;
&lt;br /&gt;
[[Бизнес процесс]]&lt;br /&gt;
&lt;br /&gt;
[[Должностные инструкции]]&lt;br /&gt;
&lt;br /&gt;
= Процессы =&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1P4G7x59o_ku-Qbnggag48QPozwCYwjRESSI6qvrHEiA/edit#gid=0 Работы PPC+FB (список + время)]&lt;br /&gt;
&lt;br /&gt;
[[Передача задач перед отпуском]]&lt;br /&gt;
&lt;br /&gt;
[[Передача проекта]]&lt;br /&gt;
&lt;br /&gt;
[[Пополнение аккаунта]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет по проекту за месяц]]&lt;br /&gt;
&lt;br /&gt;
[[Аудит аккаунта]]&lt;br /&gt;
&lt;br /&gt;
= Google Ads =&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Алгоритмы ==&lt;br /&gt;
[[Подготовительные работы]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка аналитики]]&lt;br /&gt;
&lt;br /&gt;
[[Поисковая рекламная кампания]] &lt;br /&gt;
&lt;br /&gt;
[[Рекламная кампания КМС]]&lt;br /&gt;
&lt;br /&gt;
[[Ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Днамический ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Торговая кампания Google Merchant]]&lt;br /&gt;
&lt;br /&gt;
[[Видеореклама YouTube]]&lt;br /&gt;
&lt;br /&gt;
[[Ведение кампаний (работы на месяц)]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Перенос списков ремаркетинга в Google Adwords]]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Скрипты  ==&lt;br /&gt;
&lt;br /&gt;
[[Инструмент проверки ссылок (один аккаунт)]]&lt;br /&gt;
&lt;br /&gt;
[[Изменение формата объявлений на новый]]&lt;br /&gt;
&lt;br /&gt;
[[Ставки для позиции]]&lt;br /&gt;
&lt;br /&gt;
[[Поиск тематических каналов на YouTube]]&lt;br /&gt;
&lt;br /&gt;
[[Чистка мест размещения]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет эффективности объявлений]]&lt;br /&gt;
&lt;br /&gt;
[[Тепловая карта для управления ставками]]&lt;br /&gt;
&lt;br /&gt;
[[Ставки 24/7]]&lt;br /&gt;
&lt;br /&gt;
[[Проверка остатка баланса в аккаунте (для MCC)]]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Исключения для кампаний ==&lt;br /&gt;
=== Медийные кампании ===&lt;br /&gt;
[[Мобильные приложения]]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=1uWxpXsKwpT2miD-n5cRT2r7N4tlUdrQ7ZJ1kRzOkfcU Сайты знакомств/чаты]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1BMa18Ot2nhAeNBmc3u_X1G7Xq5ZTufzaVnUbxpG5cOc/edit?usp=sharing Игровые сайты]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1pJojHbKUHxcjCjXc4ALGFNDvNp5KkaRJ5JDidC6Sc3U/edit?usp=sharing Детские YouTube каналы]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1vJSYBMnQPbaUT0sdeSDAQghR5dN1svACk5IlngaUrzs/edit?usp=sharing GDN-2700-Bad-Placements]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1LpQT-NmqZrpjDBE9VwgLPorThn29uD4HFid2LnvrW8Y/edit#gid=648103664 2019 - All Bad Placements (Apps, Sites, YouTube Channel]&lt;br /&gt;
&lt;br /&gt;
=== Поисковые кампании ===&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/10Cvt-SgO8hwysrjqPDJTtEVQ04D5patrupOIjMZNEXI/edit?usp=sharing Универсальный список минус-слов]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1BorOC1656JsQqusbOFMelrLBeQ0oubG4tZAC7qz99rY/edit?usp=sharing Маркеры фото/видео]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1e-ufRW_U7YtIfcIhwB2xkzPZknB4dhio8wyPk4bzqwY/edit?usp=sharing Маркеры Отзывы]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1plzxFOPhxUOSE0w48tcthDsraxDoMsJwRh2pht4gWac/edit?usp=sharing Маркеры Поиск работы]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1NxeLczmT1CfwZusNl5hhxeyQuZGiM0gWl4Jv9ZLDZ5E/edit?usp=sharing Города РФ]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1dwnqJhlwTxmvvX4lVI4scw4w26UFuKlPsXA_X17o1zk/edit?usp=sharing Города Украины]&lt;br /&gt;
&lt;br /&gt;
== Google Ads| Фиды ==&lt;br /&gt;
[[Подстановка городов в текст объявления]]&lt;br /&gt;
&lt;br /&gt;
[[Динамический ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
[[Фид Merchant Center]]&lt;br /&gt;
&lt;br /&gt;
= Facebook Ads =&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Подготовительные работы ==&lt;br /&gt;
&lt;br /&gt;
[[Создание/подключение страниц Facebook/Instagram]]&lt;br /&gt;
&lt;br /&gt;
[[Создание/подключение рекламного аккаунта Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка целей/событий Facebook Pixel]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка сложных аудиторий для ремаркетинга в Facebook Pixel]]&lt;br /&gt;
&lt;br /&gt;
[[Пополнение аккаунта Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Создание рекламных кампаний ==&lt;br /&gt;
&lt;br /&gt;
[[Формирование структуры аккаунта;]]&lt;br /&gt;
&lt;br /&gt;
[[Создание кампании с определенной целью]]&lt;br /&gt;
&lt;br /&gt;
[[Создание группы объявлений]]&lt;br /&gt;
&lt;br /&gt;
[[Создание объявления]]&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads| Фиды ==&lt;br /&gt;
&lt;br /&gt;
[[Фид Facebook]]&lt;br /&gt;
&lt;br /&gt;
[[Динамический ремаркетинг Facebook]]&lt;br /&gt;
&lt;br /&gt;
= Прочее =&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1px34aztXFLvZ8Rotbz1ZT1x8-H0EYBMZionfODcFBLM/edit?usp=sharing Требования к рекламным объявлениям]&lt;br /&gt;
&lt;br /&gt;
[[Требования к спискам электронных адресов]]&lt;br /&gt;
&lt;br /&gt;
[[Все варианты таргетинга Facebook Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Все варианты таргетинга в КМС Google Ads]]&lt;br /&gt;
&lt;br /&gt;
[[Требования к условиям возврата  товара и денег]]&lt;br /&gt;
&lt;br /&gt;
[[Требования к форме заказа]]&lt;br /&gt;
&lt;br /&gt;
[[Полезные ссылки]]&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1806</id>
		<title>Пополнение аккаунта</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1806"/>
		<updated>2019-10-11T11:27:25Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Google Ads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Google Ads==&lt;br /&gt;
* С помощью конвертера [https://privatbank.ua/ru Приватбанк] высчитать двойную конвертацию от указанной в задаче суммы&lt;br /&gt;
# Выставляем &amp;quot;Для карта&amp;quot; - https://privatbank.ua/ru&lt;br /&gt;
# Украинская гривна &amp;gt; Доллар США&lt;br /&gt;
# С помощью стрелок меняем валюту местами [[Файл:Конвертация.png|1000px|мини|центр]]&lt;br /&gt;
* Пополняем аккаунт на полученную сумму, предварительно узнав платежную карту у @Julia Alexeeva&lt;br /&gt;
* Вносим затраты в ERP - [http://erp.raskrutka.com.ua/finance/expences раздел Финансы]&lt;br /&gt;
* Сумму пополнения и проект дублируем в директ @Julia Alexeeva&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads==&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9A%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B0%D1%86%D0%B8%D1%8F.png&amp;diff=1805</id>
		<title>Файл:Конвертация.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9A%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B0%D1%86%D0%B8%D1%8F.png&amp;diff=1805"/>
		<updated>2019-10-11T11:27:12Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;конвертация&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%BF%D0%BE_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%83_%D0%B7%D0%B0_%D0%BC%D0%B5%D1%81%D1%8F%D1%86&amp;diff=1804</id>
		<title>Отчет по проекту за месяц</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%BF%D0%BE_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%83_%D0%B7%D0%B0_%D0%BC%D0%B5%D1%81%D1%8F%D1%86&amp;diff=1804"/>
		<updated>2019-10-11T11:25:43Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Первый отчет по проекту: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Google Ads ==&lt;br /&gt;
Отчёт должен содержать '''все выполненные работы за отчётный период проекта и статистику работы рекламных кампаний'''.&lt;br /&gt;
&lt;br /&gt;
Основная часть проведенных работ находится в [http://erp.raskrutka.com.ua/modules/report-designer конструкторе отчётов].&lt;br /&gt;
Проставляем галочки возле выполненных работ, описание будет отображаться в поле ниже, при необходимости текст можно отредактировать.&lt;br /&gt;
Если была проведена работа, которой нет в конструкторе, необходимо самостоятельно ее расписать.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статистику рекламных кампаний создаем с помощью сервиса datastudio.google.com.&lt;br /&gt;
&lt;br /&gt;
==== Первый отчет по проекту: ==== &lt;br /&gt;
* Создать копию [https://datastudio.google.com/open/1e03mODDf-q14pO0WyO0zNlnyHSeCz7T4 шаблона] [[Файл:Копия шаблона.png|1000px|мини|центр]]&lt;br /&gt;
*Подключить источник данных:&lt;br /&gt;
''В нижней части справа &amp;quot;Создать источник данных&amp;quot; -&amp;gt; AdWords -&amp;gt; Найти необходимый аккаунт'' [[Файл:Источник данных.png|1000px|мини|центр]]&lt;br /&gt;
*Добавить лого клиента&lt;br /&gt;
* Выставить нужную дату (фиксированные даты)&lt;br /&gt;
&lt;br /&gt;
==== Последующие отчеты: ====&lt;br /&gt;
* Зайти в аккаунт datastudio.google.com&lt;br /&gt;
* Найти предыдущий отчет по нужному проекту&lt;br /&gt;
* Создать копию&lt;br /&gt;
* Выставить нужную дату&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После списка выполненных работ и статистики расписать предложения по проекту на следующий месяц, а также дополнительную информацию для PM (если необходимо)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пример отчета:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://datastudio.google.com/open/149yRNrHzQ2mbLIWB-ul7RrKrwhoQGMzn&lt;br /&gt;
&lt;br /&gt;
ПРОДЕЛАННЫЕ РАБОТЫ&lt;br /&gt;
➣ Сбор и группировка семантического ядра&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Составлены текста объявлений. На каждую группу минимум по 3 объявления, что помогает улучшить их ротацию, определить системе наиболее привлекательные и эффективные объявления и показывать их чаще;&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Проработан начальный список минус-слов для блокировки показа рекламы по нецелевым запросам пользователей;&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Настроена поисковая кампания с таргетингом на целевые местоположения Израиль, Украина, Россия, США, Франция, Германия, Великобритания, Китай;&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Настроены все доступные и актуальные для клиента расширения объявлений - дополнительные ссылки, номера телефонов, уточнения, структурированные описания. Данные расширения помогают визуально увеличить объявление, сделать его привлекательное, предоставить пользователю дополнительную информацию, что в свою очередь повышает CTR объявлений и уменьшает стоимость клика;&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Настроены аккаунты Google Analytics и Google Tag Manager, установлен код отслеживания на сайт;&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Установлена связь аккаунтов Google Analytics и Google Ads, настроены и импортированы цели:&lt;br /&gt;
- Обратная связь&lt;br /&gt;
- Клик по номеру телефона&lt;br /&gt;
- Форма 2&lt;br /&gt;
- Клик на E-mail&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Настроены сложные аудитории Google Analytics для сбора и дальнейшего использования в ремаркетинговых кампаниях:&lt;br /&gt;
- Все пользователи - 30д&lt;br /&gt;
- udive_/en/_достигнутые цели = 0_30д&lt;br /&gt;
- udive_/ru/_достигнутые цели = 0_30д&lt;br /&gt;
- udive_все пользователи_/en/_30д&lt;br /&gt;
- udive_все пользователи_/ru/_30д&lt;br /&gt;
- udive-все пользователи-180д&lt;br /&gt;
- udive-все пользователи-360д&lt;br /&gt;
- udive-все пользователи-540д&lt;br /&gt;
- udive-все пользователи-90д&lt;br /&gt;
- udive-достигнутые цели = 0&lt;br /&gt;
- udive-достигнутые цели ≠ 0&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Настройка аудиторий, содержащих нецелевых для бизнеса пользователей, для исключения их из кампаний. Данные действия также предназначены для снижения вероятности скликивания рекламы конкурентами и, в свою очередь, сохранения рекламного бюджета:&lt;br /&gt;
- udive_просмотры страниц = 0_540д&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Настройка кампании КМС.&lt;br /&gt;
Все таргетинги для кампаний КМС доступны по ссылке https://docs.google.com/spreadsheets/d/1o06nx-02VTjChdDyV6NopfS-habRK4WnEB49EEtjODY/edit?usp=sharing на вкладке &amp;quot;Таргетинг(КМС)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для исключения нецелевого трафика и сохранения рекламного бюджета, соответственно, были исключены показы рекламы на сайтах игровой тематики, играх, мобильных приложениях, деликатных категориях сайтов.&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Настройка кампании ремаркетинга. Таргетинг https://docs.google.com/spreadsheets/d/1o06nx-02VTjChdDyV6NopfS-habRK4WnEB49EEtjODY/edit?usp=sharing на вкладке &amp;quot;Ремаркетинг&amp;quot;&lt;br /&gt;
Для исключения нецелевого трафика и сохранения рекламного бюджета, соответственно, были исключены показы рекламы на сайтах игровой тематики, играх, мобильных приложениях, деликатных категориях сайтов.&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Проведение аудита поисковых запросов пользователей, чистка нерелевантных запросов;&lt;br /&gt;
Расширение списка минус-слов;&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Добавлены адаптивные поисковые объявления, которые позволяют чаще участвовать в аукционах и охватывать больше потенциальных клиентов.&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ В поисковые кампании с опцией наблюдения добавлены аудитории по интересам&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Запущен скрип и составлены тепловые карты для понимания в какое время реклама получает наибольшее количество кликов, показов, конверсий. Исходя из полученных данных настроен и запущен скрипт по корректировке ставок 24/7&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ США и Китай были отключены из таргетинга, т.к. реклама по этим местоположениям неэффективна&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ПЛАНИРУЕМ&lt;br /&gt;
➣ Аудит и анализ эффективности рекламных объявления. Создание и добавление новых текстов объявлений.&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Настройка видеорекламы с таргетингом на:&lt;br /&gt;
- youtube-каналы&lt;br /&gt;
- интересы;&lt;br /&gt;
- ключевые слова&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Чистка нерелевантных и малоэффективных мест размещения для КМС кампаний&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
➣ Подключение новых стран, высланных клиентом.&lt;br /&gt;
Хотя на самом деле до сентября я бы делала упор только на Израиль, а на остальные (существующие) кампании либо свела до минимума бюджеты, либо пока приотсановила&lt;br /&gt;
-----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Дополнительно:&lt;br /&gt;
&lt;br /&gt;
Статистика по конверсиям:&lt;br /&gt;
пометка тегом работает с 24/07&lt;br /&gt;
За это время в CRM 29 лидов&lt;br /&gt;
Wrong lead - 9&lt;br /&gt;
No interest - 7&lt;br /&gt;
Negotiating - 9&lt;br /&gt;
New - 4&lt;br /&gt;
В Google рекламе 11 (adwords) /12 (analytics)&lt;br /&gt;
Facebook - 1&lt;br /&gt;
Обратная связь - 16&lt;br /&gt;
Форма2 - 4&lt;br /&gt;
Клик по номеру телефона - 6:&lt;br /&gt;
14/07 - 1&lt;br /&gt;
16/07 - 2&lt;br /&gt;
24/07, 26/07, 31/07 - по 1&lt;br /&gt;
+ до 24/07&lt;br /&gt;
В Google рекламе 15 (adwords) / 17 (analytics)&lt;br /&gt;
Facebook - 3&lt;br /&gt;
&lt;br /&gt;
По поводу расхождения данных adwords и analytics - это в принципе нормально. В этих сервисах идет различие в том, как они это подсчитывают&lt;br /&gt;
Количество конверсий у нас расходится на одну две, это не критично&lt;br /&gt;
если бы разрыв между данными был большой, тогда уже скорее всего можно было сделать вывод о том, что что-то неправильно срабатывает&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Facebook Ads ==&lt;br /&gt;
&lt;br /&gt;
Отчёт должен содержать все выполненные работы за отчётный период проекта и статистику работы рекламных кампаний.&lt;br /&gt;
&lt;br /&gt;
Основная часть проведенных работ находится в конструкторе отчётов. Проставляем галочки возле выполненных работ, описание будет отображаться в поле ниже, при необходимости текст можно отредактировать. Если была проведена работа, которой нет в конструкторе, необходимо самостоятельно ее расписать.&lt;br /&gt;
&lt;br /&gt;
Статистику рекламных кампаний создаем с помощью сервиса datastudio.google.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. В Ads Manager выбираем основные столбцы, которые отражают результативность рекламы  -  http://prntscr.com/pcuyev  -  http://prntscr.com/pcuzdn&lt;br /&gt;
&lt;br /&gt;
2. Выбираем &amp;quot;Разбивка&amp;quot; - &amp;quot;День&amp;quot;  -  http://prntscr.com/pcv1b4&lt;br /&gt;
&lt;br /&gt;
3. Экспортируем в формате csv  -  http://prntscr.com/pcv1ne&lt;br /&gt;
&lt;br /&gt;
4. Заходим на сервис  -  datastudio.google.com&lt;br /&gt;
&lt;br /&gt;
5. Выбираем шаблон:&lt;br /&gt;
&lt;br /&gt;
https://datastudio.google.com/u/1/reporting/1D8fjS9rRaYrgthKWDkx8FMb7QvgWe_1M/page/VgD/edit&lt;br /&gt;
&lt;br /&gt;
6. Добавляем ресурсы:&lt;br /&gt;
&lt;br /&gt;
- Google Analytics ( В нижней части справа &amp;quot;Создать источник данных&amp;quot; http://prntscr.com/pcuawv -&amp;gt; Google Analytics -&amp;gt; Найти необходимый аккаунт . Затем добавить фильтр Facebook + Instagram&lt;br /&gt;
&lt;br /&gt;
- Facebook Ads ( Загрузка файла -&amp;gt; Загрузить файл ) , Меняем типы  -  http://prntscr.com/pcvja4&lt;br /&gt;
&lt;br /&gt;
7. Применяем все ресурсы к данным&lt;br /&gt;
&lt;br /&gt;
8. Добавляем лого клиента&lt;br /&gt;
&lt;br /&gt;
После списка выполненных работ и статистики расписать предложения по проекту на следующий месяц.&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85.png&amp;diff=1803</id>
		<title>Файл:Источник данных.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85.png&amp;diff=1803"/>
		<updated>2019-10-11T11:25:28Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Источник данных&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9A%D0%BE%D0%BF%D0%B8%D1%8F_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0.png&amp;diff=1802</id>
		<title>Файл:Копия шаблона.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9A%D0%BE%D0%BF%D0%B8%D1%8F_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0.png&amp;diff=1802"/>
		<updated>2019-10-11T11:24:30Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Копия шаблона&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1799</id>
		<title>Аудит аккаунта</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1799"/>
		<updated>2019-10-11T11:01:46Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Таргетинг */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Общее =&lt;br /&gt;
* Настроен и установлен GTM&lt;br /&gt;
* Настроен Google Analytics&lt;br /&gt;
* Созданы списки аудиторий для ремаркетинга&lt;br /&gt;
* Созданы аудитории для исключения&lt;br /&gt;
* Настроено отслеживание целей, все цели корректно работают&lt;br /&gt;
* Настроен импорт основных конверсий из аккаунта Google Analytics в аккаунт Google Ads&lt;br /&gt;
&lt;br /&gt;
= Поисковая кампания =&lt;br /&gt;
==== Основные настройки ====&lt;br /&gt;
* Выбран правильный тип кампании&lt;br /&gt;
* Выставлены корректные, целевые местоположения для показа рекламы&lt;br /&gt;
* Выставлены корректные Варианты местоположений [[Файл:Варианты местоположений.png|мини|центр|1000px]]&lt;br /&gt;
* Верно указаны языковые настройки&lt;br /&gt;
* Выставлена правильная стратегия&lt;br /&gt;
* Выбран корректный способ ротации объявлений&lt;br /&gt;
* Настроено расписание показов объявлений (если требуется)&lt;br /&gt;
* Верно установлено ограничение частоты показов&lt;br /&gt;
* Настроены UTM-метки (если требуется)&lt;br /&gt;
&lt;br /&gt;
==== Ключевые слова ====&lt;br /&gt;
* Собрано корректное семантическое ядро, не содержится нерелевантных ключевых слов&lt;br /&gt;
* Проведена корректная группировка семантического ядра&lt;br /&gt;
* Ключевые слова в группе соответствуют текстам объявлений&lt;br /&gt;
* Выбран корректный тип соответствия ключевых слов (фразовое, точное, модификатор), в 90% случаях ключевых слов в широком соответствии быть не должно&lt;br /&gt;
* Подключены общие списки минус-слов&lt;br /&gt;
* Удалены дубликаты ключевых слов (можно проверить через Google Editor)&lt;br /&gt;
* Установлена корректная ставка&lt;br /&gt;
* Выполнена кросс-минусовка (при необходимости)&lt;br /&gt;
&lt;br /&gt;
==== Объявления ====&lt;br /&gt;
* Каждая группа содержит по крайней мере 3 варианта объявлений. Экспериментируйте с оформлением (используйте различную пунктуацию, заглавные буквы, динамическую вставку ключевых слов в текст и отображаемый URL), включайте в объявление информацию о ценах, доставке, используйте призыв к действию.&lt;br /&gt;
* Текст объявления соответствует посадочным страницам&lt;br /&gt;
* Целевые URL работают и ведут на корректную страницу (проверьте хотя бы по одному объявлению из различных групп объявлений)&lt;br /&gt;
* Нет отклоненных объявлений&lt;br /&gt;
* Добавлены все возможные расширения объявлений (дополнительные ссылки, номера телефонов, уточнения, структурированные описания, адреса, сообщения)&lt;br /&gt;
&lt;br /&gt;
= КМС + Ремаркетинг =&lt;br /&gt;
&lt;br /&gt;
==== Основные настройки ====&lt;br /&gt;
* Выбран правильный тип кампании&lt;br /&gt;
* Выставлены корректные, целевые местоположения для показа рекламы&lt;br /&gt;
* Выставлены корректные Варианты местоположений [[Файл:Варианты местоположений.png|мини|центр|1000px]]&lt;br /&gt;
* Верно указаны языковые настройки&lt;br /&gt;
* Выставлена правильная стратегия&lt;br /&gt;
* Выбран корректный способ ротации объявлений&lt;br /&gt;
* Настроено расписание показов объявлений (если требуется)&lt;br /&gt;
* Верно установлено ограничение частоты показов&lt;br /&gt;
* Настроены UTM-метки (если требуется)&lt;br /&gt;
* Задан Исключенный контент [[Файл:Исключенный контент.png|1000px|мини|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Объявления ====&lt;br /&gt;
* Каждая группа содержит по крайней мере 2 варианта объявлений. Экспериментируйте с оформлением (используйте различную пунктуацию, заглавные буквы, динамическую вставку ключевых слов в текст и отображаемый URL), включайте в объявление информацию о ценах, доставке, используйте призыв к действию.&lt;br /&gt;
* Текст объявления соответствует посадочным страницам&lt;br /&gt;
* Целевые URL работают и ведут на корректную страницу (проверьте хотя бы по одному объявлению из различных групп объявлений)&lt;br /&gt;
* Нет отклоненных объявлений&lt;br /&gt;
==== Таргетинг ====&lt;br /&gt;
&lt;br /&gt;
* Корректно определены методы таргетинга КМС&lt;br /&gt;
* Если группа настроена на определенные Места размещения, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* Если группа настроена на определенные Темы, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* Если группа настроена на определенные Интересы или Аудитории, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* В каждой группе выбрано НЕ БОЛЕЕ одного метода таргетинга (напр.: отдельно Группа с таргетингом по Ключевым словам; отдельно группа с таргетингом по Интересам; отдельно группа с таргетином по Темам и т.п.). Несколько методов в одной группе выбрано только там, где это действительно необходимо (очень узкий охват для специфической аудитории).&lt;br /&gt;
* Выключено Расширение таргетинга [[Файл:Расширение таргетинга.png|1000px|мини|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Исключения ====&lt;br /&gt;
* Заданы исключения тем&lt;br /&gt;
* Заданы исключения аудиторий&lt;br /&gt;
* Заданы исключения мест размещения&lt;br /&gt;
* Настроен скрипт чистки площадок&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B0%D1%80%D0%B3%D0%B5%D1%82%D0%B8%D0%BD%D0%B3%D0%B0.png&amp;diff=1798</id>
		<title>Файл:Расширение таргетинга.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B0%D1%80%D0%B3%D0%B5%D1%82%D0%B8%D0%BD%D0%B3%D0%B0.png&amp;diff=1798"/>
		<updated>2019-10-11T11:01:35Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Расширение таргетинга&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1796</id>
		<title>Аудит аккаунта</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1796"/>
		<updated>2019-10-11T11:00:20Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* КМС + Ремаркетинг */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Общее =&lt;br /&gt;
* Настроен и установлен GTM&lt;br /&gt;
* Настроен Google Analytics&lt;br /&gt;
* Созданы списки аудиторий для ремаркетинга&lt;br /&gt;
* Созданы аудитории для исключения&lt;br /&gt;
* Настроено отслеживание целей, все цели корректно работают&lt;br /&gt;
* Настроен импорт основных конверсий из аккаунта Google Analytics в аккаунт Google Ads&lt;br /&gt;
&lt;br /&gt;
= Поисковая кампания =&lt;br /&gt;
==== Основные настройки ====&lt;br /&gt;
* Выбран правильный тип кампании&lt;br /&gt;
* Выставлены корректные, целевые местоположения для показа рекламы&lt;br /&gt;
* Выставлены корректные Варианты местоположений [[Файл:Варианты местоположений.png|мини|центр|1000px]]&lt;br /&gt;
* Верно указаны языковые настройки&lt;br /&gt;
* Выставлена правильная стратегия&lt;br /&gt;
* Выбран корректный способ ротации объявлений&lt;br /&gt;
* Настроено расписание показов объявлений (если требуется)&lt;br /&gt;
* Верно установлено ограничение частоты показов&lt;br /&gt;
* Настроены UTM-метки (если требуется)&lt;br /&gt;
&lt;br /&gt;
==== Ключевые слова ====&lt;br /&gt;
* Собрано корректное семантическое ядро, не содержится нерелевантных ключевых слов&lt;br /&gt;
* Проведена корректная группировка семантического ядра&lt;br /&gt;
* Ключевые слова в группе соответствуют текстам объявлений&lt;br /&gt;
* Выбран корректный тип соответствия ключевых слов (фразовое, точное, модификатор), в 90% случаях ключевых слов в широком соответствии быть не должно&lt;br /&gt;
* Подключены общие списки минус-слов&lt;br /&gt;
* Удалены дубликаты ключевых слов (можно проверить через Google Editor)&lt;br /&gt;
* Установлена корректная ставка&lt;br /&gt;
* Выполнена кросс-минусовка (при необходимости)&lt;br /&gt;
&lt;br /&gt;
==== Объявления ====&lt;br /&gt;
* Каждая группа содержит по крайней мере 3 варианта объявлений. Экспериментируйте с оформлением (используйте различную пунктуацию, заглавные буквы, динамическую вставку ключевых слов в текст и отображаемый URL), включайте в объявление информацию о ценах, доставке, используйте призыв к действию.&lt;br /&gt;
* Текст объявления соответствует посадочным страницам&lt;br /&gt;
* Целевые URL работают и ведут на корректную страницу (проверьте хотя бы по одному объявлению из различных групп объявлений)&lt;br /&gt;
* Нет отклоненных объявлений&lt;br /&gt;
* Добавлены все возможные расширения объявлений (дополнительные ссылки, номера телефонов, уточнения, структурированные описания, адреса, сообщения)&lt;br /&gt;
&lt;br /&gt;
= КМС + Ремаркетинг =&lt;br /&gt;
&lt;br /&gt;
==== Основные настройки ====&lt;br /&gt;
* Выбран правильный тип кампании&lt;br /&gt;
* Выставлены корректные, целевые местоположения для показа рекламы&lt;br /&gt;
* Выставлены корректные Варианты местоположений [[Файл:Варианты местоположений.png|мини|центр|1000px]]&lt;br /&gt;
* Верно указаны языковые настройки&lt;br /&gt;
* Выставлена правильная стратегия&lt;br /&gt;
* Выбран корректный способ ротации объявлений&lt;br /&gt;
* Настроено расписание показов объявлений (если требуется)&lt;br /&gt;
* Верно установлено ограничение частоты показов&lt;br /&gt;
* Настроены UTM-метки (если требуется)&lt;br /&gt;
* Задан Исключенный контент [[Файл:Исключенный контент.png|1000px|мини|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Объявления ====&lt;br /&gt;
* Каждая группа содержит по крайней мере 2 варианта объявлений. Экспериментируйте с оформлением (используйте различную пунктуацию, заглавные буквы, динамическую вставку ключевых слов в текст и отображаемый URL), включайте в объявление информацию о ценах, доставке, используйте призыв к действию.&lt;br /&gt;
* Текст объявления соответствует посадочным страницам&lt;br /&gt;
* Целевые URL работают и ведут на корректную страницу (проверьте хотя бы по одному объявлению из различных групп объявлений)&lt;br /&gt;
* Нет отклоненных объявлений&lt;br /&gt;
==== Таргетинг ====&lt;br /&gt;
&lt;br /&gt;
* Корректно определены методы таргетинга КМС&lt;br /&gt;
* Если группа настроена на определенные Места размещения, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* Если группа настроена на определенные Темы, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* Если группа настроена на определенные Интересы или Аудитории, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* В каждой группе выбрано НЕ БОЛЕЕ одного метода таргетинга (напр.: отдельно Группа с таргетингом по Ключевым словам; отдельно группа с таргетингом по Интересам; отдельно группа с таргетином по Темам и т.п.). Несколько методов в одной группе выбрано только там, где это действительно необходимо (очень узкий охват для специфической аудитории).&lt;br /&gt;
* Выключено Расширение таргетинга - http://prntscr.com/pcvi7k&lt;br /&gt;
&lt;br /&gt;
==== Исключения ====&lt;br /&gt;
* Заданы исключения тем&lt;br /&gt;
* Заданы исключения аудиторий&lt;br /&gt;
* Заданы исключения мест размещения&lt;br /&gt;
* Настроен скрипт чистки площадок&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82.png&amp;diff=1795</id>
		<title>Файл:Исключенный контент.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82.png&amp;diff=1795"/>
		<updated>2019-10-11T11:00:06Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Исключенный контент&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1793</id>
		<title>Аудит аккаунта</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1793"/>
		<updated>2019-10-11T10:59:08Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Поисковая кампания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Общее =&lt;br /&gt;
* Настроен и установлен GTM&lt;br /&gt;
* Настроен Google Analytics&lt;br /&gt;
* Созданы списки аудиторий для ремаркетинга&lt;br /&gt;
* Созданы аудитории для исключения&lt;br /&gt;
* Настроено отслеживание целей, все цели корректно работают&lt;br /&gt;
* Настроен импорт основных конверсий из аккаунта Google Analytics в аккаунт Google Ads&lt;br /&gt;
&lt;br /&gt;
= Поисковая кампания =&lt;br /&gt;
==== Основные настройки ====&lt;br /&gt;
* Выбран правильный тип кампании&lt;br /&gt;
* Выставлены корректные, целевые местоположения для показа рекламы&lt;br /&gt;
* Выставлены корректные Варианты местоположений [[Файл:Варианты местоположений.png|мини|центр|1000px]]&lt;br /&gt;
* Верно указаны языковые настройки&lt;br /&gt;
* Выставлена правильная стратегия&lt;br /&gt;
* Выбран корректный способ ротации объявлений&lt;br /&gt;
* Настроено расписание показов объявлений (если требуется)&lt;br /&gt;
* Верно установлено ограничение частоты показов&lt;br /&gt;
* Настроены UTM-метки (если требуется)&lt;br /&gt;
&lt;br /&gt;
==== Ключевые слова ====&lt;br /&gt;
* Собрано корректное семантическое ядро, не содержится нерелевантных ключевых слов&lt;br /&gt;
* Проведена корректная группировка семантического ядра&lt;br /&gt;
* Ключевые слова в группе соответствуют текстам объявлений&lt;br /&gt;
* Выбран корректный тип соответствия ключевых слов (фразовое, точное, модификатор), в 90% случаях ключевых слов в широком соответствии быть не должно&lt;br /&gt;
* Подключены общие списки минус-слов&lt;br /&gt;
* Удалены дубликаты ключевых слов (можно проверить через Google Editor)&lt;br /&gt;
* Установлена корректная ставка&lt;br /&gt;
* Выполнена кросс-минусовка (при необходимости)&lt;br /&gt;
&lt;br /&gt;
==== Объявления ====&lt;br /&gt;
* Каждая группа содержит по крайней мере 3 варианта объявлений. Экспериментируйте с оформлением (используйте различную пунктуацию, заглавные буквы, динамическую вставку ключевых слов в текст и отображаемый URL), включайте в объявление информацию о ценах, доставке, используйте призыв к действию.&lt;br /&gt;
* Текст объявления соответствует посадочным страницам&lt;br /&gt;
* Целевые URL работают и ведут на корректную страницу (проверьте хотя бы по одному объявлению из различных групп объявлений)&lt;br /&gt;
* Нет отклоненных объявлений&lt;br /&gt;
* Добавлены все возможные расширения объявлений (дополнительные ссылки, номера телефонов, уточнения, структурированные описания, адреса, сообщения)&lt;br /&gt;
&lt;br /&gt;
= КМС + Ремаркетинг =&lt;br /&gt;
&lt;br /&gt;
==== Основные настройки ====&lt;br /&gt;
* Выбран правильный тип кампании&lt;br /&gt;
* Выставлены корректные, целевые местоположения для показа рекламы&lt;br /&gt;
* Выставлены корректные Варианты местоположений - http://prntscr.com/pcv5vu&lt;br /&gt;
* Верно указаны языковые настройки&lt;br /&gt;
* Выставлена правильная стратегия&lt;br /&gt;
* Выбран корректный способ ротации объявлений&lt;br /&gt;
* Настроено расписание показов объявлений (если требуется)&lt;br /&gt;
* Верно установлено ограничение частоты показов&lt;br /&gt;
* Настроены UTM-метки (если требуется)&lt;br /&gt;
* Задан Исключенный контент - http://prntscr.com/pcvbt1&lt;br /&gt;
&lt;br /&gt;
==== Объявления ====&lt;br /&gt;
* Каждая группа содержит по крайней мере 2 варианта объявлений. Экспериментируйте с оформлением (используйте различную пунктуацию, заглавные буквы, динамическую вставку ключевых слов в текст и отображаемый URL), включайте в объявление информацию о ценах, доставке, используйте призыв к действию.&lt;br /&gt;
* Текст объявления соответствует посадочным страницам&lt;br /&gt;
* Целевые URL работают и ведут на корректную страницу (проверьте хотя бы по одному объявлению из различных групп объявлений)&lt;br /&gt;
* Нет отклоненных объявлений&lt;br /&gt;
==== Таргетинг ====&lt;br /&gt;
&lt;br /&gt;
* Корректно определены методы таргетинга КМС&lt;br /&gt;
* Если группа настроена на определенные Места размещения, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* Если группа настроена на определенные Темы, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* Если группа настроена на определенные Интересы или Аудитории, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* В каждой группе выбрано НЕ БОЛЕЕ одного метода таргетинга (напр.: отдельно Группа с таргетингом по Ключевым словам; отдельно группа с таргетингом по Интересам; отдельно группа с таргетином по Темам и т.п.). Несколько методов в одной группе выбрано только там, где это действительно необходимо (очень узкий охват для специфической аудитории).&lt;br /&gt;
* Выключено Расширение таргетинга - http://prntscr.com/pcvi7k&lt;br /&gt;
&lt;br /&gt;
==== Исключения ====&lt;br /&gt;
* Заданы исключения тем&lt;br /&gt;
* Заданы исключения аудиторий&lt;br /&gt;
* Заданы исключения мест размещения&lt;br /&gt;
* Настроен скрипт чистки площадок&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1792</id>
		<title>Аудит аккаунта</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82%D0%B0&amp;diff=1792"/>
		<updated>2019-10-11T10:58:16Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: /* Поисковая кампания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Общее =&lt;br /&gt;
* Настроен и установлен GTM&lt;br /&gt;
* Настроен Google Analytics&lt;br /&gt;
* Созданы списки аудиторий для ремаркетинга&lt;br /&gt;
* Созданы аудитории для исключения&lt;br /&gt;
* Настроено отслеживание целей, все цели корректно работают&lt;br /&gt;
* Настроен импорт основных конверсий из аккаунта Google Analytics в аккаунт Google Ads&lt;br /&gt;
&lt;br /&gt;
= Поисковая кампания =&lt;br /&gt;
==== Основные настройки ====&lt;br /&gt;
* Выбран правильный тип кампании&lt;br /&gt;
* Выставлены корректные, целевые местоположения для показа рекламы&lt;br /&gt;
* Выставлены корректные Варианты местоположений &lt;br /&gt;
[[Файл:Варианты местоположений.png|мини|центр|1000px]]&lt;br /&gt;
* Верно указаны языковые настройки&lt;br /&gt;
* Выставлена правильная стратегия&lt;br /&gt;
* Выбран корректный способ ротации объявлений&lt;br /&gt;
* Настроено расписание показов объявлений (если требуется)&lt;br /&gt;
* Верно установлено ограничение частоты показов&lt;br /&gt;
* Настроены UTM-метки (если требуется)&lt;br /&gt;
&lt;br /&gt;
==== Ключевые слова ====&lt;br /&gt;
* Собрано корректное семантическое ядро, не содержится нерелевантных ключевых слов&lt;br /&gt;
* Проведена корректная группировка семантического ядра&lt;br /&gt;
* Ключевые слова в группе соответствуют текстам объявлений&lt;br /&gt;
* Выбран корректный тип соответствия ключевых слов (фразовое, точное, модификатор), в 90% случаях ключевых слов в широком соответствии быть не должно&lt;br /&gt;
* Подключены общие списки минус-слов&lt;br /&gt;
* Удалены дубликаты ключевых слов (можно проверить через Google Editor)&lt;br /&gt;
* Установлена корректная ставка&lt;br /&gt;
* Выполнена кросс-минусовка (при необходимости)&lt;br /&gt;
&lt;br /&gt;
==== Объявления ====&lt;br /&gt;
* Каждая группа содержит по крайней мере 3 варианта объявлений. Экспериментируйте с оформлением (используйте различную пунктуацию, заглавные буквы, динамическую вставку ключевых слов в текст и отображаемый URL), включайте в объявление информацию о ценах, доставке, используйте призыв к действию.&lt;br /&gt;
* Текст объявления соответствует посадочным страницам&lt;br /&gt;
* Целевые URL работают и ведут на корректную страницу (проверьте хотя бы по одному объявлению из различных групп объявлений)&lt;br /&gt;
* Нет отклоненных объявлений&lt;br /&gt;
* Добавлены все возможные расширения объявлений (дополнительные ссылки, номера телефонов, уточнения, структурированные описания, адреса, сообщения)&lt;br /&gt;
&lt;br /&gt;
= КМС + Ремаркетинг =&lt;br /&gt;
&lt;br /&gt;
==== Основные настройки ====&lt;br /&gt;
* Выбран правильный тип кампании&lt;br /&gt;
* Выставлены корректные, целевые местоположения для показа рекламы&lt;br /&gt;
* Выставлены корректные Варианты местоположений - http://prntscr.com/pcv5vu&lt;br /&gt;
* Верно указаны языковые настройки&lt;br /&gt;
* Выставлена правильная стратегия&lt;br /&gt;
* Выбран корректный способ ротации объявлений&lt;br /&gt;
* Настроено расписание показов объявлений (если требуется)&lt;br /&gt;
* Верно установлено ограничение частоты показов&lt;br /&gt;
* Настроены UTM-метки (если требуется)&lt;br /&gt;
* Задан Исключенный контент - http://prntscr.com/pcvbt1&lt;br /&gt;
&lt;br /&gt;
==== Объявления ====&lt;br /&gt;
* Каждая группа содержит по крайней мере 2 варианта объявлений. Экспериментируйте с оформлением (используйте различную пунктуацию, заглавные буквы, динамическую вставку ключевых слов в текст и отображаемый URL), включайте в объявление информацию о ценах, доставке, используйте призыв к действию.&lt;br /&gt;
* Текст объявления соответствует посадочным страницам&lt;br /&gt;
* Целевые URL работают и ведут на корректную страницу (проверьте хотя бы по одному объявлению из различных групп объявлений)&lt;br /&gt;
* Нет отклоненных объявлений&lt;br /&gt;
==== Таргетинг ====&lt;br /&gt;
&lt;br /&gt;
* Корректно определены методы таргетинга КМС&lt;br /&gt;
* Если группа настроена на определенные Места размещения, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* Если группа настроена на определенные Темы, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* Если группа настроена на определенные Интересы или Аудитории, ключевые слова НЕ добавлены в качестве метода таргетинга&lt;br /&gt;
* В каждой группе выбрано НЕ БОЛЕЕ одного метода таргетинга (напр.: отдельно Группа с таргетингом по Ключевым словам; отдельно группа с таргетингом по Интересам; отдельно группа с таргетином по Темам и т.п.). Несколько методов в одной группе выбрано только там, где это действительно необходимо (очень узкий охват для специфической аудитории).&lt;br /&gt;
* Выключено Расширение таргетинга - http://prntscr.com/pcvi7k&lt;br /&gt;
&lt;br /&gt;
==== Исключения ====&lt;br /&gt;
* Заданы исключения тем&lt;br /&gt;
* Заданы исключения аудиторий&lt;br /&gt;
* Заданы исключения мест размещения&lt;br /&gt;
* Настроен скрипт чистки площадок&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D1%8B_%D0%BC%D0%B5%D1%81%D1%82%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9.png&amp;diff=1791</id>
		<title>Файл:Варианты местоположений.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D1%8B_%D0%BC%D0%B5%D1%81%D1%82%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9.png&amp;diff=1791"/>
		<updated>2019-10-11T10:57:36Z</updated>

		<summary type="html">&lt;p&gt;Ilonamaksimova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Варианты местоположений&lt;/div&gt;</summary>
		<author><name>Ilonamaksimova</name></author>
		
	</entry>
</feed>