<?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=77.122.65.227</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=77.122.65.227"/>
	<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/77.122.65.227"/>
	<updated>2026-07-16T06:43:11Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=PPC_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=794</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=794"/>
		<updated>2018-03-02T13:14:16Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &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;
[[Создание аккаунта AdWords]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка поисковой кампании]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка ремаркетинга]]&lt;br /&gt;
&lt;br /&gt;
[[Связывание AdWords и Analytics  и импорт целей]]&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;
== Скрипты ==&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;
[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/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;
== Фиды ==&lt;br /&gt;
[[Подстановка городов в текст объявления]]&lt;br /&gt;
&lt;br /&gt;
[[Динамический ремаркетинг]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1px34aztXFLvZ8Rotbz1ZT1x8-H0EYBMZionfODcFBLM/edit?usp=sharing Требования к рекламным объявлениям]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=770</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=770"/>
		<updated>2018-02-22T12:49:36Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) Конвертим наши статьи в формат utf-8 https://subtitletools.com/convert-text-files-to-utf8-online&amp;lt;br&amp;gt;&lt;br /&gt;
б) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
в) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
г) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech, quickseo1, zimaseo, seorankbuilder, wickedsubmit, Sarj84, webnesia, service24&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</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_Google_Analytics&amp;diff=769</id>
		<title>Настройка Google Analytics</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_Google_Analytics&amp;diff=769"/>
		<updated>2018-02-22T12:24:26Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;1.Создание представлений&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Master view - для ежедневной работы, применены все фильтры, настроены цели, эл. коммерция и так далее.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Test view - для тестов и AB тестирования всякого.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Raw data - представление вообще без фильтров и настроек конфигурации - с сырыми и необработанными данными, в качестве бэкапа.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2.В Master view включаем «Отслеживание поиска по сайту». В поле «Параметр запроса» вносим параметр поиска.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3.Включаем «Фильтрация роботов»&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4.В Master view отсекаем весь зарубежный трафик, это нас сразу спасет от накруток ботов, всякого аналитикс спама, китайских ботов и покажет реальную картину.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;5.В Master view вносим в фильтр офисный ip.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;6.Настраиваем оповещения (если они не включены)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Organic traffic visits decreased by more than -&amp;gt; 20% -&amp;gt; previous week&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Adwords traffic visits decreased by more than -&amp;gt; 20% -&amp;gt; previous week&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;No traffic: All Traffic sessions &amp;lt; 1 – Daily&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Не было ни одной конверсии&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Количество конверсий уменьшилось на 20% по сравнению с предыдущей неделей&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;показатель отказов меньше 5% (некорректно отрабатывает)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;не было транзакций (не работает эл. торговля) за неделю – при условии, что ЭТ настроена&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;7.В Master view в аннотации вносим важные для продвижения действия. Например, переезд на https, окончание внутренней оптимизации итд.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;8.В Master view настраиваем цели&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;9.В Master view устанавливаем seo дашборд https://analytics.google.com/analytics/gallery/#posts/search/%3F_.viewId%3DJLbPyFF7TliTeenfawqBPg/&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;10.Включаем сбор данных по демографии.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;11.Соединяем с search console.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;12. Добавляется настройка аудиторий&amp;lt;/p&amp;gt;&lt;br /&gt;
Обязательно и минимум&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Все посетители&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Все посетители за 30 дней&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Все посетители за 180 дней &amp;lt;br /&amp;gt;&lt;br /&gt;
4. Все кто совершил целевую конверсию (лид)&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Все кто не совершил целевую конверсию (лид)&amp;lt;br /&amp;gt;&lt;br /&gt;
6. ТОП 5% пользователей по времени на сайте&amp;lt;br /&amp;gt;&lt;br /&gt;
7. ТОП 15% по количеству просмотренных страниц&amp;lt;br /&amp;gt;&lt;br /&gt;
8. Все кто посетил 2 страницы&amp;lt;br /&amp;gt;&lt;br /&gt;
9. Все кто посетил 3 страницы &amp;lt;br /&amp;gt;&lt;br /&gt;
10. Все кто посетил 4 страницы &amp;lt;br /&amp;gt;&lt;br /&gt;
11. Определить информационные лендинги и создать аудиторию тех кто посетил именно их (пример на раскрутке страница SEO и страница PPC )&amp;lt;br /&amp;gt;&lt;br /&gt;
Тут речь идет о наиболее важных (трафиковых) страницах. Их важность определяет либо клиент, либо мы на основании самых трафиковых страниц сайта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; 13. Включить настройку &amp;quot;Пользователи&amp;quot;  в отчеты , в настройках ресурса.&amp;lt;br /&amp;gt;&lt;br /&gt;
14. В диспетчере тегов добавляем FB Pixel &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</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_Google_Analytics&amp;diff=768</id>
		<title>Настройка Google Analytics</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_Google_Analytics&amp;diff=768"/>
		<updated>2018-02-22T12:23:14Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;1.Создание представлений&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Master view - для ежедневной работы, применены все фильтры, настроены цели, эл. коммерция и так далее.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Test view - для тестов и AB тестирования всякого.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Raw data - представление вообще без фильтров и настроек конфигурации - с сырыми и необработанными данными, в качестве бэкапа.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2.В Master view включаем «Отслеживание поиска по сайту». В поле «Параметр запроса» вносим параметр поиска.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3.Включаем «Фильтрация роботов»&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4.В Master view отсекаем весь зарубежный трафик, это нас сразу спасет от накруток ботов, всякого аналитикс спама, китайских ботов и покажет реальную картину.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;5.В Master view вносим в фильтр офисный ip.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;6.Настраиваем оповещения (если они не включены)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Organic traffic visits decreased by more than -&amp;gt; 20% -&amp;gt; previous week&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Adwords traffic visits decreased by more than -&amp;gt; 20% -&amp;gt; previous week&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;No traffic: All Traffic sessions &amp;lt; 1 – Daily&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Не было ни одной конверсии&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Количество конверсий уменьшилось на 20% по сравнению с предыдущей неделей&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;показатель отказов меньше 5% (некорректно отрабатывает)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;не было транзакций (не работает эл. торговля) за неделю – при условии, что ЭТ настроена&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;7.В Master view в аннотации вносим важные для продвижения действия. Например, переезд на https, окончание внутренней оптимизации итд.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;8.В Master view настраиваем цели&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;9.В Master view устанавливаем seo дашборд https://analytics.google.com/analytics/gallery/#posts/search/%3F_.viewId%3DJLbPyFF7TliTeenfawqBPg/&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;10.Включаем сбор данных по демографии.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;11.Соединяем с search console.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;12. Добавляется настройка аудиторий&amp;lt;/p&amp;gt;&lt;br /&gt;
Обязательно и минимум&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Все посетители&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Все посетители за 30 дней&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Все посетители за 180 дней &amp;lt;br /&amp;gt;&lt;br /&gt;
4. Все кто совершил целевую конверсию (лид)&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Все кто не совершил целевую конверсию (лид)&amp;lt;br /&amp;gt;&lt;br /&gt;
6. ТОП 5% пользователей по времени на сайте&amp;lt;br /&amp;gt;&lt;br /&gt;
7. ТОП 15% по количеству просмотренных страниц&amp;lt;br /&amp;gt;&lt;br /&gt;
8. Все кто посетил 2 страницы&amp;lt;br /&amp;gt;&lt;br /&gt;
9. Все кто посетил 3 страницы &amp;lt;br /&amp;gt;&lt;br /&gt;
10. Все кто посетил 4 страницы &amp;lt;br /&amp;gt;&lt;br /&gt;
11. Определить информационные лендинги и создать аудиторию тех кто посетил именно их (пример на раскрутке страница SEO и страница PPC )&amp;lt;br /&amp;gt;&lt;br /&gt;
Тут речь идет о наиболее важных (трафиковых) страницах. Их важность определяет либо клиент, либо мы на основании самых трафиковых страниц сайта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; 13. Включить настройку &amp;quot;Пользователи&amp;quot;  в отчеты , в настройках ресурса.&lt;br /&gt;
14. В диспетчере тегов добавляем FB Pixel &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Facebook Pixel Code --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  !function(f,b,e,v,n,t,s)&lt;br /&gt;
  {if(f.fbq)return;n=f.fbq=function(){n.callMethod?&lt;br /&gt;
  n.callMethod.apply(n,arguments):n.queue.push(arguments)};&lt;br /&gt;
  if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';&lt;br /&gt;
  n.queue=[];t=b.createElement(e);t.async=!0;&lt;br /&gt;
  t.src=v;s=b.getElementsByTagName(e)[0];&lt;br /&gt;
  s.parentNode.insertBefore(t,s)}(window, document,'script',&lt;br /&gt;
  'https://connect.facebook.net/en_US/fbevents.js');&lt;br /&gt;
  fbq('init', '142773559696964');&lt;br /&gt;
  fbq('track', 'PageView');&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;img height=&amp;quot;1&amp;quot; width=&amp;quot;1&amp;quot; style=&amp;quot;display:none&amp;quot;&lt;br /&gt;
  src=&amp;quot;https://www.facebook.com/tr?id=142773559696964&amp;amp;ev=PageView&amp;amp;noscript=1&amp;quot;&lt;br /&gt;
/&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Facebook Pixel Code --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=737</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=737"/>
		<updated>2018-02-15T09:13:35Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: /* PBN схема по закупке ссылок */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) Конвертим наши статьи в формат utf-8 https://subtitletools.com/convert-text-files-to-utf8-online&amp;lt;br&amp;gt;&lt;br /&gt;
б) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
в) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
г) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech, quickseo1, zimaseo, seorankbuilder, wickedsubmit, Sarj84, webnesia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2_%D0%BD%D0%B0_YouTube&amp;diff=718</id>
		<title>Поиск тематических каналов на YouTube</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2_%D0%BD%D0%B0_YouTube&amp;diff=718"/>
		<updated>2018-02-13T15:55:17Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1. Создаем копию таблицы https://docs.google.com/spreadsheets/d/1143JnVo0DONPNKi4r2Go9qfpQKYokspzYa__yqZH9tE/edit?usp=sharing под своим аккаунтом&lt;br /&gt;
&lt;br /&gt;
2. Вставляем ключевые слова на первую вкладку таблицы&lt;br /&gt;
&lt;br /&gt;
3. Скопировать нижеприведенный скрипт в Скрипты Adwords&lt;br /&gt;
&lt;br /&gt;
4. Включить расширенный API на YouTube.&lt;br /&gt;
&lt;br /&gt;
5. Запустить просмотр выполнения скрипта. Если потребуется авторизация скрипта — все разрешить.&lt;br /&gt;
&lt;br /&gt;
При первом запуске возникает ошибка. Чтобы избавиться от нее, нужно по ссылке из Журнала перейти в консоль разработчика и включить API.&lt;br /&gt;
&lt;br /&gt;
6. Снова запускаем просмотр выполнения скрипта и получаем список тематических каналов на второй вкладке вашей таблицы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function main() {&lt;br /&gt;
  var spreadsheetUrl = &amp;quot; ССЫЛКА НА ТАБЛИЦУ &amp;quot;;&lt;br /&gt;
  var ss = SpreadsheetApp.openByUrl(spreadsheetUrl);&lt;br /&gt;
  var kwSheet = ss.getSheetByName('Слова');&lt;br /&gt;
  var resSheet = ss.getSheetByName('Площадки');&lt;br /&gt;
  var lastRow = kwSheet.getLastRow();&lt;br /&gt;
  resSheet.clear();&lt;br /&gt;
  var range = kwSheet.getRange(1, 1, lastRow+1, 1);&lt;br /&gt;
  var values = range.getValues();&lt;br /&gt;
  var placements = [];&lt;br /&gt;
  for(var i = 0; values.length - 1 &amp;gt; i; i++) {&lt;br /&gt;
  var query = values[i][0];&lt;br /&gt;
var results = YouTube.Search.list('id,snippet', {q: query, maxResults: 25, type: 'channel'});&lt;br /&gt;
  for (var j in results.items) {&lt;br /&gt;
 var item = results.items[j];&lt;br /&gt;
  placements.push(['youtube.com/channel/'+item.id.channelId,item.snippet.title]);&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
 resSheet.getRange(1, 1, placements.length, 2).setValues(placements);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2_%D0%BD%D0%B0_YouTube&amp;diff=717</id>
		<title>Поиск тематических каналов на YouTube</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2_%D0%BD%D0%B0_YouTube&amp;diff=717"/>
		<updated>2018-02-13T15:53:26Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1. Создаем копию таблицы https://docs.google.com/spreadsheets/d/1143JnVo0DONPNKi4r2Go9qfpQKYokspzYa__yqZH9tE/edit?usp=sharing под своим аккаунтом&lt;br /&gt;
&lt;br /&gt;
2. Вставляем ключевые слова на первую вкладку таблицы&lt;br /&gt;
&lt;br /&gt;
3. Скопировать нижеприведенный скрипт в Скрипты Adwords&lt;br /&gt;
&lt;br /&gt;
4. Включить расширенный API на YouTube.&lt;br /&gt;
&lt;br /&gt;
5. Запустить просмотр выполнения скрипта. Если потребуется авторизация скрипта — все разрешить.&lt;br /&gt;
&lt;br /&gt;
При первом запуске возникает ошибка. Чтобы избавиться от нее, нужно по ссылке из Журнала перейти в консоль разработчика и включить API.&lt;br /&gt;
&lt;br /&gt;
6. Снова запускаем просмотр выполнения скрипта и получаем список тематических каналов на второй вкладке вашей таблицы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function main() {&lt;br /&gt;
  var spreadsheetUrl = &amp;quot;'''ссылка на вашу таблицу'''&amp;quot;;&lt;br /&gt;
  var ss = SpreadsheetApp.openByUrl(spreadsheetUrl);&lt;br /&gt;
  var kwSheet = ss.getSheetByName('Слова');&lt;br /&gt;
  var resSheet = ss.getSheetByName('Площадки');&lt;br /&gt;
  var lastRow = kwSheet.getLastRow();&lt;br /&gt;
  resSheet.clear();&lt;br /&gt;
  var range = kwSheet.getRange(1, 1, lastRow+1, 1);&lt;br /&gt;
  var values = range.getValues();&lt;br /&gt;
  var placements = [];&lt;br /&gt;
  for(var i = 0; values.length - 1 &amp;gt; i; i++) {&lt;br /&gt;
  var query = values[i][0];&lt;br /&gt;
var results = YouTube.Search.list('id,snippet', {q: query, maxResults: 25, type: 'channel'});&lt;br /&gt;
  for (var j in results.items) {&lt;br /&gt;
 var item = results.items[j];&lt;br /&gt;
  placements.push(['youtube.com/channel/'+item.id.channelId,item.snippet.title]);&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
 resSheet.getRange(1, 1, placements.length, 2).setValues(placements);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B0_%D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9_%D0%BD%D0%B0_%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9&amp;diff=716</id>
		<title>Изменение формата объявлений на новый</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B0_%D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9_%D0%BD%D0%B0_%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9&amp;diff=716"/>
		<updated>2018-02-13T15:45:04Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: « &amp;lt;pre&amp;gt; // @license Copyright 2016, Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;); // you may not use this…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// @license Copyright 2016, Google Inc. All Rights Reserved.&lt;br /&gt;
//&lt;br /&gt;
// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
// you may not use this file except in compliance with the License.&lt;br /&gt;
// You may obtain a copy of the License at&lt;br /&gt;
//&lt;br /&gt;
//     http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
//&lt;br /&gt;
// Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
// See the License for the specific language governing permissions and&lt;br /&gt;
// limitations under the License.&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @name ETA Transition Helper.&lt;br /&gt;
 *&lt;br /&gt;
 * @overview An AdWords Script that exports standard text ads from an account&lt;br /&gt;
 *           to a Spreadsheet and then imports newly created expanded text ads&lt;br /&gt;
 *           back to the AdWords account.&lt;br /&gt;
 *&lt;br /&gt;
 *           see https://developers.google.com/adwords/scripts/docs/solutions/mccapp-eta-transition-helper&lt;br /&gt;
 *           for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * @author AdWords Scripts Team [adwords-scripts@googlegroups.com]&lt;br /&gt;
 *&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 *&lt;br /&gt;
 * @changelog&lt;br /&gt;
 * - version 1.0&lt;br /&gt;
 *   - Released initial version.&lt;br /&gt;
 */&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////// CONFIGURATION ///////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
var CONFIG = {&lt;br /&gt;
  // Select by CIDs (For MCC only).&lt;br /&gt;
  //selectByAccountIds: ['123-456-7890', '098-765-4321'],&lt;br /&gt;
&lt;br /&gt;
  // Select by sub-mcc (For MCC only).&lt;br /&gt;
  //selectBySubMccId: '123-456-7890',&lt;br /&gt;
&lt;br /&gt;
  // Recipient email address for script notifications.&lt;br /&gt;
  email: 'mcc@raskrutka.com.ua',&lt;br /&gt;
&lt;br /&gt;
  // Set DEBUG mode. In this mode, the script will print messages to the log&lt;br /&gt;
  // output screen.&lt;br /&gt;
  debug: true,&lt;br /&gt;
&lt;br /&gt;
  spreadsheet: {&lt;br /&gt;
    // ID of template spreadsheet.&lt;br /&gt;
    templateId: '1C66jjF57dZ5Me8vbUDnXTRXTNekHIVEwEQF8PnVD9Ks',&lt;br /&gt;
&lt;br /&gt;
    // Name of the spreadsheet where all ads are exported and later imported to&lt;br /&gt;
    // upload ETAs.&lt;br /&gt;
    targetName: 'ETA Transition Helper v1.0',&lt;br /&gt;
&lt;br /&gt;
    // Stores a reference to Sheet.&lt;br /&gt;
    // Do not set any values for `sheet`, this is dynamically filled when&lt;br /&gt;
    // initialized.&lt;br /&gt;
    sheet: null,&lt;br /&gt;
&lt;br /&gt;
    // The name of the sheet inside the spreadsheet.&lt;br /&gt;
    sheetName: 'main',&lt;br /&gt;
&lt;br /&gt;
    // The first row where the content starts.&lt;br /&gt;
    firstContentRow: 4,&lt;br /&gt;
&lt;br /&gt;
    // The row index, in spreadsheet, where header is located.&lt;br /&gt;
    headerRow: 3,&lt;br /&gt;
&lt;br /&gt;
    // Column to check and determine if row is not empty.&lt;br /&gt;
    nonEmptyColumnCheck: 'customerName',&lt;br /&gt;
&lt;br /&gt;
    // Holds mappings between column names and their spreadsheet index.&lt;br /&gt;
    // Do not set any values for `columnNamesToIndices`, this is dynamically&lt;br /&gt;
    // filled when initialized.&lt;br /&gt;
    columnNamesToIndices: {},&lt;br /&gt;
&lt;br /&gt;
    // Default status for each new ETA.&lt;br /&gt;
    defaultStatus: 'paused',&lt;br /&gt;
&lt;br /&gt;
    // Column mapping.&lt;br /&gt;
    columns: [&lt;br /&gt;
              // User and Ad parent (Adgroup and Campaign) information.&lt;br /&gt;
              'customerId',&lt;br /&gt;
              'customerName',&lt;br /&gt;
              'campaignId',&lt;br /&gt;
              'campaignName',&lt;br /&gt;
              'adGroupId',&lt;br /&gt;
              'adGroupName',&lt;br /&gt;
&lt;br /&gt;
              // STA related attributes (Read Only).&lt;br /&gt;
              'staId',&lt;br /&gt;
              'headline',&lt;br /&gt;
              'description1',&lt;br /&gt;
              'description2',&lt;br /&gt;
              'staApprovalStatus',&lt;br /&gt;
              'displayUrl',&lt;br /&gt;
&lt;br /&gt;
              // STA related attributes (Editable).&lt;br /&gt;
              'staStatus',&lt;br /&gt;
&lt;br /&gt;
              // STA performance metrics (Read Only).&lt;br /&gt;
              'impressions',&lt;br /&gt;
              'clicks',&lt;br /&gt;
              'ctr',&lt;br /&gt;
&lt;br /&gt;
              // Shared attributes between both ETA and STA (Editable).&lt;br /&gt;
              'finalUrl',&lt;br /&gt;
              'mobileFinalUrl',&lt;br /&gt;
              'trackingTemplate',&lt;br /&gt;
              'customParameters',&lt;br /&gt;
              'labels',&lt;br /&gt;
&lt;br /&gt;
              // ETA related attributes (Editable).&lt;br /&gt;
              'headline1',&lt;br /&gt;
              'charactersRemainingH1',&lt;br /&gt;
              'headline2',&lt;br /&gt;
              'charactersRemainingH2',&lt;br /&gt;
              'description',&lt;br /&gt;
              'charactersRemainingDesc',&lt;br /&gt;
              'path1',&lt;br /&gt;
              'path2',&lt;br /&gt;
              'etaStatus',&lt;br /&gt;
&lt;br /&gt;
              // ETA related attributes (Read Only).&lt;br /&gt;
              'etaApprovalStatus',&lt;br /&gt;
              'etaCreated',&lt;br /&gt;
              'etaId',&lt;br /&gt;
&lt;br /&gt;
              'readyToUpload',&lt;br /&gt;
&lt;br /&gt;
              'errorMessage'],&lt;br /&gt;
&lt;br /&gt;
    // Map between report fields and spreadsheet columns.&lt;br /&gt;
    // This mapping is used when exporting report data&lt;br /&gt;
    // to the spreadsheet. Will skip fields with `null` values.&lt;br /&gt;
    reportFieldMap: {&lt;br /&gt;
      customerId: 'accountId',&lt;br /&gt;
      customerName: 'accountName',&lt;br /&gt;
      campaignId: 'campaignId',&lt;br /&gt;
      campaignName: 'campaignName',&lt;br /&gt;
      adGroupId: 'adGroupId',&lt;br /&gt;
      adGroupName: 'adGroupName',&lt;br /&gt;
&lt;br /&gt;
      staId: 'id',&lt;br /&gt;
      headline: 'headline',&lt;br /&gt;
      description1: 'description1',&lt;br /&gt;
      description2: 'description2',&lt;br /&gt;
      staApprovalStatus: 'creativeApprovalStatus',&lt;br /&gt;
      displayUrl: 'displayUrl',&lt;br /&gt;
      staStatus: 'status',&lt;br /&gt;
&lt;br /&gt;
      impressions: 'impressions',&lt;br /&gt;
      clicks: 'clicks',&lt;br /&gt;
      ctr: 'ctr',&lt;br /&gt;
&lt;br /&gt;
      finalUrl: 'creativeFinalUrls',&lt;br /&gt;
      mobileFinalUrl: 'creativeFinalMobileUrls',&lt;br /&gt;
      trackingTemplate: 'creativeTrackingUrlTemplate',&lt;br /&gt;
      customParameters: 'creativeUrlCustomParameters',&lt;br /&gt;
      labels: 'labels',&lt;br /&gt;
&lt;br /&gt;
      headline1: 'headlinePart1',&lt;br /&gt;
      charactersRemainingH1: null,&lt;br /&gt;
      headline2: 'headlinePart2',&lt;br /&gt;
      charactersRemainingH2: null,&lt;br /&gt;
      description: 'description',&lt;br /&gt;
      charactersRemainingDesc: null,&lt;br /&gt;
      path1: 'path1',&lt;br /&gt;
      path2: 'path2',&lt;br /&gt;
      etaStatus: null,&lt;br /&gt;
&lt;br /&gt;
      etaApprovalStatus: null,&lt;br /&gt;
      etaCreated: null,&lt;br /&gt;
      etaId: null,&lt;br /&gt;
&lt;br /&gt;
      readyToUpload: null,&lt;br /&gt;
&lt;br /&gt;
      errorMessage: null&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Columns with formulas to avoid overriding.&lt;br /&gt;
    // Will copy these fields when appending new rows in the spreadsheet.&lt;br /&gt;
    columnsWithFormulas: ['charactersRemainingH1',&lt;br /&gt;
                          'charactersRemainingH2',&lt;br /&gt;
                          'charactersRemainingDesc',&lt;br /&gt;
                          'etaCreated']&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // The total number of ads we would like to handle.&lt;br /&gt;
  numOfAds: 800,&lt;br /&gt;
&lt;br /&gt;
  // The total number of accounts we would like to handle (MCC only).&lt;br /&gt;
  numOfAccounts: 50,&lt;br /&gt;
&lt;br /&gt;
  // The duration used to download the Ad Performance Report.&lt;br /&gt;
  duration: 'LAST_30_DAYS',&lt;br /&gt;
&lt;br /&gt;
  // The API version to use when downloading the Ad Performance Report.&lt;br /&gt;
  apiVersion: 'v201607',&lt;br /&gt;
&lt;br /&gt;
  // When sorting ads by performance, use the values listed here as a criteria&lt;br /&gt;
  // when comparing different performance values. For example, if ad A has&lt;br /&gt;
  // 100 impressions and ad B has 90 impressions, ad A should be more important&lt;br /&gt;
  // for us - unless impressionsThreshold is equal or higher to 10, then we'll&lt;br /&gt;
  // consider both ads with the same magnitude of impressions and therefore&lt;br /&gt;
  // compare their CTR.&lt;br /&gt;
  performance: {&lt;br /&gt;
    impressionsThreshold: 10,&lt;br /&gt;
    ctrThreshold: 0.1&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // Fields to select from Ad Performance Report and export to selected&lt;br /&gt;
  // spreadsheet.&lt;br /&gt;
  reportFields: ['CampaignId', 'CampaignName', 'AdGroupId', 'AdGroupName', 'Id',&lt;br /&gt;
                 'Headline', 'Description1', 'Description2',&lt;br /&gt;
                 'CreativeApprovalStatus', 'DisplayUrl',&lt;br /&gt;
&lt;br /&gt;
                 'Status',&lt;br /&gt;
&lt;br /&gt;
                 'Impressions', 'Clicks', 'Ctr',&lt;br /&gt;
&lt;br /&gt;
                 'CreativeFinalUrls', 'CreativeFinalMobileUrls',&lt;br /&gt;
                 'CreativeTrackingUrlTemplate', 'CreativeUrlCustomParameters',&lt;br /&gt;
                 'Labels',&lt;br /&gt;
&lt;br /&gt;
                 'HeadlinePart1', 'HeadlinePart2', 'Description',&lt;br /&gt;
                 'Path1', 'Path2'&lt;br /&gt;
  ],&lt;br /&gt;
&lt;br /&gt;
  // The default label to apply to Ads if no value is present in the label&lt;br /&gt;
  // column.&lt;br /&gt;
  defaultLabelName: 'eta-upgrade',&lt;br /&gt;
&lt;br /&gt;
  // Cache key for storing changes done to platform.&lt;br /&gt;
  changeCacheKey: 'platform_changes',&lt;br /&gt;
&lt;br /&gt;
  // Time the value will remain in the cache, in seconds.&lt;br /&gt;
  cacheExpiration: 21600,&lt;br /&gt;
&lt;br /&gt;
  // The start date to filter ETA reports by.&lt;br /&gt;
  etaReportStartDate: '20160801'&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Email template types.&lt;br /&gt;
var SPREADSHEET_CREATED = 1;&lt;br /&gt;
&lt;br /&gt;
// Preview mode indicator.&lt;br /&gt;
var IS_PREVIEW = AdWordsApp.getExecutionInfo().isPreview();&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
///////////////////////////////// MAIN ///////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
// Declaration required for non-MCC accounts.&lt;br /&gt;
var MccApp = MccApp || undefined;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Main application entry.&lt;br /&gt;
 *&lt;br /&gt;
 * This will run first.&lt;br /&gt;
 */&lt;br /&gt;
function main() {&lt;br /&gt;
  initConfig();&lt;br /&gt;
&lt;br /&gt;
  if (!validateSpreadsheet(CONFIG.spreadsheet)) {&lt;br /&gt;
    Logger.log('Terminating execution due to malformed spreadsheet format.');&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var errorCount;&lt;br /&gt;
  if (MccApp) {&lt;br /&gt;
    print('Exporting STAs from MCC');&lt;br /&gt;
    printExportResults(exportSTAMCC());&lt;br /&gt;
&lt;br /&gt;
    print('Processing spreadsheet');&lt;br /&gt;
    errorCount = syncSpreadsheetMCC();&lt;br /&gt;
    print('Processing complete');&lt;br /&gt;
  } else {&lt;br /&gt;
    print('Exporting STAs from account');&lt;br /&gt;
    printExportResults(exportSTA(CONFIG.numOfAds));&lt;br /&gt;
&lt;br /&gt;
    print('Processing spreadsheet');&lt;br /&gt;
    errorCount = syncSpreadsheet();&lt;br /&gt;
    print('Processing complete');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (errorCount &amp;gt; 0) {&lt;br /&gt;
    throw 'Script runtime error. An error occured, please check the logs.';&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes dynamic properties of CONFIG.&lt;br /&gt;
 */&lt;br /&gt;
function initConfig() {&lt;br /&gt;
  var sheet = getCachedSheet(CONFIG.spreadsheet, CONFIG.email);&lt;br /&gt;
  var spreadsheet = sheet.getParent();&lt;br /&gt;
  if (!canEditSpreadsheet(spreadsheet)) {&lt;br /&gt;
    throw 'User account does not have permission to edit the spreadsheet. ' +&lt;br /&gt;
          'Please ensure the permission is set to `Can Edit` instead of ' +&lt;br /&gt;
          '`Can Comment` or `Can View`.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!sheet) {&lt;br /&gt;
    throw 'Could not find a sheet named &amp;quot;' + CONFIG.spreadsheet.sheetName +&lt;br /&gt;
        '&amp;quot; in the spreadsheet. Please fix your spreadsheet.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  CONFIG.spreadsheet.sheet = sheet;&lt;br /&gt;
&lt;br /&gt;
  CONFIG.spreadsheet.columns.forEach(function(columnName, index) {&lt;br /&gt;
    CONFIG.spreadsheet.columnNamesToIndices[columnName] = index;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Set default email address to the spreadsheet's owner email address.&lt;br /&gt;
  if (isEmptyString(CONFIG.email)) {&lt;br /&gt;
    CONFIG.email = getFileOwnerEmail(spreadsheet);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Notify which email address is used.&lt;br /&gt;
  print('* This script will send notifications to: ' + CONFIG.email);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Checks the number of accounts to process and warns the user if the number&lt;br /&gt;
 * is above the recommended threshold.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {ManagedAccountIterator} accountIterator The account iterator of the&lt;br /&gt;
 *   accounts that will be used.&lt;br /&gt;
 */&lt;br /&gt;
function processAccountLimit(accountIterator) {&lt;br /&gt;
  var accountsToProcess = accountIterator.totalNumEntities();&lt;br /&gt;
  print('Accounts to process: ' + accountsToProcess);&lt;br /&gt;
  if (accountsToProcess &amp;gt; CONFIG.numOfAccounts) {&lt;br /&gt;
    print('WARNING: Number of accounts is above the recommended threshold: ' +&lt;br /&gt;
        CONFIG.numOfAccounts);&lt;br /&gt;
    print('Please use &amp;quot;selectByAccountIds&amp;quot; or &amp;quot;selectBySubMccId&amp;quot; to select');&lt;br /&gt;
    print('which accounts to use from the CONFIG');&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Get the accountIterator from the MCC using the selectors specified in the&lt;br /&gt;
 * config.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {ManagedAccountIterator} The iterator for the selected accounts.&lt;br /&gt;
 * @throws {string}&lt;br /&gt;
 */&lt;br /&gt;
function getAccountIteratorFromMCC() {&lt;br /&gt;
  var selectBySubMccId = CONFIG.selectBySubMccId || null;&lt;br /&gt;
  var selectByAccountIds = CONFIG.selectByAccountIds || null;&lt;br /&gt;
&lt;br /&gt;
  // Build account iterator.&lt;br /&gt;
  var accIterBuild = MccApp.accounts();&lt;br /&gt;
&lt;br /&gt;
  // Restrict to sub-mcc.&lt;br /&gt;
  if (selectBySubMccId) {&lt;br /&gt;
    if (!isString(selectBySubMccId)) {&lt;br /&gt;
      throw 'selectBySubMccId: is not a string';&lt;br /&gt;
    }&lt;br /&gt;
    accIterBuild = accIterBuild.withCondition(&amp;quot;ManagerCustomerId = '&amp;quot; +&lt;br /&gt;
        validateCid(selectBySubMccId) + &amp;quot;'&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Restrict to list of account IDs.&lt;br /&gt;
  if (selectByAccountIds) {&lt;br /&gt;
    if (!Array.isArray(selectByAccountIds)) {&lt;br /&gt;
      throw 'selectByAccountIds: is not an Array';&lt;br /&gt;
    }&lt;br /&gt;
    for (var i = 0; i &amp;lt; selectByAccountIds.length; i++) {&lt;br /&gt;
      validateCid(selectByAccountIds[i]);&lt;br /&gt;
    }&lt;br /&gt;
    accIterBuild = accIterBuild.withIds(selectByAccountIds);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return accIterBuild.get();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * From the Ad Performance Report, copy all enabled and&lt;br /&gt;
 * not disapproved Text Ads to the configured spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * This function operates only for MCC accounts.&lt;br /&gt;
 *&lt;br /&gt;
 * The function will iterate over each client sub-account exporting in turn.&lt;br /&gt;
 * @return {{exportedCount: number,&lt;br /&gt;
 *           remainingRowCount: number,&lt;br /&gt;
 *           accountsProcessed: number}}&lt;br /&gt;
 *           An object containing statistics from the STA export.&lt;br /&gt;
 *             exportedCount     The number of exported Ads during exportSTA.&lt;br /&gt;
 *             remainingRowCount The number of remaining rows available in the&lt;br /&gt;
 *                               spreadsheet.&lt;br /&gt;
 *             accountsProcessed The number of accounts processed in the export.&lt;br /&gt;
 */&lt;br /&gt;
function exportSTAMCC() {&lt;br /&gt;
  // Store the current MCC account.&lt;br /&gt;
  var mccAccount = AdWordsApp.currentAccount();&lt;br /&gt;
&lt;br /&gt;
  // Count the number of available STAs to export.&lt;br /&gt;
  var maxAdsToExport = CONFIG.numOfAds;&lt;br /&gt;
&lt;br /&gt;
  var resultObject = {&lt;br /&gt;
    exportedCount: 0,&lt;br /&gt;
    remainingRowCount: maxAdsToExport,&lt;br /&gt;
    accountsProcessed: 0&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  // Get account iterator from MCC config.&lt;br /&gt;
  var accountIterator;&lt;br /&gt;
  try {&lt;br /&gt;
    accountIterator = getAccountIteratorFromMCC();&lt;br /&gt;
  }&lt;br /&gt;
  catch (err) {&lt;br /&gt;
    print(err);&lt;br /&gt;
    return resultObject;&lt;br /&gt;
  }&lt;br /&gt;
  if (accountIterator) {&lt;br /&gt;
    processAccountLimit(accountIterator);&lt;br /&gt;
    while (accountIterator.hasNext()) {&lt;br /&gt;
      var account = accountIterator.next();&lt;br /&gt;
&lt;br /&gt;
      // Set the account as the client account as the active account.&lt;br /&gt;
      MccApp.select(account);&lt;br /&gt;
      print('Account: ' + account.getName() +&lt;br /&gt;
                 ' (' + account.getCustomerId() + ')');&lt;br /&gt;
&lt;br /&gt;
      // Execute the export.&lt;br /&gt;
      var exportResult = exportSTA(maxAdsToExport);&lt;br /&gt;
&lt;br /&gt;
      resultObject.exportedCount += exportResult.exportedCount;&lt;br /&gt;
      resultObject.remainingRowCount = exportResult.remainingRowCount;&lt;br /&gt;
      resultObject.accountsProcessed++;&lt;br /&gt;
&lt;br /&gt;
      if (resultObject.remainingRowCount &amp;lt;= 0) {&lt;br /&gt;
        print('Maximum number of Ads reached, skipping export');&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  MccApp.select(mccAccount);&lt;br /&gt;
&lt;br /&gt;
  return resultObject;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * From the Ad Performance Report, copy all enabled and&lt;br /&gt;
 * not disapproved Text Ads to the configured spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {number} maxAdsToExport The maximum number of ads to export.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {{exportedCount: number,&lt;br /&gt;
 *           remainingRowCount: number}}&lt;br /&gt;
 *           An object containing statistics from the STA export.&lt;br /&gt;
 *             exportedCount     The number of exported Ads during exportSTA.&lt;br /&gt;
 *             remainingRowCount The number of remaining rows available in the&lt;br /&gt;
 *                               spreadsheet.&lt;br /&gt;
 */&lt;br /&gt;
function exportSTA(maxAdsToExport) {&lt;br /&gt;
  if (isEmpty(maxAdsToExport) || isNaN(maxAdsToExport)) {&lt;br /&gt;
    throw 'Failed to export STAs to the spreadsheet. Please specify a ' +&lt;br /&gt;
          'valid integer number in CONFIG.numOfAds.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Download Ad Performance Report.&lt;br /&gt;
  // Get the top most performing ads.&lt;br /&gt;
  var report = AdWordsApp.report(&lt;br /&gt;
      'SELECT ' + CONFIG.reportFields.join(',') + ' ' +&lt;br /&gt;
      'FROM     AD_PERFORMANCE_REPORT ' +&lt;br /&gt;
      'WHERE    AdType = &amp;quot;TEXT_AD&amp;quot; ' +&lt;br /&gt;
      '         AND AdGroupStatus = &amp;quot;ENABLED&amp;quot; ' +&lt;br /&gt;
      '         AND CampaignStatus = &amp;quot;ENABLED&amp;quot; ' +&lt;br /&gt;
      '         AND Status = &amp;quot;ENABLED&amp;quot; ' +&lt;br /&gt;
      '         AND CreativeApprovalStatus != &amp;quot;DISAPPROVED&amp;quot; ' +&lt;br /&gt;
      'DURING   ' + CONFIG.duration, {&lt;br /&gt;
        apiVersion: CONFIG.apiVersion&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
  var resultObject = {&lt;br /&gt;
    exportedCount: 0,&lt;br /&gt;
    remainingRowCount: maxAdsToExport,&lt;br /&gt;
    accountsProcessed: 1&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  var mostPerformingAds = getMostPerformingAds(report, CONFIG);&lt;br /&gt;
  if (mostPerformingAds !== null) {&lt;br /&gt;
    // Open spreadsheet.&lt;br /&gt;
    var sheet = getCachedSheet(CONFIG.spreadsheet, CONFIG.email);&lt;br /&gt;
&lt;br /&gt;
    var rowObject = getContentRows(sheet,&lt;br /&gt;
                                    CONFIG.spreadsheet.firstContentRow,&lt;br /&gt;
                                    CONFIG.spreadsheet.nonEmptyColumnCheck,&lt;br /&gt;
                                    CONFIG.spreadsheet.columnNamesToIndices,&lt;br /&gt;
                                    false);&lt;br /&gt;
    var nonEmptyRows = rowObject.rows;&lt;br /&gt;
&lt;br /&gt;
    // If sheet is not empty, only export ads not present in sheet.&lt;br /&gt;
    if (nonEmptyRows.length &amp;gt; 0) {&lt;br /&gt;
      // Switch `mostPerformingAds` to an id=&amp;gt;Ad object structure.&lt;br /&gt;
      var mostPerformingAdsObject =&lt;br /&gt;
          createIndexableObjectFromKeys(mostPerformingAds, ['id']);&lt;br /&gt;
&lt;br /&gt;
      // For any ad present in the spreadsheet, set value to null.&lt;br /&gt;
      nonEmptyRows.forEach(function(row) {&lt;br /&gt;
        var staId = row.getNumber('staId');&lt;br /&gt;
        if (staId in mostPerformingAdsObject) {&lt;br /&gt;
          mostPerformingAdsObject[staId] = null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Subtract the number of empty ETAs from the total ads available&lt;br /&gt;
        // to export. This will preserve a bounded number of ETAs in the&lt;br /&gt;
        // spreadsheet.&lt;br /&gt;
        var etaId = row.getString('etaId');&lt;br /&gt;
        if (isEmptyString(etaId)) {&lt;br /&gt;
          maxAdsToExport--;&lt;br /&gt;
          resultObject.remainingRowCount--;&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      // Keep ads that are not null (not present in spreadsheet).&lt;br /&gt;
      var reportsNotPresentInSheet = [];&lt;br /&gt;
      Object.keys(mostPerformingAdsObject).forEach(function(adId) {&lt;br /&gt;
        var ad = mostPerformingAdsObject[adId];&lt;br /&gt;
        if (mostPerformingAdsObject.hasOwnProperty(adId) &amp;amp;&amp;amp; !isEmpty(ad)) {&lt;br /&gt;
          reportsNotPresentInSheet.push(ad);&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      mostPerformingAds = reportsNotPresentInSheet;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Traverse all ads and export them to the spreadsheet.&lt;br /&gt;
    maxAdsToExport = Math.min(Math.max(maxAdsToExport, 0),&lt;br /&gt;
                              mostPerformingAds.length);&lt;br /&gt;
    for (var i = 0; i &amp;lt; maxAdsToExport; i++) {&lt;br /&gt;
      mostPerformingAds[i].export(sheet, CONFIG.spreadsheet);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    resultObject.exportedCount = maxAdsToExport;&lt;br /&gt;
&lt;br /&gt;
    // Update the number of remaining rows to export.&lt;br /&gt;
    resultObject.remainingRowCount -= maxAdsToExport;&lt;br /&gt;
&lt;br /&gt;
    // Print the number of ads exported.&lt;br /&gt;
    print(resultObject.exportedCount + ' ads exported to ' +&lt;br /&gt;
          CONFIG.spreadsheet.sheet.getParent().getUrl());&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return resultObject;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Print the result of the exportSTA function from the exportResults object.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {{exportedCount: number,&lt;br /&gt;
 *          accountsProcessed: number}}&lt;br /&gt;
 *          exportResults An object containing statistics from the STA export.&lt;br /&gt;
 *             exportedCount     The number of exported Ads during exportSTA.&lt;br /&gt;
 *             accountsProcessed The number of accounts processed in the export.&lt;br /&gt;
 */&lt;br /&gt;
function printExportResults(exportResults) {&lt;br /&gt;
  print('Export Results:\n' +&lt;br /&gt;
        '  Total accounts processed: ' + exportResults.accountsProcessed +&lt;br /&gt;
        '\n' +&lt;br /&gt;
        '  Total STAs exported:      ' + exportResults.exportedCount + '\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sync content from and to the exported spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * This function operates only for MCC accounts.&lt;br /&gt;
 *&lt;br /&gt;
 * This function will iterate over each sub-account calling syncSpreadsheet for&lt;br /&gt;
 * the account CID&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number} Returns the error count during the sync.&lt;br /&gt;
 *                  For example: update ad status, approval reason&lt;br /&gt;
 *                  and create ETAs that are flagged as ready for upload.&lt;br /&gt;
 */&lt;br /&gt;
function syncSpreadsheetMCC() {&lt;br /&gt;
  var errorCount = 0;&lt;br /&gt;
&lt;br /&gt;
  // Store the current MCC account&lt;br /&gt;
  var mccAccount = AdWordsApp.currentAccount();&lt;br /&gt;
&lt;br /&gt;
  // Get account iterator from MCC config.&lt;br /&gt;
  var accountIterator;&lt;br /&gt;
  try {&lt;br /&gt;
    accountIterator = getAccountIteratorFromMCC();&lt;br /&gt;
  }&lt;br /&gt;
  catch (err) {&lt;br /&gt;
    errorCount += 1;&lt;br /&gt;
  }&lt;br /&gt;
  if (accountIterator) {&lt;br /&gt;
    processAccountLimit(accountIterator);&lt;br /&gt;
    while (accountIterator.hasNext()) {&lt;br /&gt;
      var account = accountIterator.next();&lt;br /&gt;
&lt;br /&gt;
      // Set the account as the client account as the active account&lt;br /&gt;
      MccApp.select(account);&lt;br /&gt;
      print('Account: ' + account.getName() +&lt;br /&gt;
            ' (' + account.getCustomerId() + ')');&lt;br /&gt;
&lt;br /&gt;
      errorCount += syncSpreadsheet(account.getCustomerId());&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  MccApp.select(mccAccount);&lt;br /&gt;
&lt;br /&gt;
  return errorCount;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sync content from and to the exported spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string|null|undefined} customerId sync for the customer Id provided.&lt;br /&gt;
 *                                If null or undefined, then sync all rows.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number} Returns the error count during the sync.&lt;br /&gt;
 *                  For example: update ad status, approval reason&lt;br /&gt;
 *                  and create ETAs that are flagged as ready for upload.&lt;br /&gt;
 */&lt;br /&gt;
function syncSpreadsheet(customerId) {&lt;br /&gt;
  var errorCount = 0;&lt;br /&gt;
&lt;br /&gt;
  var sheet = getCachedSheet(CONFIG.spreadsheet, CONFIG.email);&lt;br /&gt;
&lt;br /&gt;
  // Combine Ad performing reports with rows in spreadsheet.&lt;br /&gt;
  var spreadsheetRowsAndReport;&lt;br /&gt;
  try {&lt;br /&gt;
    spreadsheetRowsAndReport =&lt;br /&gt;
      getReportWithSpreadsheetRows(customerId ? [customerId] : []);&lt;br /&gt;
  } catch(err) {&lt;br /&gt;
    Logger.log('Failed to retrieve report rows: ' + err);&lt;br /&gt;
    spreadsheetRowsAndReport = [];&lt;br /&gt;
    errorCount++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Keep track of changes made to AdWords platform.&lt;br /&gt;
  var allChanges = [];&lt;br /&gt;
&lt;br /&gt;
  spreadsheetRowsAndReport.forEach(function(spreadsheetRowAndReport) {&lt;br /&gt;
    // `startOfIterationErrorCount` will keep track of the error count at the&lt;br /&gt;
    // start of this iteration.&lt;br /&gt;
    var startOfIterationErrorCount = errorCount;&lt;br /&gt;
    var spreadsheetRow = spreadsheetRowAndReport.row;&lt;br /&gt;
&lt;br /&gt;
    var sta = spreadsheetRowAndReport.sta;&lt;br /&gt;
    var eta = spreadsheetRowAndReport.eta;&lt;br /&gt;
&lt;br /&gt;
    // Keep track of changes made to STA.&lt;br /&gt;
    var staChanges = new AdChange(spreadsheetRow.getNumber('staId'),&lt;br /&gt;
                                  spreadsheetRow.getNumber('adGroupId'));&lt;br /&gt;
    // Keep track of changes made to ETA (etaId may be empty here).&lt;br /&gt;
    var etaChanges = new AdChange(spreadsheetRow.getNumber('etaId'),&lt;br /&gt;
                                  spreadsheetRow.getNumber('adGroupId'));&lt;br /&gt;
    // Save changes for this iteration.&lt;br /&gt;
    allChanges.push({&lt;br /&gt;
      sta: staChanges.getChangeStruct(),&lt;br /&gt;
      eta: [etaChanges.getChangeStruct()]&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // If STA is null (report was not retrieved), then retrieve it.&lt;br /&gt;
    // STA is only null when it's not returned in `getMostPerformingAds` for&lt;br /&gt;
    // this specific row.&lt;br /&gt;
    if (isEmpty(sta)) {&lt;br /&gt;
      sta = getAdFromRow(spreadsheetRow, 'STA');&lt;br /&gt;
      if (isEmpty(sta)) {&lt;br /&gt;
        errorCount += 1;&lt;br /&gt;
        try {&lt;br /&gt;
          spreadsheetRow.markAsError('Error retrieving STA with Id ' +&lt;br /&gt;
              spreadsheetRow.getNumber('staId'));&lt;br /&gt;
        } catch (err) {&lt;br /&gt;
          spreadsheetRow.markAsError('Error retrieving STA with missing Id, ' +&lt;br /&gt;
              'row : ' + spreadsheetRow.getRowIndex());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    errorCount += syncETA(eta, spreadsheetRow, etaChanges);&lt;br /&gt;
    errorCount += syncSTA(sta, spreadsheetRow, staChanges);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  allChanges.map(function(change) {&lt;br /&gt;
    function _printChanges(type, id, changes) {&lt;br /&gt;
      function _print(field) {&lt;br /&gt;
        if (!field) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var prefix = type + ' (' + id + '): ';&lt;br /&gt;
        if (isEmptyString(id)) {&lt;br /&gt;
          prefix = type + ' ';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        print(prefix + field.fieldName + ' changed from &amp;quot;' +&lt;br /&gt;
              field.oldValue + '&amp;quot; to &amp;quot;' + field.newValue + '&amp;quot;');&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (Array.isArray(changes)) {&lt;br /&gt;
        changes.map(_print);&lt;br /&gt;
      } else {&lt;br /&gt;
        _print(changes);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (change.sta) {&lt;br /&gt;
      _printChanges('Standard text ad', change.sta.adId, change.sta.changes);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (change.eta) {&lt;br /&gt;
      change.eta.map(function(eta) {&lt;br /&gt;
        if (eta.created) {&lt;br /&gt;
          print('Expanded text ad (' + eta.adId + '): created');&lt;br /&gt;
          _printChanges('+', null, eta.changes);&lt;br /&gt;
        } else {&lt;br /&gt;
          _printChanges('+ Expanded text ad', eta.adId, eta.changes);&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  return errorCount;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieves labels that will be used to apply on ETA or STA.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {SpreadsheetRow} spreadsheetRow A row in spreadsheet.&lt;br /&gt;
 * @param {string} defaultLabel&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Array&amp;lt;string&amp;gt;} An array of label names.&lt;br /&gt;
 */&lt;br /&gt;
function getLabelsToApply(spreadsheetRow, defaultLabel) {&lt;br /&gt;
  var labelNames = spreadsheetRow.getArray('labels');&lt;br /&gt;
&lt;br /&gt;
  if (isEmptyString(labelNames)) {&lt;br /&gt;
    labelNames = [defaultLabel];&lt;br /&gt;
  } else if (labelNames.indexOf(defaultLabel) === -1) {&lt;br /&gt;
    labelNames.push(defaultLabel);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return labelNames;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Syncs STA in AdWords platform with STA in spreadsheet.&lt;br /&gt;
 * Currently only sync labels and status, only if ETA&lt;br /&gt;
 * has been created.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Ad} sta Ad object to apply changes to.&lt;br /&gt;
 * @param {SpreadsheetRow} spreadsheetRow A row in spreadsheet.&lt;br /&gt;
 * @param {AdChange} staChanges An object used for tracking changes&lt;br /&gt;
 *                              made in AdWords platform.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number} A count of errors encountered.&lt;br /&gt;
 */&lt;br /&gt;
function syncSTA(sta, spreadsheetRow, staChanges) {&lt;br /&gt;
&lt;br /&gt;
  var errorCount = 0;&lt;br /&gt;
  // Get labels to apply to STAs and newly created ETAs.&lt;br /&gt;
  var labelNames = getLabelsToApply(spreadsheetRow, CONFIG.defaultLabelName);&lt;br /&gt;
&lt;br /&gt;
  // If STA object and ETA Id is present.&lt;br /&gt;
  if (!isEmpty(sta) &amp;amp;&amp;amp;&lt;br /&gt;
      (!isEmptyString(spreadsheetRow.getString('etaId')) &amp;amp;&amp;amp;&lt;br /&gt;
      spreadsheetRow.getNumber('etaId') !== 0)) {&lt;br /&gt;
&lt;br /&gt;
    // Determine if STA status will need to be updated.&lt;br /&gt;
    // If the setStatus operation is successful, track it.&lt;br /&gt;
    var oldStatus = sta.getStatus();&lt;br /&gt;
    var spreadsheetSTAStatus = spreadsheetRow.getString('staStatus');&lt;br /&gt;
    var hasNewStatus = (oldStatus !== spreadsheetSTAStatus);&lt;br /&gt;
    if (hasNewStatus &amp;amp;&amp;amp; sta.syncStatus(spreadsheetSTAStatus)) {&lt;br /&gt;
      staChanges.trackChange('staStatus', oldStatus, spreadsheetSTAStatus);&lt;br /&gt;
    } else if (hasNewStatus) {&lt;br /&gt;
      errorCount += 1;&lt;br /&gt;
      try {&lt;br /&gt;
        spreadsheetRow.markAsError('Error syncing status for STA with id ' +&lt;br /&gt;
            spreadsheetRow.getNumber('staId'));&lt;br /&gt;
      } catch (err) {&lt;br /&gt;
        spreadsheetRow.markAsError('Error syncing status for STA with ' +&lt;br /&gt;
            'missing Id, row : ' + spreadsheetRow.getRowIndex());&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (spreadsheetSTAStatus !== Ad.statuses.DISABLED &amp;amp;&amp;amp;&lt;br /&gt;
        sta.getStatus() !== Ad.statuses.DISABLED) {&lt;br /&gt;
      // Sync label(s) on STA.&lt;br /&gt;
      var currentLabels = sta.getLabels();&lt;br /&gt;
      // Applies labels, set in spreadsheet, on to STA.&lt;br /&gt;
      if (sta.syncLabels(labelNames)) {&lt;br /&gt;
        staChanges.trackChange('labels', currentLabels, labelNames);&lt;br /&gt;
      } else {&lt;br /&gt;
        errorCount += 1;&lt;br /&gt;
        try {&lt;br /&gt;
          spreadsheetRow.markAsError('Error applying labels ' + labelNames +&lt;br /&gt;
              ' on STA with Id ' + spreadsheetRow.getNumber('staId'));&lt;br /&gt;
        } catch (err) {&lt;br /&gt;
          spreadsheetRow.markAsError('Error applying labels on STA with ' +&lt;br /&gt;
              'missing Id, row : ' + spreadsheetRow.getRowIndex());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return errorCount;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Syncs ETA in AdWords platform with STA in spreadsheet.&lt;br /&gt;
 * Currently creates ETA if ready, sync labels, status, approval reason.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Ad} eta Ad object to apply changes to.&lt;br /&gt;
 * @param {SpreadsheetRow} spreadsheetRow A row in spreadsheet.&lt;br /&gt;
 * @param {AdChange} etaChanges An object used for tracking changes&lt;br /&gt;
 *                              made in AdWords platform.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number} A count of errors encountered.&lt;br /&gt;
 */&lt;br /&gt;
function syncETA(eta, spreadsheetRow, etaChanges) {&lt;br /&gt;
&lt;br /&gt;
  var errorCount = 0;&lt;br /&gt;
  // Get labels to apply to STAs and newly created ETAs.&lt;br /&gt;
  var labelNames = getLabelsToApply(spreadsheetRow, CONFIG.defaultLabelName);&lt;br /&gt;
&lt;br /&gt;
  // If ready to upload and ETA ID is not set.&lt;br /&gt;
  if (spreadsheetRow.getString('readyToUpload').trim().toLowerCase() ===&lt;br /&gt;
      'yes' &amp;amp;&amp;amp; (isEmptyString(spreadsheetRow.getNumber('etaId')) ||&lt;br /&gt;
      spreadsheetRow.getNumber('etaId') === 0)) {&lt;br /&gt;
&lt;br /&gt;
    // Create a new ETA.&lt;br /&gt;
    var result = createETA(spreadsheetRow);&lt;br /&gt;
    eta = result.ad;&lt;br /&gt;
&lt;br /&gt;
    // Only apply ETA changes, if ETA object is present.&lt;br /&gt;
    if (isEmpty(eta)) {&lt;br /&gt;
      errorCount += 1;&lt;br /&gt;
      if (result.errors.length &amp;gt; 0) {&lt;br /&gt;
        spreadsheetRow.markAsError(result.errors);&lt;br /&gt;
      } else {&lt;br /&gt;
        spreadsheetRow.markAsError('Error creating new ETA for STA with Id ' +&lt;br /&gt;
                                   spreadsheetRow.getNumber('staId'));&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      etaChanges.trackCreate(eta.getId(),&lt;br /&gt;
                             spreadsheetRow.getNumber('adGroupId'));&lt;br /&gt;
&lt;br /&gt;
      if (!IS_PREVIEW) {&lt;br /&gt;
        // Update spreadsheet with ETA values.&lt;br /&gt;
        spreadsheetRow.set('etaId', eta.getId());&lt;br /&gt;
        // If ETA status is not defined set it to paused.&lt;br /&gt;
        if (isEmptyString(spreadsheetRow.getString('etaStatus'))) {&lt;br /&gt;
          spreadsheetRow.set('etaStatus', 'paused');&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Applies labels, set in spreadsheet, on to ETA.&lt;br /&gt;
      if (eta.syncLabels(labelNames)) {&lt;br /&gt;
        etaChanges.trackChange('labels', '', labelNames);&lt;br /&gt;
      } else {&lt;br /&gt;
        errorCount += 1;&lt;br /&gt;
        spreadsheetRow.markAsError('Error applying labels ' + labelNames +&lt;br /&gt;
            ' on ETA with Id ' + eta.getId());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var spreadsheetETAStatus = spreadsheetRow.getString('etaStatus');&lt;br /&gt;
      if (eta.syncStatus(spreadsheetETAStatus)) {&lt;br /&gt;
        etaChanges.trackChange('status', '', spreadsheetETAStatus);&lt;br /&gt;
      } else {&lt;br /&gt;
        errorCount += 1;&lt;br /&gt;
        spreadsheetRow.markAsError('Error syncing status for ETA with Id ' +&lt;br /&gt;
            eta.getId());&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  } else if (!isEmptyString(spreadsheetRow.getNumber('etaId')) &amp;amp;&amp;amp;&lt;br /&gt;
             spreadsheetRow.getNumber('etaId') !== 0) {&lt;br /&gt;
&lt;br /&gt;
    // If ETA is null, retrieve it.&lt;br /&gt;
    // ETA is only null when it's not returned in `getETAReports` for this&lt;br /&gt;
    // specific row.&lt;br /&gt;
    if (isEmpty(eta)) {&lt;br /&gt;
      eta = getAdFromRow(spreadsheetRow, 'ETA');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (isEmpty(eta)) {&lt;br /&gt;
      errorCount += 1;&lt;br /&gt;
      try {&lt;br /&gt;
        spreadsheetRow.markAsError('Error retrieving ETA with Id ' +&lt;br /&gt;
                                   spreadsheetRow.getNumber('etaId'));&lt;br /&gt;
      }&lt;br /&gt;
      catch (err) {&lt;br /&gt;
        spreadsheetRow.markAsError('Error retrieving ETA with missing Id, ' +&lt;br /&gt;
                                   'row :  ' + spreadsheetRow.getRowIndex());&lt;br /&gt;
      }&lt;br /&gt;
    // Only apply ETA changes, if ETA object is present.&lt;br /&gt;
    } else {&lt;br /&gt;
      // Set latest approval status of ETA in spreadsheet.&lt;br /&gt;
      var etaApprovalStatus = eta.getApprovalStatus();&lt;br /&gt;
      if (!isEmptyString(etaApprovalStatus)) {&lt;br /&gt;
        spreadsheetRow.set('etaApprovalStatus', etaApprovalStatus);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var currentStatus = eta.getStatus();&lt;br /&gt;
      var spreadsheetETAStatus = spreadsheetRow.getString('etaStatus');&lt;br /&gt;
      if (eta.syncStatus(spreadsheetETAStatus)) {&lt;br /&gt;
        etaChanges.trackChange('status', currentStatus, spreadsheetETAStatus);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // If ETA has not been disabled.&lt;br /&gt;
      if (spreadsheetETAStatus !== Ad.statuses.DISABLED) {&lt;br /&gt;
        // Sync label(s) on ETA.&lt;br /&gt;
        var currentLabels = eta.getLabels();&lt;br /&gt;
        // Applies labels, set in spreadsheet, on to ETA.&lt;br /&gt;
        if (eta.syncLabels(labelNames)) {&lt;br /&gt;
          etaChanges.trackChange('labels', currentLabels, labelNames);&lt;br /&gt;
        } else {&lt;br /&gt;
          errorCount += 1;&lt;br /&gt;
          spreadsheetRow.markAsError('Error applying labels ' + labelNames +&lt;br /&gt;
              ' on ETA with Id ' + eta.getId());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return errorCount;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
////////////////////////////////// AD ////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
// Depends on the following global functions:&lt;br /&gt;
// - createLabel&lt;br /&gt;
// - isEmpty&lt;br /&gt;
// - isEmptyString&lt;br /&gt;
// - print&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Represents an Ad.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Object} row A report row from which to parse an Ad. This object&lt;br /&gt;
 *                     is expected to have properties included in `rowFields`.&lt;br /&gt;
 * @param {Array&amp;lt;string&amp;gt;} rowFields An array of fields to select from `row`.&lt;br /&gt;
 * @param {AdWordsApp.Ad} adWordsAppAd An Ad object.&lt;br /&gt;
 * @param {AdWordsApp.Account} account Current AW account.&lt;br /&gt;
 *&lt;br /&gt;
 * @constructor&lt;br /&gt;
 */&lt;br /&gt;
function Ad(row, rowFields, adWordsAppAd, account) {&lt;br /&gt;
  this.row = {&lt;br /&gt;
    accountId: account.getCustomerId(),&lt;br /&gt;
    accountName: account.getName()&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  // Stores AdWordsApp.Ad.&lt;br /&gt;
  this.ad = null;&lt;br /&gt;
  if (!isEmpty(adWordsAppAd)) {&lt;br /&gt;
    this.ad = adWordsAppAd;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!isEmpty(row) &amp;amp;&amp;amp; !isEmpty(rowFields) &amp;amp;&amp;amp; Array.isArray(rowFields)) {&lt;br /&gt;
    // Copy all selected fields.&lt;br /&gt;
    var self = this;&lt;br /&gt;
    rowFields.forEach(function(field) {&lt;br /&gt;
      // Lowercase the first character.&lt;br /&gt;
      var normalizedFieldName = field.charAt(0).toLowerCase() +&lt;br /&gt;
          field.substring(1, field.length);&lt;br /&gt;
&lt;br /&gt;
      if (normalizedFieldName === 'status' ||&lt;br /&gt;
          normalizedFieldName === 'creativeApprovalStatus') {&lt;br /&gt;
        self.row[normalizedFieldName] = row[field].trim().toLowerCase();&lt;br /&gt;
      } else {&lt;br /&gt;
        self.row[normalizedFieldName] = row[field];&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Assign `id` to self, for efficient access.&lt;br /&gt;
      if (normalizedFieldName === 'id') {&lt;br /&gt;
        self.id = row[field];&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Supported statuses.&lt;br /&gt;
 * @enum {string}&lt;br /&gt;
 */&lt;br /&gt;
Ad.statuses = {&lt;br /&gt;
  ENABLED: 'enabled',&lt;br /&gt;
  PAUSED: 'paused',&lt;br /&gt;
  DISABLED: 'disabled'&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns true if this instance has an AdWordsApp.Ad object.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean}&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.hasAdWordsAppAd = function() {&lt;br /&gt;
  return (!isEmpty(this.ad));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns an Ad's id.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number}&lt;br /&gt;
 * @throws {string}&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.getId = function() {&lt;br /&gt;
  // If AdWordsApp.Ad object is present.&lt;br /&gt;
  if (this.hasAdWordsAppAd()) {&lt;br /&gt;
    return this.ad.getId();&lt;br /&gt;
  // Otherwise, dealing with Ad Report object.&lt;br /&gt;
  } else if (!isEmptyString(this.row.id)) {&lt;br /&gt;
    return this.row.id;&lt;br /&gt;
  } else {&lt;br /&gt;
    throw 'Invalid ad object.';&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns an Ad's labels.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Array&amp;lt;string&amp;gt;} An array of label names.&lt;br /&gt;
 * @throws {string}&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.getLabels = function() {&lt;br /&gt;
  var labelNames = [];&lt;br /&gt;
&lt;br /&gt;
  // If AdWordsApp.Ad object is present.&lt;br /&gt;
  if (this.hasAdWordsAppAd()) {&lt;br /&gt;
    if (this.ad.getId() &amp;gt; 0) {&lt;br /&gt;
      var labelIterator = this.ad.labels().get();&lt;br /&gt;
&lt;br /&gt;
      while (labelIterator.hasNext()) {&lt;br /&gt;
        var label = labelIterator.next();&lt;br /&gt;
        labelNames.push(label.getName());&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  // Dealing with an Ad report.&lt;br /&gt;
  } else if (this.row['labels'] !== undefined &amp;amp;&amp;amp;&lt;br /&gt;
             typeof this.row.labels === 'string') {&lt;br /&gt;
    // If no labels are present.&lt;br /&gt;
    if (isEmpty(this.row.labels) || this.row.labels === '--') {&lt;br /&gt;
      return [];&lt;br /&gt;
    } else {&lt;br /&gt;
      try {&lt;br /&gt;
        labelNames = JSON.parse(this.row.labels);&lt;br /&gt;
      } catch (err) {&lt;br /&gt;
        throw 'Invalid JSON string stored in Ad.labels';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    // Dealing with an unknown object.&lt;br /&gt;
  } else {&lt;br /&gt;
    throw 'Invalid ad object';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return labelNames;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Determines which labels to remove and which labels to add.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Array&amp;lt;string&amp;gt;} newLabelNames An array of new label names to apply.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {{add: Array&amp;lt;string&amp;gt;,&lt;br /&gt;
 *           remove: Array&amp;lt;string&amp;gt;,&lt;br /&gt;
 *           hasDiff: boolean}} An object with new labels to apply under an&lt;br /&gt;
 *                              `add` attribute, labels to remove under a&lt;br /&gt;
 *                              `remove` attribute, and a `hasDiff` attribute&lt;br /&gt;
 *                              used to indicate if any differences were found.&lt;br /&gt;
 *&lt;br /&gt;
 * @private&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.diffLabels_ = function(newLabelNames) {&lt;br /&gt;
  // `newLabelNames` must be an array.&lt;br /&gt;
  if (!Array.isArray(newLabelNames)) {&lt;br /&gt;
    throw 'Incorrect `newLabelNames` parameter.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var diff = {&lt;br /&gt;
    add: [],&lt;br /&gt;
    remove: [],&lt;br /&gt;
    hasDiff: false&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  var currentLabelNames = this.getLabels();&lt;br /&gt;
&lt;br /&gt;
  newLabelNames.forEach(function(newLabelName) {&lt;br /&gt;
    newLabelName = newLabelName.trim();&lt;br /&gt;
    // If new label is not present in current labels, append to `add`.&lt;br /&gt;
    if (currentLabelNames.indexOf(newLabelName) === -1) {&lt;br /&gt;
      diff.add.push(newLabelName);&lt;br /&gt;
      diff.hasDiff = true;&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  currentLabelNames.forEach(function(currentLabelName) {&lt;br /&gt;
    currentLabelName = currentLabelName.trim();&lt;br /&gt;
    // If current label is not present in new labels, append to `remove`.&lt;br /&gt;
    if (newLabelNames.indexOf(currentLabelName) === -1) {&lt;br /&gt;
      diff.remove.push(currentLabelName);&lt;br /&gt;
      diff.hasDiff = true;&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  return diff;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Adds labels on Ad based on `labelNamesDiff` values.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Array&amp;lt;string&amp;gt;} newLabels Contains an array of label names to add.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} Representing whether all labels were successfully applied.&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.syncLabels = function(newLabels) {&lt;br /&gt;
  // If newLabels is empty, nothing to add.&lt;br /&gt;
  if (isEmpty(newLabels) || newLabels.length &amp;lt;= 0) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var allApplied = true;&lt;br /&gt;
  var labelNamesDiff = this.diffLabels_(newLabels);&lt;br /&gt;
&lt;br /&gt;
  // If differences are present, make sure we have AdWordsApp.Ad object.&lt;br /&gt;
  if (labelNamesDiff.hasDiff &amp;amp;&amp;amp; !this.hasAdWordsAppAd()) {&lt;br /&gt;
    var success = this.getAd();&lt;br /&gt;
    if (!success) {&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var self = this;&lt;br /&gt;
  labelNamesDiff.add.forEach(function(labelName) {&lt;br /&gt;
    // Create label, if it doesn't exist.&lt;br /&gt;
    var success = createLabel(labelName);&lt;br /&gt;
&lt;br /&gt;
    if (success) {&lt;br /&gt;
      try {&lt;br /&gt;
        if (self.ad.getId() &amp;gt; 0) {&lt;br /&gt;
          self.ad.applyLabel(labelName);&lt;br /&gt;
        }&lt;br /&gt;
      } catch (err) {&lt;br /&gt;
        print('Failed to apply ' + labelName + ' to Ad Id: ' + self.getId(),&lt;br /&gt;
            [err]);&lt;br /&gt;
        allApplied = false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      print('Failed to create ' + labelName + ' and apply to Ad Id: ' +&lt;br /&gt;
            self.getId());&lt;br /&gt;
      allApplied = false;&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  return allApplied;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns status of Ad.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {string}&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.getStatus = function() {&lt;br /&gt;
  var adStatus = '';&lt;br /&gt;
&lt;br /&gt;
  // If we have AdWordsApp.Ad object.&lt;br /&gt;
  if (this.hasAdWordsAppAd()) {&lt;br /&gt;
    if (this.ad.getId() &amp;gt; 0) {&lt;br /&gt;
      if (this.ad.isEnabled()) {&lt;br /&gt;
        adStatus = Ad.statuses.ENABLED;&lt;br /&gt;
      } else if (this.ad.isPaused()) {&lt;br /&gt;
        adStatus = Ad.statuses.PAUSED;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  // Otherwise, dealing with Ad Report object.&lt;br /&gt;
  } else if (!isEmptyString(this.row.status)) {&lt;br /&gt;
    adStatus = this.row.status;&lt;br /&gt;
  } else {&lt;br /&gt;
    throw 'Invalid ad object.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return adStatus;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns approval status of Ad.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {?string}&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.getApprovalStatus = function() {&lt;br /&gt;
  var approvalStatus = null;&lt;br /&gt;
&lt;br /&gt;
  // If dealing with an AdWordsApp.Ad object.&lt;br /&gt;
  if (this.hasAdWordsAppAd()) {&lt;br /&gt;
    if (this.ad.getId() &amp;gt; 0) {&lt;br /&gt;
      approvalStatus = this.ad.getApprovalStatus();&lt;br /&gt;
    }&lt;br /&gt;
  // Otherwise, dealing with Ad Report object.&lt;br /&gt;
  } else {&lt;br /&gt;
    approvalStatus = this.row.creativeApprovalStatus;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (isEmptyString(approvalStatus)) {&lt;br /&gt;
    return null;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return approvalStatus.trim().toLowerCase();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Syncs the status of an Ad in spreadsheet with AdWordsApp.Ad.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Ad.statuses} status Possible choices are `enabled`, `paused`, and&lt;br /&gt;
 *                             `disabled`.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} A boolean indicating if operation was successfull.&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.syncStatus = function(status) {&lt;br /&gt;
  if (isEmptyString(status)) {&lt;br /&gt;
    throw 'Incorrect status parameter.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var normalizedStatus = status.trim().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
  // If status does not differ, no changes need to be made.&lt;br /&gt;
  if (this.getStatus() === normalizedStatus) {&lt;br /&gt;
    return true;&lt;br /&gt;
  // Otherwise, change will have to be made, therefore&lt;br /&gt;
  // make sure AdWordsApp.Ad is present.&lt;br /&gt;
  } else if (!this.hasAdWordsAppAd()) {&lt;br /&gt;
    var success = this.getAd();&lt;br /&gt;
    if (!success) {&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  try {&lt;br /&gt;
    if (this.ad.getId() &amp;lt; 0) {&lt;br /&gt;
      // Negative ad ID indicate running in preview mode.&lt;br /&gt;
      return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (normalizedStatus) {&lt;br /&gt;
      case Ad.statuses.ENABLED:&lt;br /&gt;
        this.ad.enable();&lt;br /&gt;
        return true;&lt;br /&gt;
      case Ad.statuses.PAUSED:&lt;br /&gt;
        this.ad.pause();&lt;br /&gt;
        return true;&lt;br /&gt;
      // For no value, set to pause.&lt;br /&gt;
      case '':&lt;br /&gt;
        this.ad.pause();&lt;br /&gt;
        return true;&lt;br /&gt;
      default:&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
  } catch (err) {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieves and sets an Ad object to this instance.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} Whether the ad was found or not.&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.getAd = function() {&lt;br /&gt;
  if (isEmptyString(this.row.adGroupId) || isEmptyString(this.row.id)) {&lt;br /&gt;
    throw 'Invalid Ad instance.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var adIdAndAdgroupId = [[this.row.adGroupId, this.row.id]];&lt;br /&gt;
&lt;br /&gt;
  var adSelector = AdWordsApp.ads()&lt;br /&gt;
                   .withIds(adIdAndAdgroupId);&lt;br /&gt;
&lt;br /&gt;
  var adIterator = adSelector.get();&lt;br /&gt;
&lt;br /&gt;
  // There is at most 1 Ad.&lt;br /&gt;
  if (adIterator.hasNext()) {&lt;br /&gt;
    this.ad = adIterator.next();&lt;br /&gt;
    return true;&lt;br /&gt;
  } else {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Export ad to selected Google sheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Sheet} sheet Output sheet.&lt;br /&gt;
 * @param {{columns: Array&amp;lt;string&amp;gt;,&lt;br /&gt;
 *          reportFieldMap: Object,&lt;br /&gt;
 *          columnNamesToIndices: Object,&lt;br /&gt;
 *          nonEmptyColumnCheck: string&lt;br /&gt;
 *        }} sheetConfig Configuration for selected sheet.&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.export = function(sheet, sheetConfig) {&lt;br /&gt;
  if (isEmpty(sheetConfig) ||&lt;br /&gt;
      isEmpty(sheetConfig.columns) ||&lt;br /&gt;
      isEmpty(sheetConfig.reportFieldMap) ||&lt;br /&gt;
      isEmpty(sheetConfig.columnNamesToIndices) ||&lt;br /&gt;
      isEmpty(sheetConfig.nonEmptyColumnCheck)) {&lt;br /&gt;
    throw 'Failed exporting ad ' + this.id + '. Must provide valid sheet ' +&lt;br /&gt;
          'configuration when exporting an Ad to a spreadsheet';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var fields = [];&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  // Check if exporting to the first content row in the spreadsheet.&lt;br /&gt;
  var lastRow = sheet.getLastRow();&lt;br /&gt;
  var colIndex =&lt;br /&gt;
      sheetConfig.columnNamesToIndices[sheetConfig.nonEmptyColumnCheck] + 1;&lt;br /&gt;
&lt;br /&gt;
  var isFirstRow = (lastRow === sheetConfig.firstContentRow) &amp;amp;&amp;amp;&lt;br /&gt;
      isEmptyString(sheet.getRange(lastRow, colIndex).getValue());&lt;br /&gt;
&lt;br /&gt;
  // Parse all columns.&lt;br /&gt;
  sheetConfig.columns.forEach(function(key) {&lt;br /&gt;
    var field;&lt;br /&gt;
    // Detect whether this field is a formula and copy the formula from&lt;br /&gt;
    // previous cell if necessary.&lt;br /&gt;
    if (!isFirstRow &amp;amp;&amp;amp; !isEmpty(sheetConfig.columnsWithFormulas) &amp;amp;&amp;amp;&lt;br /&gt;
        sheetConfig.columnsWithFormulas.indexOf(key) !== -1) {&lt;br /&gt;
      // Copy formula.&lt;br /&gt;
      var formulaIndex = sheetConfig.columns.indexOf(key);&lt;br /&gt;
      if (formulaIndex !== -1) {&lt;br /&gt;
        // Add 1 to index because spreadsheet begins at index 1.&lt;br /&gt;
        var formulaPreviousCell = sheet.getRange(lastRow, formulaIndex + 1);&lt;br /&gt;
&lt;br /&gt;
        // Return the formula from one cell above this row.&lt;br /&gt;
        field = formulaPreviousCell.getFormulaR1C1();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (isEmptyString(field)) {&lt;br /&gt;
    // Parse field by column name.&lt;br /&gt;
     field = self.parseField_(key, sheetConfig);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Stage field.&lt;br /&gt;
    fields.push(field);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  if (isFirstRow) {&lt;br /&gt;
    // Because we're &amp;quot;freezing&amp;quot; rows, we can't delete all other non-frozen&lt;br /&gt;
    // rows and so we're left with one empty row. Instead of adding a new&lt;br /&gt;
    // row, replace the values in the cells.&lt;br /&gt;
    var prevSectionIndex = 1;&lt;br /&gt;
    var values = [];&lt;br /&gt;
&lt;br /&gt;
    // Copy fields in batches.&lt;br /&gt;
    fields.forEach(function(field) {&lt;br /&gt;
      if (!isEmptyString(field)) {&lt;br /&gt;
        // Batch fields together to avoid making many I/O operations.&lt;br /&gt;
        values.push(field);&lt;br /&gt;
      } else if (values.length &amp;gt; 0) {&lt;br /&gt;
        // Flush fields.&lt;br /&gt;
        var row = sheet.getRange(lastRow, prevSectionIndex, 1, values.length);&lt;br /&gt;
        row.setValues([values]);&lt;br /&gt;
&lt;br /&gt;
        // Update section start index.&lt;br /&gt;
        prevSectionIndex += values.length + 1;&lt;br /&gt;
&lt;br /&gt;
        // Reset batch.&lt;br /&gt;
        values = [];&lt;br /&gt;
      } else {&lt;br /&gt;
        // Skip empty field.&lt;br /&gt;
        prevSectionIndex++;&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  } else {&lt;br /&gt;
    // Add a new row and copy all fields.&lt;br /&gt;
    sheet.insertRowAfter(lastRow);&lt;br /&gt;
    lastRow++;&lt;br /&gt;
&lt;br /&gt;
    // Flush fields.&lt;br /&gt;
    var row = sheet.getRange(lastRow, 1, 1, fields.length);&lt;br /&gt;
    row.setValues([fields]);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Parse a field based on a column key.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} key Column key.&lt;br /&gt;
 * @param {{reportFieldMap: Array&amp;lt;dict&amp;gt;,&lt;br /&gt;
 *          defaultStatus: string&lt;br /&gt;
 *          }} sheetConfig A configuration object that contains a mapping from&lt;br /&gt;
 *                         spreadsheet column names to report columns names,&lt;br /&gt;
 *                         and a default value for `etaStatus`.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {string} A field based on the column key.&lt;br /&gt;
 *&lt;br /&gt;
 * @private&lt;br /&gt;
 */&lt;br /&gt;
Ad.prototype.parseField_ = function(key, sheetConfig) {&lt;br /&gt;
  var proxyKey = sheetConfig.reportFieldMap[key];&lt;br /&gt;
  if (proxyKey === undefined) {&lt;br /&gt;
    throw 'Failed exporting ad ' + this.id +&lt;br /&gt;
          '. Missing report field mapping for: ' + key + '.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Get the field value using the key from the spreadhseet-column name.&lt;br /&gt;
  var field = this.row[proxyKey];&lt;br /&gt;
&lt;br /&gt;
  // Handle specific columns differently.&lt;br /&gt;
  switch (key) {&lt;br /&gt;
    case 'description':&lt;br /&gt;
      // Concatenate description 1 and description 2&lt;br /&gt;
      // in case description field is blank.&lt;br /&gt;
      if (isEmptyString(field)) {&lt;br /&gt;
        field = this.row.description1 +&lt;br /&gt;
                (isEmptyString(this.row.description2) ? '' :&lt;br /&gt;
                 '\n' + this.row.description2);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 'headline1':&lt;br /&gt;
      // If headline part 1 is blank, use headline instead.&lt;br /&gt;
      if (isEmptyString(field)) {&lt;br /&gt;
        field = this.row.headline;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 'etaStatus':&lt;br /&gt;
      if (isEmptyString(field)) {&lt;br /&gt;
        field = sheetConfig.defaultStatus;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 'finalUrl':&lt;br /&gt;
    case 'mobileFinalUrl':&lt;br /&gt;
      // Support only single value for Final URL and&lt;br /&gt;
      // Mobile Final URL.&lt;br /&gt;
      try {&lt;br /&gt;
        field = JSON.parse(field);&lt;br /&gt;
      } catch (ignore) {&lt;br /&gt;
        // Value is most likely already a string, use it&lt;br /&gt;
        // directly. For example &amp;quot;--&amp;quot;.&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      field = getFirstElementInArray(field);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (isEmptyString(field) || field === '--') {&lt;br /&gt;
    // Replace all undefined fields because Range.setValues won't play well&lt;br /&gt;
    // with them.&lt;br /&gt;
    // Replace all '--' with empty strings to avoid exporting empty values&lt;br /&gt;
    // formatted like that.&lt;br /&gt;
    field = '';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return field;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////// UTILS ///////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Get a unique file tag that be used to locate the file.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} seed A seed string used to generate a unique tag.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {string} A unique string associated with the current account and&lt;br /&gt;
 *                  the seed used.&lt;br /&gt;
 */&lt;br /&gt;
function getUniqueFileTag(seed) {&lt;br /&gt;
  // Use the account ID as an additional identifier.&lt;br /&gt;
  var currentAccount = AdWordsApp.currentAccount();&lt;br /&gt;
  return seed + '-' + currentAccount.getCustomerId();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Compare two arrays. Nested objects within the array will be compared&lt;br /&gt;
 * by reference. Therefore, an identical objects but of two different&lt;br /&gt;
 * instances will be considered not equal.&lt;br /&gt;
 *&lt;br /&gt;
 * For example:&lt;br /&gt;
 * isArrayShallowEquals([1, {a: 1}], [1, {a: 1}]) // false.&lt;br /&gt;
 * var obj = {a: 1};&lt;br /&gt;
 * isArrayShallowEquals([1, obj], [1, obj]) // true.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Array} a Array A.&lt;br /&gt;
 * @param {Array} b Array B.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} Whether both arrays are shallowly equal or not.&lt;br /&gt;
 */&lt;br /&gt;
function isArrayShallowEquals(a, b) {&lt;br /&gt;
  // Condition 1: one of the arrays is empty.&lt;br /&gt;
  if ((!a &amp;amp;&amp;amp; b) || (!b &amp;amp;&amp;amp; a)) {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Condition 2: both arrays are null or undefined.&lt;br /&gt;
  if (a == null &amp;amp;&amp;amp; a == b) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Condition 3: either one of the arguments is not an array.&lt;br /&gt;
  if (!Array.isArray(a) || !Array.isArray(b)) {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Condition 4: arrays of different length.&lt;br /&gt;
  if (a.length !== b.length) {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Condition 5: compare each element in the arrays.&lt;br /&gt;
  for (var i = 0; i &amp;lt; a.length; i++) {&lt;br /&gt;
    // Shallow compare.&lt;br /&gt;
    if (a[i] !== b[i]) {&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Get the first element in an array.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Array} arr The array from which to get the first element.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Object} The first element in the array or `null` if empty. If&lt;br /&gt;
 *                   `arr` is not an array, return it as is.&lt;br /&gt;
 */&lt;br /&gt;
function getFirstElementInArray(arr) {&lt;br /&gt;
  if (!arr || !Array.isArray(arr)) {&lt;br /&gt;
    return arr;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (arr.length === 0) {&lt;br /&gt;
    return null;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return arr[0];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Check if given string is empty.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} str Empty string candidate.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} True if string is empty, o/w false.&lt;br /&gt;
 */&lt;br /&gt;
function isEmptyString(str) {&lt;br /&gt;
  if (str == null) {&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (isString(str)) {&lt;br /&gt;
    return str.trim() === '';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Check if `obj` is null or undefined.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Object} obj&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean}&lt;br /&gt;
 */&lt;br /&gt;
function isEmpty(obj) {&lt;br /&gt;
  return obj === null || obj === undefined;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Check if `obj` is an object.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Object} obj&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean}&lt;br /&gt;
 */&lt;br /&gt;
function isObject(obj) {&lt;br /&gt;
  // Check if obj exists and has Object string value&lt;br /&gt;
  if (!obj ||&lt;br /&gt;
      toString.call(obj) !== '[object Object]') {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  // Check is constructor is owned&lt;br /&gt;
  if (obj.constructor &amp;amp;&amp;amp;&lt;br /&gt;
      !hasOwnProperty.call(obj, 'constructor') &amp;amp;&amp;amp;&lt;br /&gt;
      !hasOwnProperty.call(obj.constructor.prototype, 'isPrototypeOf')) {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  // Empty if no properties OR&lt;br /&gt;
  // All properties are owned is last enum property is owned&lt;br /&gt;
  var key;&lt;br /&gt;
  for (key in obj) {}&lt;br /&gt;
&lt;br /&gt;
  return key === undefined || hasOwnProperty.call(obj, key);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Check if `obj` is a valid params object.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Object} obj&lt;br /&gt;
 * @param {Array} valueTypes A list of valid value types allowed as parameters&lt;br /&gt;
 * @param {boolean} emptyIsInvalid A boolean defining if an empty object is&lt;br /&gt;
 *                                 invalid&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Object} An object with { success: &amp;lt;boolean&amp;gt;, message: &amp;lt;string&amp;gt; },&lt;br /&gt;
 *                   where message is the reason for failure if success is&lt;br /&gt;
 *                   false.&lt;br /&gt;
 */&lt;br /&gt;
function isValidParamsObject(obj, valueTypes, emptyIsInvalid) {&lt;br /&gt;
  var result = {&lt;br /&gt;
    success: false,&lt;br /&gt;
    message: ''&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (!emptyIsInvalid &amp;amp;&amp;amp; (isEmpty(obj) || isEmptyString(obj))) {&lt;br /&gt;
    result.success = true;&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (obj === null) {&lt;br /&gt;
    result.message = 'params is null';&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
  if (obj === undefined) {&lt;br /&gt;
    result.message = 'params is undefined';&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
  if (!isObject(obj)) {&lt;br /&gt;
    result.message = 'params is not an object';&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
  if (!valueTypes || !Array.isArray(valueTypes)) {&lt;br /&gt;
    result.message = 'valueTypes is not a valid array';&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
  var keyCount = 0;&lt;br /&gt;
  for (var key in obj) {&lt;br /&gt;
    if (obj.hasOwnProperty(key)) {&lt;br /&gt;
      var value = obj[key];&lt;br /&gt;
      if (valueTypes.indexOf(typeof value) === -1) {&lt;br /&gt;
        result.message = 'key `' + key + '` has an invalid type `' +&lt;br /&gt;
            typeof value + '`';&lt;br /&gt;
        return result;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    keyCount++;&lt;br /&gt;
  }&lt;br /&gt;
  if (emptyIsInvalid &amp;amp;&amp;amp; keyCount === 0) {&lt;br /&gt;
    result.message = 'params is empty';&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
  result.success = true;&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Print to logger if in DEBUG mode.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} msg The message to print with Logger.&lt;br /&gt;
 * @param {?Array} arr An array of strings to print.&lt;br /&gt;
 */&lt;br /&gt;
function print(msg, arr) {&lt;br /&gt;
  if (CONFIG.debug) {&lt;br /&gt;
    if (arr) {&lt;br /&gt;
      Logger.log(msg + ' ' + arr.join(', '));&lt;br /&gt;
    } else {&lt;br /&gt;
      Logger.log(msg);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Check if `str` is a string.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} str Questionable string.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} Whether `str` is indeed a string.&lt;br /&gt;
 */&lt;br /&gt;
function isString(str) {&lt;br /&gt;
  return typeof str === 'string' || str instanceof String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Compares the performance between two ads.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Ad} a Ad a.&lt;br /&gt;
 * @param {Ad} b Ad b.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number} +1 if Ad a has better performance, -1 if Ad b has better&lt;br /&gt;
 *         performance, and 0 if equal.&lt;br /&gt;
 */&lt;br /&gt;
function comparePerformance(a, b) {&lt;br /&gt;
  var impressionsDiff = a.row.impressions - b.row.impressions;&lt;br /&gt;
  var ctrDiff = parseFloat(a.row.ctr) - parseFloat(b.row.ctr);&lt;br /&gt;
&lt;br /&gt;
  var absImpressionsDiff = Math.abs(impressionsDiff);&lt;br /&gt;
  var absCtrDiff = Math.abs(ctrDiff);&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Helper function to compare impressions and CTR.&lt;br /&gt;
   *&lt;br /&gt;
   * @param {number} impressionDiff The difference between both impressions.&lt;br /&gt;
   * @param {number} ctrDiff The difference between both CTRs.&lt;br /&gt;
   *&lt;br /&gt;
   * @return {number} +1 if impressionDiff is &amp;gt; 0, or if impressionDiff === 0&lt;br /&gt;
   *                  and ctrDiff &amp;gt; 0. -1 if impressionDiff is &amp;lt; 0, or if&lt;br /&gt;
   *                  impressionDiff === 0 and ctrDiff &amp;lt; 0. Otherwise, returns&lt;br /&gt;
   *                  0.&lt;br /&gt;
   */&lt;br /&gt;
  function _compare(impressionDiff, ctrDiff) {&lt;br /&gt;
    // Choose the ad with the most impressions.&lt;br /&gt;
    if (impressionsDiff &amp;gt; 0) {&lt;br /&gt;
      return 1;&lt;br /&gt;
    } else if (impressionsDiff &amp;lt; 0) {&lt;br /&gt;
      return -1;&lt;br /&gt;
    } else {&lt;br /&gt;
      // Both ads have equal impressions, choose highest CTR.&lt;br /&gt;
      if (ctrDiff &amp;gt; 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
      } else if (ctrDiff &amp;lt; 0) {&lt;br /&gt;
        return -1;&lt;br /&gt;
      } else {&lt;br /&gt;
        return 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (absImpressionsDiff &amp;lt; CONFIG.performance.impressionsThreshold) {&lt;br /&gt;
    // The difference in impressions is insignificant, gauge at CTR.&lt;br /&gt;
    if (absCtrDiff &amp;lt; CONFIG.performance.ctrThreshold) {&lt;br /&gt;
      // The difference in CTR is insignificant, choose the highest impresssion,&lt;br /&gt;
      // or the highest CTR in case impressions are equal.&lt;br /&gt;
      return _compare(impressionsDiff, ctrDiff);&lt;br /&gt;
    } else if (ctrDiff &amp;gt; 0) {&lt;br /&gt;
      // The difference in CTR is significant, therefore if it's positive it&lt;br /&gt;
      // should be in favor of *this* ad.&lt;br /&gt;
      return 1;&lt;br /&gt;
    } else {&lt;br /&gt;
      // The difference in CTR is significant, therefore if it's negative it&lt;br /&gt;
      // should be in favor of *compared* ad.&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
  } else if (impressionsDiff &amp;gt; 0) {&lt;br /&gt;
    // The difference in impressions is significant, therefore if it's positive&lt;br /&gt;
    // it should be in favor of *this* ad.&lt;br /&gt;
    return 1;&lt;br /&gt;
  } else {&lt;br /&gt;
    // The difference in impressions is significant, therefore if it's negative&lt;br /&gt;
    // it should be in favor of *compared* ad.&lt;br /&gt;
    return -1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Composite to reverse ad compare in order to have the most perfoming ad at&lt;br /&gt;
 * index 0.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {function (number, number) : boolean} compareFunc The original compare&lt;br /&gt;
 *                                                          function.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {function (number, number) : boolean} A reverse version of&lt;br /&gt;
 *                                               compareFunc.&lt;br /&gt;
 */&lt;br /&gt;
function reverseCompare(compareFunc) {&lt;br /&gt;
  return function(a, b) {&lt;br /&gt;
    return -compareFunc(a, b);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Traverse the report and keep the top most NUM_OF_ADS that&lt;br /&gt;
 * are considered most performing based on the configuration given.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {AdWordsApp.Report} report The report from which we want to&lt;br /&gt;
 *                                   extrapolate the most performing ads.&lt;br /&gt;
 * @param {{reportFields: Array&amp;lt;string&amp;gt;,&lt;br /&gt;
 *          numOfAds: number}} config The configuration used to define which&lt;br /&gt;
 *                                    ads to consider most performing.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Array&amp;lt;Ad&amp;gt;} A sorted array of Ads by performance&lt;br /&gt;
 */&lt;br /&gt;
function getMostPerformingAds(report, config) {&lt;br /&gt;
  if (report === null) {&lt;br /&gt;
    throw 'Failed to find most performing ads: Report used for retrieving ' +&lt;br /&gt;
          'top performing ads is empty';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Traverse all rows.&lt;br /&gt;
  var currentAccount = AdWordsApp.currentAccount();&lt;br /&gt;
  var result = [];&lt;br /&gt;
  var rows = report.rows();&lt;br /&gt;
  while (rows.hasNext()) {&lt;br /&gt;
    var ad = new Ad(rows.next(), config.reportFields, null, currentAccount);&lt;br /&gt;
    result.push(ad);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sort by performance.&lt;br /&gt;
  result.sort(reverseCompare(comparePerformance));&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieve ETA reports.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {{etaReportStartDate: string,&lt;br /&gt;
 *          reportFields: Array&amp;lt;string&amp;gt;,&lt;br /&gt;
 *          apiVersion: string}} config The configuration used to select and&lt;br /&gt;
 *                                      parse ETA reports. `etaReportStartDate`&lt;br /&gt;
 *                                      should be formatted as YYYYMMDD.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Array&amp;lt;Ad&amp;gt;} A sorted array of ETAs.&lt;br /&gt;
 */&lt;br /&gt;
function getETAReports(config) {&lt;br /&gt;
  var report = AdWordsApp.report(&lt;br /&gt;
      'SELECT ' + config.reportFields.join(',') + ' ' +&lt;br /&gt;
      'FROM     AD_PERFORMANCE_REPORT ' +&lt;br /&gt;
      'WHERE    AdType = &amp;quot;EXPANDED_TEXT_AD&amp;quot; ' +&lt;br /&gt;
      'AND Date &amp;gt;= &amp;quot;' + config.etaReportStartDate + '&amp;quot;', {&lt;br /&gt;
        apiVersion: config.apiVersion&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
  if (report === null) {&lt;br /&gt;
    return null;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Traverse all rows.&lt;br /&gt;
  var currentAccount = AdWordsApp.currentAccount();&lt;br /&gt;
  var result = [];&lt;br /&gt;
  var rows = report.rows();&lt;br /&gt;
  while (rows.hasNext()) {&lt;br /&gt;
    var ad = new Ad(rows.next(), config.reportFields, null, currentAccount);&lt;br /&gt;
    result.push(ad);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Attempt to open an existing spreadsheet with description containing&lt;br /&gt;
 * `config.templateId`. If not found, copy template spreadsheet with id&lt;br /&gt;
 * `config.templateId` and return its handle.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {{templateId: string,&lt;br /&gt;
 *          targetName: string}} config A configuration object with meta-data&lt;br /&gt;
 *                                      about the target spreadsheet.&lt;br /&gt;
 * @param {?string} emailToNotify An email address to send out notification&lt;br /&gt;
 *                                when creating a new spreadsheet. If none is&lt;br /&gt;
 *                                given, will use the email address of the&lt;br /&gt;
 *                                owner of the spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Spreadsheet} Selected spreadsheet.&lt;br /&gt;
 */&lt;br /&gt;
function getSpreadsheet(config, emailToNotify) {&lt;br /&gt;
  if (isEmpty(config)) {&lt;br /&gt;
    throw 'Config is missing. Cannot get spreadsheet';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (isEmptyString(config.templateId) || isEmptyString(config.targetName)) {&lt;br /&gt;
    throw 'Config must include both `templateId` and `targetName` fields.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var spreadsheetFile;&lt;br /&gt;
  // Attempt to locate the spreadsheet.&lt;br /&gt;
  // Throws an exception when spreadsheet not found.&lt;br /&gt;
  var files = DriveApp.searchFiles('fullText contains &amp;quot;' +&lt;br /&gt;
                                   getUniqueFileTag(config.templateId) + '&amp;quot;');&lt;br /&gt;
  if (files.hasNext()) {&lt;br /&gt;
    spreadsheetFile = files.next();&lt;br /&gt;
    if (files.hasNext()) {&lt;br /&gt;
      print('WARNING: more than one file with \'' + config.templateId +&lt;br /&gt;
                 '\' detected.');&lt;br /&gt;
    }&lt;br /&gt;
  } else {&lt;br /&gt;
    // Create a copy of the template spreadsheet.&lt;br /&gt;
    spreadsheetFile = copyFile(config.templateId, config.targetName);&lt;br /&gt;
    if (spreadsheetFile) {&lt;br /&gt;
      // Notify via email.&lt;br /&gt;
      if (isEmptyString(emailToNotify)) {&lt;br /&gt;
        // Set the default email address to owner's email address.&lt;br /&gt;
        emailToNotify = getFileOwnerEmail(spreadsheetFile);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      notify(emailToNotify, SPREADSHEET_CREATED, spreadsheetFile.getUrl());&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Get spreadsheet by ID.&lt;br /&gt;
  var spreadsheet = null;&lt;br /&gt;
  try {&lt;br /&gt;
    spreadsheet = !!spreadsheetFile &amp;amp;&amp;amp;&lt;br /&gt;
      SpreadsheetApp.openById(spreadsheetFile.getId());&lt;br /&gt;
  } catch (err) {&lt;br /&gt;
    print(err);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!spreadsheet) {&lt;br /&gt;
    throw 'Spreadsheet is missing or unavailable. Please ensure the URL is ' +&lt;br /&gt;
          'correct and that you have permission to edit';&lt;br /&gt;
  } else {&lt;br /&gt;
    return spreadsheet;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Open spreadsheet with name `config.targetName` and select its sheet with&lt;br /&gt;
 * name `config.sheetName`.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {{sheetName: string,&lt;br /&gt;
 *          templateId: string,&lt;br /&gt;
 *          targetName: string}} config Containing sheet meta-data.&lt;br /&gt;
 * @param {?string} emailToNotify An email address to send out notification&lt;br /&gt;
 *                                when creating a new spreadsheet. If none is&lt;br /&gt;
 *                                given, will use the email address of the&lt;br /&gt;
 *                                owner of the spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Sheet} Selected sheet.&lt;br /&gt;
 */&lt;br /&gt;
function getSheet(config, emailToNotify) {&lt;br /&gt;
  if (isEmptyString(config.sheetName)) {&lt;br /&gt;
    throw 'Config must include `sheetName` field. Please set to the name of ' +&lt;br /&gt;
          'sheet within the spreadsheet e.g. main';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var spreadsheet = getSpreadsheet(config, emailToNotify);&lt;br /&gt;
  var sheet = spreadsheet.getSheetByName(config.sheetName);&lt;br /&gt;
  if (!sheet) {&lt;br /&gt;
    throw 'Spreadsheet is missing a sheet named: ' + config.sheetName +&lt;br /&gt;
          '. Please ensure the sheet exists in the spreadsheet';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return sheet;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieves cached sheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {{sheet: Sheet,&lt;br /&gt;
 *          sheetName: string,&lt;br /&gt;
 *          templateId: string,&lt;br /&gt;
 *          targetName: string}} config An object to retrieve cached sheet from.&lt;br /&gt;
 * @param {?string} emailToNotify An email address to send out notification&lt;br /&gt;
 *                                when creating a new spreadsheet. If none is&lt;br /&gt;
 *                                given, will use the email address of the&lt;br /&gt;
 *                                owner of the spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {?Sheet} Selected sheet.&lt;br /&gt;
 */&lt;br /&gt;
function getCachedSheet(config, emailToNotify) {&lt;br /&gt;
  // If sheet already present.&lt;br /&gt;
  if (!isEmpty(config.sheet)) {&lt;br /&gt;
    return config.sheet;&lt;br /&gt;
  // Else, cache and return.&lt;br /&gt;
  } else {&lt;br /&gt;
    var sheet = getSheet(config, emailToNotify);&lt;br /&gt;
    config.sheet = sheet;&lt;br /&gt;
    return sheet;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a boolean if the current user is able to edit the specified&lt;br /&gt;
 * spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Spreadsheet} spreadsheet The spreadsheet to detect edit permissions&lt;br /&gt;
 *                                  on.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} Returns true if the current user can edit the spreadsheet&lt;br /&gt;
 *                   provided.&lt;br /&gt;
 */&lt;br /&gt;
function canEditSpreadsheet(spreadsheet) {&lt;br /&gt;
  // Validate the spreadsheet argument exists.&lt;br /&gt;
  if (isEmpty(spreadsheet)) {&lt;br /&gt;
    throw 'Argument provided to canEditSpreadsheet is not a valid spreadsheet';&lt;br /&gt;
  }&lt;br /&gt;
  // Return RANGE level protections.&lt;br /&gt;
  var protections = spreadsheet.getProtections(&lt;br /&gt;
        SpreadsheetApp.ProtectionType.RANGE);&lt;br /&gt;
&lt;br /&gt;
  if (protections.length === 0) {&lt;br /&gt;
    // No protections at a spreadsheet level.&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
  for (var i = 0; i &amp;lt; protections.length; i++) {&lt;br /&gt;
    if (protections[i].canEdit()) {&lt;br /&gt;
      return true;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  // If no protections allow editing, not editable.&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Wrap `func` so that it may receive default input.&lt;br /&gt;
 * ```&lt;br /&gt;
 * For example:&lt;br /&gt;
 * function add(a, b) {&lt;br /&gt;
 *   return a + b;&lt;br /&gt;
 * }&lt;br /&gt;
 *&lt;br /&gt;
 * var add1 = compose(add, 1);&lt;br /&gt;
 * add1(2); // 3&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Function} func The function to wrap.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Function} The composed function. (for lack of better name.)&lt;br /&gt;
 */&lt;br /&gt;
function compose(func) {&lt;br /&gt;
  var prevArgs = Array.prototype.slice.call(arguments, 1);&lt;br /&gt;
  return function() {&lt;br /&gt;
    var newArgs = Array.prototype.slice.call(arguments);&lt;br /&gt;
    var args = prevArgs.concat(newArgs);&lt;br /&gt;
    return func.apply(this, args);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Validate the structure of the spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {{templateId: string,&lt;br /&gt;
 *          targetName: string,&lt;br /&gt;
 *          columns: Array&amp;lt;string&amp;gt;,&lt;br /&gt;
 *          firstContentRow: number,&lt;br /&gt;
 *          columnMappingSpecialCases: Object&lt;br /&gt;
 *        }} config Spreadsheet configuration. `templateId` and `targetName`&lt;br /&gt;
 *                  are used to find the spreadsheet. `columns` are the&lt;br /&gt;
 *                  expected columns in the spreadsheet. `firstContentRow` is&lt;br /&gt;
 *                  the first row index after the header row.&lt;br /&gt;
 *                  `columnsMappingSpecialCases` is a dictionary (string:&lt;br /&gt;
 *                  string) for headers that require special handling.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} Whether the spreadsheet is valid.&lt;br /&gt;
 */&lt;br /&gt;
function validateSpreadsheet(config) {&lt;br /&gt;
  /**&lt;br /&gt;
   * Remove whitespaces, any non-numeric value, and lower case given header.&lt;br /&gt;
   *&lt;br /&gt;
   * @param {Object} specialCases A dictionary (string: string) for&lt;br /&gt;
   *                              headers that require special handling.&lt;br /&gt;
   * @param {string} header The header to parse.&lt;br /&gt;
   *&lt;br /&gt;
   * @return {string} A normalized header.&lt;br /&gt;
   */&lt;br /&gt;
  function _parseHeader(specialCases, header) {&lt;br /&gt;
    // Remove whitespaces, non-alphanumeric characters and lowercase&lt;br /&gt;
    // all letters.&lt;br /&gt;
    var parsed = header.replace(/ |\?|\W/g, '').toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    // Handle special cases.&lt;br /&gt;
    if (!isEmpty(specialCases)) {&lt;br /&gt;
      var specialCase = specialCases[parsed];&lt;br /&gt;
      if (!isEmptyString(specialCase)) {&lt;br /&gt;
        parsed = specialCase;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return parsed;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Verify that the existing headers are equal to expected headers.&lt;br /&gt;
   *&lt;br /&gt;
   * @param {Array&amp;lt;string&amp;gt;} headers Existing headers.&lt;br /&gt;
   * @param {Array&amp;lt;string&amp;gt;} expectedHeaders The expected headers.&lt;br /&gt;
   *&lt;br /&gt;
   * @return {{pass: boolean, mapping: Object}} The verification result.&lt;br /&gt;
   *         `pass` indicates whether the validation passed. `mapping`&lt;br /&gt;
   *         (string: string) contains meta-data on failed mapping.&lt;br /&gt;
   */&lt;br /&gt;
  function _checkHeaders(headers, expectedHeaders) {&lt;br /&gt;
    var pass = true;&lt;br /&gt;
    var failureMapping = {};&lt;br /&gt;
&lt;br /&gt;
    // Create a copy of expectedHeaders so we could manipulate it.&lt;br /&gt;
    expectedHeaders = expectedHeaders.slice();&lt;br /&gt;
&lt;br /&gt;
    // Go over every header.&lt;br /&gt;
    headers.forEach(function(header) {&lt;br /&gt;
      var expectedHeader = expectedHeaders.shift();&lt;br /&gt;
      if (header !== expectedHeader) {&lt;br /&gt;
        pass = false;&lt;br /&gt;
        failureMapping[expectedHeader] = header;&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return {&lt;br /&gt;
      pass: pass,&lt;br /&gt;
      mapping: failureMapping&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Validate a spreadsheet's column headers.&lt;br /&gt;
   *&lt;br /&gt;
   * @param {{templateId: string,&lt;br /&gt;
   *          targetName: string,&lt;br /&gt;
   *          columns: Array&amp;lt;string&amp;gt;,&lt;br /&gt;
   *          firstContentRow: number,&lt;br /&gt;
   *          columnMappingSpecialCases: {'string': string}&lt;br /&gt;
   *        }} config Spreadsheet configuration.&lt;br /&gt;
   *&lt;br /&gt;
   * @return {{pass: boolean, mapping: Object}} The verification result.&lt;br /&gt;
   *         `pass` indicates whether the validation passed. `mapping`&lt;br /&gt;
   *         (string: string) contains meta-data on failed mapping.&lt;br /&gt;
   */&lt;br /&gt;
  function _verifyColumns(config) {&lt;br /&gt;
    var sheet = getCachedSheet(config);&lt;br /&gt;
    var header = sheet.getRange(config.firstContentRow - 1, 1, 1,&lt;br /&gt;
                                config.columns.length);&lt;br /&gt;
    var headerValues = header.getValues()[0];&lt;br /&gt;
&lt;br /&gt;
    var passObj = _checkHeaders(config.columns.map(compose(_parseHeader,&lt;br /&gt;
                                config.columnMappingSpecialCases)),&lt;br /&gt;
                                headerValues.map(compose(_parseHeader,&lt;br /&gt;
                                config.columnMappingSpecialCases)));&lt;br /&gt;
    return passObj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Verify columns.&lt;br /&gt;
  var passMain = _verifyColumns(config);&lt;br /&gt;
  if (!passMain.pass) {&lt;br /&gt;
    Logger.log('\nColumns mapping (sheet:script):\n' +&lt;br /&gt;
               JSON.stringify(passMain.mapping, null, 2));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return passMain.pass;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieves an Ad object from a SpreadsheetRow object.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {SpreadsheetRow} row&lt;br /&gt;
 * @param {string} type The type of ad. Options are either 'STA' or 'ETA'.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {?Ad} Returns an Ad if found, or null if no ad is found.&lt;br /&gt;
 */&lt;br /&gt;
function getAdFromRow(row, type) {&lt;br /&gt;
  var ad = null;&lt;br /&gt;
  if (type === 'ETA') {&lt;br /&gt;
    try {&lt;br /&gt;
      ad = getAd([row.get('adGroupId'), row.get('etaId')]);&lt;br /&gt;
    } catch (err) {&lt;br /&gt;
      Logger.log('Failed to get ETA due to: ' + err);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else if (type === 'STA') {&lt;br /&gt;
    try {&lt;br /&gt;
      ad = getAd([row.get('adGroupId'), row.get('staId')]);&lt;br /&gt;
    } catch (err) {&lt;br /&gt;
      Logger.log('Failed to get STA due to: ' + err);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw 'Incorrect Ad type.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return ad;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieves an Ad object.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Array&amp;lt;number&amp;gt;} adIdAndAdgroupId An array consisting of an&lt;br /&gt;
 *                                AdGroup Id and Ad Id. AdGroup Id and Ad Id&lt;br /&gt;
 *                                is the unique key for identifying an Ad.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {?Ad} Returns an Ad if found, or null if no ad is found.&lt;br /&gt;
 */&lt;br /&gt;
function getAd(adIdAndAdgroupId) {&lt;br /&gt;
  if (!adIdAndAdgroupId || adIdAndAdgroupId.length &amp;lt; 2 ||&lt;br /&gt;
      isEmptyString(adIdAndAdgroupId[0]) ||&lt;br /&gt;
      isEmptyString(adIdAndAdgroupId[1])) {&lt;br /&gt;
    throw '`adIdAndAdgroupId` must include two values: adGroup ID, and Ad ID';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var adSelector = AdWordsApp.ads()&lt;br /&gt;
                   .withIds([adIdAndAdgroupId]);&lt;br /&gt;
&lt;br /&gt;
  var adIterator = adSelector.get();&lt;br /&gt;
&lt;br /&gt;
  // There is at most 1 Ad.&lt;br /&gt;
  if (adIterator.hasNext()) {&lt;br /&gt;
    var currentAccount = AdWordsApp.currentAccount();&lt;br /&gt;
    return new Ad(null, null, adIterator.next(), currentAccount);&lt;br /&gt;
  } else {&lt;br /&gt;
    return null;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * An object representation of a row in a spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @constructor&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Array&amp;lt;Object&amp;gt;} values The values in this row.&lt;br /&gt;
 * @param {Range} allRange A range where this row is part of.&lt;br /&gt;
 * @param {number} rowOffset The row offset for this row within `allRange`.&lt;br /&gt;
 * @param {Object} columnNamesToIndices A mapping between a columnName&lt;br /&gt;
 *                 and an index.&lt;br /&gt;
 */&lt;br /&gt;
function SpreadsheetRow(values, allRange, rowOffset, columnNamesToIndices) {&lt;br /&gt;
  if (isEmpty(values) || isEmpty(allRange) || isNaN(rowOffset) ||&lt;br /&gt;
      isEmpty(columnNamesToIndices)) {&lt;br /&gt;
    throw 'Unable to retrieve row in spreadsheet because of incorrect ' +&lt;br /&gt;
        'parameters passed to the &amp;quot;SpreadsheetRow&amp;quot; function.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Because of the hard dependency in 'errorMessage', validate whether it&lt;br /&gt;
  // exists.&lt;br /&gt;
  if (!columnNamesToIndices.hasOwnProperty('errorMessage') ||&lt;br /&gt;
      isEmpty(columnNamesToIndices.errorMessage)) {&lt;br /&gt;
    throw '`errorMessage` is a required attribute for `columnNamesToIndices` ' +&lt;br /&gt;
        'in order to be able to properly identify where to write error ' +&lt;br /&gt;
        'messages in a spreadsheet row';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // The Range of the row in sheet.&lt;br /&gt;
  this.range_ = allRange.offset(rowOffset, 0, 1, allRange.getLastColumn());&lt;br /&gt;
&lt;br /&gt;
  // The index of the row in sheet.&lt;br /&gt;
  this.rowIndex_ = this.range_.getRowIndex();&lt;br /&gt;
&lt;br /&gt;
  // Storing a reference to this object and it will be used as read-only.&lt;br /&gt;
  this.columnNamesToIndices_ = columnNamesToIndices;&lt;br /&gt;
&lt;br /&gt;
  this.hasErrors_ = false;&lt;br /&gt;
  // The values of the row in sheet.&lt;br /&gt;
  this.values_ = values;&lt;br /&gt;
&lt;br /&gt;
  // Start fresh by removing any existing errors in this particular row.&lt;br /&gt;
  this.markAsResolved();&lt;br /&gt;
  // Check for proper values.&lt;br /&gt;
  this.validateValues_();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Validates values in this row, if any improper values are detected&lt;br /&gt;
 * then display appropriate error message in error column.&lt;br /&gt;
 *&lt;br /&gt;
 * @private&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.validateValues_ = function() {&lt;br /&gt;
  var staStatusValue = this.get('staStatus');&lt;br /&gt;
&lt;br /&gt;
  if (!isSupportedStatus(staStatusValue)) {&lt;br /&gt;
    this.markAsError('Unsuported STA status with value of \'' +&lt;br /&gt;
                     staStatusValue + '\'.');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var etaStatusValue = this.get('etaStatus');&lt;br /&gt;
&lt;br /&gt;
  if (!isSupportedStatus(etaStatusValue)) {&lt;br /&gt;
    this.markAsError('Unsuported ETA status with value of \'' +&lt;br /&gt;
                     etaStatusValue + '\'.');&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieve the column index of a column name.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} columnName The name of the column in the spreadsheet we want&lt;br /&gt;
 *                            to retrieve index for.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number} The index of columnName.&lt;br /&gt;
 * @private&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.getColumnIndex_ = function(columnName) {&lt;br /&gt;
  if (!(columnName in this.columnNamesToIndices_)) {&lt;br /&gt;
    throw 'Column &amp;quot;' + columnName + '&amp;quot; does not exist.';&lt;br /&gt;
  } else {&lt;br /&gt;
    return this.columnNamesToIndices_[columnName];&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the value of a given column for this row.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} columnName&lt;br /&gt;
 * @param {string} value&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.set = function(columnName, value) {&lt;br /&gt;
  var columnIndex = this.getColumnIndex_(columnName);&lt;br /&gt;
&lt;br /&gt;
  // Add 1, because SpreadSheetApp's Range is relative to 1.&lt;br /&gt;
  this.range_.getCell(1, columnIndex + 1).setValue(value);&lt;br /&gt;
  this.values_[columnIndex] = value;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Gets the value at a given column for this row.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} columnName&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number|boolean|Date|string} The value stored at given column.&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.get = function(columnName) {&lt;br /&gt;
  var columnIndex = this.getColumnIndex_(columnName);&lt;br /&gt;
&lt;br /&gt;
  return this.values_[columnIndex];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Parse value as a JSON object. Value must be either string or an array.&lt;br /&gt;
 * Also handles the case where a value may be a string with out&lt;br /&gt;
 * quotations.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} columnName&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Array}&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.getArray = function(columnName) {&lt;br /&gt;
  var columnIndex = this.getColumnIndex_(columnName);&lt;br /&gt;
&lt;br /&gt;
  var values = [];&lt;br /&gt;
&lt;br /&gt;
  if (isEmptyString(this.values_[columnIndex])) {&lt;br /&gt;
    return values;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  try {&lt;br /&gt;
    values = JSON.parse(this.values_[columnIndex]);&lt;br /&gt;
  } catch (err) {&lt;br /&gt;
    // Maybe a valid string with no quotations is present.&lt;br /&gt;
    var valueWithQuotes = '&amp;quot;' + this.values_[columnIndex] + '&amp;quot;';&lt;br /&gt;
&lt;br /&gt;
    try {&lt;br /&gt;
      values = JSON.parse(valueWithQuotes);&lt;br /&gt;
    } catch (err) {&lt;br /&gt;
      throw 'Incorrect JSON value stored in `' + columnName + '` column.';&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Must be an array or string.&lt;br /&gt;
  if (!Array.isArray(values) &amp;amp;&amp;amp; (typeof values !== 'string')) {&lt;br /&gt;
    throw 'Incorrect array value stored in `' + columnName + '` column.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // At this point it must be an array or string. If it's a string,&lt;br /&gt;
  // keep return type consistent by always returning an array.&lt;br /&gt;
  if (!Array.isArray(values)) {&lt;br /&gt;
    values = [values];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return values;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Gets the number value at a given column for this row.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} columnName&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number} The number value stored at given column.&lt;br /&gt;
 * @throws {string}&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.getNumber = function(columnName) {&lt;br /&gt;
  var value = this.get(columnName);&lt;br /&gt;
&lt;br /&gt;
  if (isNaN(value)) {&lt;br /&gt;
    throw 'Value stored in &amp;quot;' + columnName + '&amp;quot; is not a valid number.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return Number(value);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Gets the string value at a given column for this row.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} columnName&lt;br /&gt;
 *&lt;br /&gt;
 * @return {string} The string value stored at given column.&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.getString = function(columnName) {&lt;br /&gt;
  var value = this.get(columnName);&lt;br /&gt;
&lt;br /&gt;
  return value.toString();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieve the cell at a given column for this row.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} columnName&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Range}&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.getCell = function(columnName) {&lt;br /&gt;
  var columnIndex = this.getColumnIndex_(columnName);&lt;br /&gt;
  return this.range_.getCell(1, columnIndex + 1);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns true if row has been marked with an error.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean}&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.hasErrors = function() {&lt;br /&gt;
  return this.hasErrors_;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Highlights row signalling that an error has occured.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string|Array&amp;lt;string&amp;gt;} messages Messages to print and add to error&lt;br /&gt;
 *                                      column. Can be a single string or an&lt;br /&gt;
 *                                      array of strings.&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.markAsError = function(messages) {&lt;br /&gt;
  if (isEmpty(messages) || isEmptyString(messages)) {&lt;br /&gt;
    throw 'Empty `messages` parameter provided. A non-empty message must be ' +&lt;br /&gt;
        'provided.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.range_.setBackground('red');&lt;br /&gt;
&lt;br /&gt;
  if (Array.isArray(messages)) {&lt;br /&gt;
    messages = messages.join('\n- ');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  messages = '- ' + messages + '\n';&lt;br /&gt;
&lt;br /&gt;
  // Append to any content already present in `errorMessage` column.&lt;br /&gt;
  this.set('errorMessage', this.get('errorMessage') + messages);&lt;br /&gt;
  print(messages);&lt;br /&gt;
  this.hasErrors_ = true;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Removes any previous highlights set on this row.&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.markAsResolved = function() {&lt;br /&gt;
  this.range_.setBackground(null);&lt;br /&gt;
  this.set('errorMessage', '');&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieve the index of this row in spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number}&lt;br /&gt;
 */&lt;br /&gt;
SpreadsheetRow.prototype.getRowIndex = function() {&lt;br /&gt;
  return this.rowIndex_;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Determines whether the `status` parameter is equivalant to one of the&lt;br /&gt;
 * supported Ad statuses.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} status&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean}&lt;br /&gt;
 */&lt;br /&gt;
function isSupportedStatus(status) {&lt;br /&gt;
  return (status === Ad.statuses.ENABLED ||&lt;br /&gt;
      status === Ad.statuses.PAUSED);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Makes an array of objects indexable by a certain attribute in it's objects.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Array&amp;lt;Object&amp;gt;} objects An array of objects from which index&lt;br /&gt;
 *                                keys will be retrieved from.&lt;br /&gt;
 * @param {Array&amp;lt;string&amp;gt;} keys The keys to set index as. If more than one&lt;br /&gt;
 *                             element, then keys will get concatenated.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Object}&lt;br /&gt;
 */&lt;br /&gt;
function createIndexableObjectFromKeys(objects, keys) {&lt;br /&gt;
  if (isEmpty(objects)) {&lt;br /&gt;
    return {};&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var indexableObject = {};&lt;br /&gt;
&lt;br /&gt;
  objects.forEach(function(object) {&lt;br /&gt;
    var newIndexArray = [];&lt;br /&gt;
    keys.forEach(function(key) {&lt;br /&gt;
      var indexValue = object[key];&lt;br /&gt;
      if (!isEmptyString(indexValue)) {&lt;br /&gt;
        newIndexArray.push(indexValue);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (newIndexArray.length &amp;gt; 0) {&lt;br /&gt;
      var newIndexString = newIndexArray.join('|');&lt;br /&gt;
      if (!isEmptyString(newIndexString)) {&lt;br /&gt;
        indexableObject[newIndexString] = object;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  return indexableObject;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieves the last row checked when syncing spreadsheet and increments&lt;br /&gt;
 * value by 1.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Sheet} sheet&lt;br /&gt;
 * @param {string} key&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Object} An object with a reference to cell and integer representing&lt;br /&gt;
 *                   the index of last row checked.&lt;br /&gt;
 */&lt;br /&gt;
function getLastRowCheck(sheet, key) {&lt;br /&gt;
&lt;br /&gt;
  var cell = sheet.getRange(key);&lt;br /&gt;
  var lastRowChecked = cell.getValue();&lt;br /&gt;
&lt;br /&gt;
  if (isNaN(lastRowChecked)) {&lt;br /&gt;
    return {&lt;br /&gt;
      cell: null,&lt;br /&gt;
      value: 0&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  cell.setValue(lastRowChecked + 1);&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    cell: cell,&lt;br /&gt;
    value: lastRowChecked&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieves all non-empty rows, starting from config.startRowIndex.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Sheet} sheet A sheet in the spreadsheet.&lt;br /&gt;
 * @param {number} firstContentRow The index which content is expected to start.&lt;br /&gt;
 * @param {number} nonEmptyColumnCheck The column index to check and determine&lt;br /&gt;
 *                                  if row is considered empty.&lt;br /&gt;
 * @param {Object} columnNamesToIndices A mapping between column indices and&lt;br /&gt;
 *                 column names.&lt;br /&gt;
 * @param {boolean} isValidOnly If true, invalid rows will be filtered out.&lt;br /&gt;
 * @param {Array&amp;lt;SpreadsheetRow&amp;gt;} rowCache The row cache to use for the rows&lt;br /&gt;
 *                                         output. Only valid if it matches the&lt;br /&gt;
 *                                         target output size.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {{rows: Array&amp;lt;SpreadsheetRow&amp;gt;,&lt;br /&gt;
 *           maxRows: number,&lt;br /&gt;
 *           newRowCache: Array&amp;lt;SpreadsheetRow&amp;gt; }} Object containing:&lt;br /&gt;
 *                     rows Containing the main content of the sheet.&lt;br /&gt;
 *                     maxRows The maximum number of row values possible in&lt;br /&gt;
 *                             the range.&lt;br /&gt;
 *                     newRowCache A sparse array of all rows added + cached&lt;br /&gt;
 *                                 rows during this execution of getContentRows.&lt;br /&gt;
 */&lt;br /&gt;
function getContentRows(sheet, firstContentRow, nonEmptyColumnCheck,&lt;br /&gt;
                        columnNamesToIndices, isValidOnly, rowCache) {&lt;br /&gt;
  // Make sure parameters are valid.&lt;br /&gt;
  if (isNaN(firstContentRow) ||&lt;br /&gt;
      firstContentRow &amp;lt;= 0 ||&lt;br /&gt;
      isEmptyString(nonEmptyColumnCheck) ||&lt;br /&gt;
      isEmptyString(columnNamesToIndices) ||&lt;br /&gt;
      (!isEmpty(rowCache) &amp;amp;&amp;amp; !Array.isArray(rowCache))) {&lt;br /&gt;
    throw 'Unable to retrieve spreadsheet\'s content because of incorrect ' +&lt;br /&gt;
        'parameters passed to the &amp;quot;getContentRows&amp;quot; function.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Retrieve all the range at once to avoid checking each row separately.&lt;br /&gt;
  var endRowIndex = sheet.getLastRow();&lt;br /&gt;
  var lastColumnIndex = sheet.getLastColumn();&lt;br /&gt;
&lt;br /&gt;
  if (firstContentRow &amp;gt; endRowIndex) {&lt;br /&gt;
    // Spreadsheet is empty.&lt;br /&gt;
    return {&lt;br /&gt;
      rows: []&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var range = sheet.getRange(firstContentRow, 1,&lt;br /&gt;
                             endRowIndex - firstContentRow + 1,&lt;br /&gt;
                             lastColumnIndex);&lt;br /&gt;
  var values = range.getValues();&lt;br /&gt;
  var maxRows = range.getNumRows();&lt;br /&gt;
&lt;br /&gt;
  if (rowCache &amp;amp;&amp;amp;&lt;br /&gt;
      rowCache.length !== maxRows) {&lt;br /&gt;
    throw 'Parameter rowCache passed to &amp;quot;getContentRows&amp;quot; function ' +&lt;br /&gt;
        'is incorrect size: ' +&lt;br /&gt;
        'rowCache.length: ' + rowCache.length + '!== ' +&lt;br /&gt;
        'maxRows: ' + maxRows;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var spreadsheetRows = [];&lt;br /&gt;
  var nonEmptyIndexCheck = columnNamesToIndices[nonEmptyColumnCheck];&lt;br /&gt;
&lt;br /&gt;
  if (isEmpty(nonEmptyIndexCheck)) {&lt;br /&gt;
    throw 'Please make sure to supply a value for `nonEmptyColumnCheck` that ' +&lt;br /&gt;
          'defines whether a row is considered to be empty or not.';&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var newRowCache = [];&lt;br /&gt;
  newRowCache.length = maxRows;&lt;br /&gt;
  for (var rowOffset = 0; rowOffset &amp;lt; maxRows; rowOffset++) {&lt;br /&gt;
    // Check against the nonEmptyColumnIndex, to make sure&lt;br /&gt;
    // this row contains values.&lt;br /&gt;
    if (!isEmptyString(values[rowOffset][nonEmptyIndexCheck])) {&lt;br /&gt;
      var row = null;&lt;br /&gt;
      if (rowCache) {&lt;br /&gt;
        row = rowCache[rowOffset];&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (!row) {&lt;br /&gt;
        row = new SpreadsheetRow(values[rowOffset], range, rowOffset,&lt;br /&gt;
                                     columnNamesToIndices);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (!row) {&lt;br /&gt;
        throw 'Spreadsheet row was not correctly created for rowOffset: ' +&lt;br /&gt;
            rowOffset;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Cache row, even if it contains errors.&lt;br /&gt;
      newRowCache[rowOffset] = row;&lt;br /&gt;
      if (isValidOnly &amp;amp;&amp;amp; row.hasErrors()) {&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      spreadsheetRows.push(row);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    rows: spreadsheetRows,&lt;br /&gt;
    newRowCache: newRowCache,&lt;br /&gt;
    maxRows: maxRows&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Send an email notification.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} to The email address to send the notification to.&lt;br /&gt;
 * @param {number} event The event type.&lt;br /&gt;
 * @param {Object} payload The payload used in the email template.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} Success/failure.&lt;br /&gt;
 */&lt;br /&gt;
function notify(to, event, payload) {&lt;br /&gt;
  var template = getEmailTemplate(event, payload);&lt;br /&gt;
  if (template) {&lt;br /&gt;
    // Strip down HTML elements for devices that don't render HTML.&lt;br /&gt;
    var body = template.body.replace(/&amp;lt;b&amp;gt;|&amp;lt;\/b&amp;gt;|&amp;lt;i&amp;gt;|&amp;lt;\/i&amp;gt;/g, '')&lt;br /&gt;
          .replace(/&amp;lt;br\/&amp;gt;/g, '\n');&lt;br /&gt;
    try {&lt;br /&gt;
      MailApp.sendEmail(to, template.subject, body, {&lt;br /&gt;
        htmlBody: template.body&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      // Successfully sent email notification.&lt;br /&gt;
      return true;&lt;br /&gt;
    } catch (err) {&lt;br /&gt;
      print('\n******* ERROR: Failed to send email to: ' + to + '. ' +&lt;br /&gt;
            err + '*******\n');&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Failed to send email notification.&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Get email template by event type.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {number} event The event type.&lt;br /&gt;
 * @param {Object} payload The payload used in the template.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Object} An object with `subject` and `body` attributes,&lt;br /&gt;
 *                  or `null` if not found.&lt;br /&gt;
 */&lt;br /&gt;
function getEmailTemplate(event, payload) {&lt;br /&gt;
  var template = null;&lt;br /&gt;
  switch (event) {&lt;br /&gt;
    case SPREADSHEET_CREATED:&lt;br /&gt;
      template = {&lt;br /&gt;
        subject: '[ETA Transition Helper] installed successfully',&lt;br /&gt;
        body: 'Hello,&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;' +&lt;br /&gt;
              'The ETA Transition Helper was installed successfully on your ' +&lt;br /&gt;
              'account \'' + AdWordsApp.currentAccount().getName() +&lt;br /&gt;
              '\'.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;' +&lt;br /&gt;
              'To view the exported standard text ads and begin creating ' +&lt;br /&gt;
              'expanded text ads open &amp;lt;a href=\'' + payload + '\'&amp;gt;this ' +&lt;br /&gt;
              'spreadsheet&amp;lt;/a&amp;gt;.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;' +&lt;br /&gt;
              'Yours,&amp;lt;br/&amp;gt;' +&lt;br /&gt;
              'ETA Transition Helper'&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return template;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Copies an existing file.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} sourceId The ID of the existing file.&lt;br /&gt;
 * @param {string} outputName The output file name.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {?File} A handler on the new file, or null if failed.&lt;br /&gt;
 */&lt;br /&gt;
function copyFile(sourceId, outputName) {&lt;br /&gt;
  var output = null;&lt;br /&gt;
  try {&lt;br /&gt;
    var source = DriveApp.getFileById(sourceId);&lt;br /&gt;
    var destination = DriveApp.getRootFolder();&lt;br /&gt;
    // Create the copy in the root folder.&lt;br /&gt;
    output = source.makeCopy(outputName, destination);&lt;br /&gt;
    output.setDescription('[' + getUniqueFileTag(sourceId) + '] ' + outputName);&lt;br /&gt;
    print('- Created a new file: ' + output.getUrl());&lt;br /&gt;
  } catch (e) {&lt;br /&gt;
    print('\n******* ERROR: Failed to copy file: ' + e + '*******');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Get the email address of the user who owns this file.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {File|Spreadsheet} file Selected file.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {?string} The email address or `null` if no owner found.&lt;br /&gt;
 */&lt;br /&gt;
function getFileOwnerEmail(file) {&lt;br /&gt;
  var owner = file &amp;amp;&amp;amp; file.getOwner();&lt;br /&gt;
  return owner &amp;amp;&amp;amp; owner.getEmail();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Validate the CID for an account in the format 123-456-7890.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} cid The CID string to validate.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {number} Return the CID in numerical value i.e. 1234567890&lt;br /&gt;
 * @throws {string}&lt;br /&gt;
 */&lt;br /&gt;
function validateCid(cid) {&lt;br /&gt;
  if (!cid) {&lt;br /&gt;
    throw 'Invalid CID: Empty or null : ' + cid;&lt;br /&gt;
  }&lt;br /&gt;
  if (!isString(cid)) {&lt;br /&gt;
    throw 'Invalid CID: Is not a string : ' + cid;&lt;br /&gt;
  }&lt;br /&gt;
  var cidArray = cid.split('-');&lt;br /&gt;
  if (cidArray.length !== 3) {&lt;br /&gt;
    throw 'Invalid CID: Incorrect separators : ' + cid;&lt;br /&gt;
  }&lt;br /&gt;
  if (cidArray[0].length !== 3) {&lt;br /&gt;
    throw 'Invalid CID: Incorrect part 1 : ' + cid;&lt;br /&gt;
  }&lt;br /&gt;
  if (cidArray[1].length !== 3) {&lt;br /&gt;
    throw 'Invalid CID: Incorrect part 2 : ' + cid;&lt;br /&gt;
  }&lt;br /&gt;
  if (cidArray[2].length !== 4) {&lt;br /&gt;
    throw 'Invalid CID: Incorrect part 3 : ' + cid;&lt;br /&gt;
  }&lt;br /&gt;
  var cidInt = parseInt(cidArray.join(''), 10);&lt;br /&gt;
  if (isNaN(cidInt)) {&lt;br /&gt;
    throw 'Invalid CID: isNaN : ' + cid;&lt;br /&gt;
  }&lt;br /&gt;
  return cidInt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
/////////////////////// SYNC SPREADSHEET HELPERS /////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Combines an array of Ads with their respective rows in the spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Array&amp;lt;string&amp;gt;} customerIds An array of customerIds to filter&lt;br /&gt;
 *                                    resulting Ads. Use empty array to not&lt;br /&gt;
 *                                    filter any Ads.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Array&amp;lt;Object&amp;gt;} Returns an array of objects, in which each object&lt;br /&gt;
 *                         has a reference to a given row in the spreadsheet,&lt;br /&gt;
 *                         and its respective report.&lt;br /&gt;
 */&lt;br /&gt;
function getReportWithSpreadsheetRows(customerIds) {&lt;br /&gt;
  if (!Array.isArray(customerIds)) {&lt;br /&gt;
    throw &amp;quot;customerIds is not a valid array&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Open spreadsheet.&lt;br /&gt;
  var sheet = getCachedSheet(CONFIG.spreadsheet, CONFIG.email);&lt;br /&gt;
&lt;br /&gt;
  var rowObject = getContentRows(sheet,&lt;br /&gt;
                                  CONFIG.spreadsheet.firstContentRow,&lt;br /&gt;
                                  CONFIG.spreadsheet.nonEmptyColumnCheck,&lt;br /&gt;
                                  CONFIG.spreadsheet.columnNamesToIndices,&lt;br /&gt;
                                  true,&lt;br /&gt;
                                  CONFIG.spreadsheet.rowCache);&lt;br /&gt;
  var nonEmptyValidRows = rowObject.rows;&lt;br /&gt;
  CONFIG.spreadsheet.rowCache = rowObject.newRowCache;&lt;br /&gt;
&lt;br /&gt;
  // Get rows containing content.&lt;br /&gt;
  var report = AdWordsApp.report(&lt;br /&gt;
      'SELECT ' + CONFIG.reportFields.join(',') + ' ' +&lt;br /&gt;
      'FROM     AD_PERFORMANCE_REPORT ' +&lt;br /&gt;
      'WHERE    AdType = &amp;quot;TEXT_AD&amp;quot; ' +&lt;br /&gt;
      '         AND Status = &amp;quot;ENABLED&amp;quot; ' +&lt;br /&gt;
      '         AND CreativeApprovalStatus != &amp;quot;DISAPPROVED&amp;quot; ' +&lt;br /&gt;
      'DURING   ' + CONFIG.duration, {&lt;br /&gt;
        apiVersion: CONFIG.apiVersion&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
  var mostPerformingAds = getMostPerformingAds(report, CONFIG);&lt;br /&gt;
  var performingETA = getETAReports(CONFIG);&lt;br /&gt;
&lt;br /&gt;
  // Swith Ads to a [id]=&amp;gt;Ad object structure.&lt;br /&gt;
  mostPerformingAds = createIndexableObjectFromKeys(mostPerformingAds, ['id']);&lt;br /&gt;
  performingETA = createIndexableObjectFromKeys(performingETA, ['id']);&lt;br /&gt;
&lt;br /&gt;
  var rowsAndAds = [];&lt;br /&gt;
&lt;br /&gt;
  nonEmptyValidRows.forEach(function(row) {&lt;br /&gt;
   // Skip if this row does not belong to any of the customerIds passed.&lt;br /&gt;
    if (customerIds.length &amp;gt; 0 &amp;amp;&amp;amp;&lt;br /&gt;
        customerIds.indexOf(row.get('customerId')) === -1) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var sta = mostPerformingAds[row.get('staId')];&lt;br /&gt;
    var eta = performingETA[row.get('etaId')];&lt;br /&gt;
&lt;br /&gt;
    if (!sta) {&lt;br /&gt;
      sta = null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!eta) {&lt;br /&gt;
      eta = null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rowsAndAds.push({&lt;br /&gt;
      row: row,&lt;br /&gt;
      sta: sta,&lt;br /&gt;
      eta: eta&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  return rowsAndAds;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Splices `spreadsheetRowsAndReport` according to `lastRowCheckedIndex`&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Array&amp;lt;Object&amp;gt;} spreadsheetRowsAndReport&lt;br /&gt;
 * @param {number} lastRowCheckedIndex The index of last row processed in&lt;br /&gt;
 *                                     previous run.&lt;br /&gt;
 * @param {number} headerIndex The index of the row containing header.&lt;br /&gt;
 */&lt;br /&gt;
function spliceFromLastRowChecked(spreadsheetRowsAndReport, lastRowCheckedIndex,&lt;br /&gt;
                                  headerIndex) {&lt;br /&gt;
  if (isNaN(lastRowCheckedIndex)) {&lt;br /&gt;
    lastRowCheckedIndex = 0;&lt;br /&gt;
  }&lt;br /&gt;
  // Get Index stored in lastRowCheckedCell relative to header.&lt;br /&gt;
  lastRowCheckedIndex = lastRowCheckedIndex - headerIndex;&lt;br /&gt;
&lt;br /&gt;
  // If lastRowCheckedIndex is between 0 and number of rows in spreadsheet&lt;br /&gt;
  // (not inclusive) then we can ignore all rows up to lastRowCheckedIndex.&lt;br /&gt;
  if (lastRowCheckedIndex &amp;gt; 0 &amp;amp;&amp;amp;&lt;br /&gt;
      lastRowCheckedIndex &amp;lt; spreadsheetRowsAndReport.length) {&lt;br /&gt;
    spreadsheetRowsAndReport.splice(0, lastRowCheckedIndex);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Determines whether 'etaObj' has the necessary fields and values&lt;br /&gt;
 * set for ETA creation.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {Object} etaObj An ETA object with relevant ETA attributes for ETA&lt;br /&gt;
 *                        creation.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Object} An Ad object with 'ad' and 'errors' attributes. If no errors&lt;br /&gt;
 *                  were encountered then 'ad' will contain an Ad object of&lt;br /&gt;
 *                  newly created Ad, and 'errors' will be an empty array.&lt;br /&gt;
 *                  Otherwise, if an error was encountered then 'error' will be&lt;br /&gt;
 *                  an array of strings and 'ad' will be null.&lt;br /&gt;
 */&lt;br /&gt;
function isValidForETACreation(etaObj) {&lt;br /&gt;
  var returnObject = {&lt;br /&gt;
    ad: null,&lt;br /&gt;
    errors: []&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * REQUIRED:&lt;br /&gt;
   * - finalURL&lt;br /&gt;
   * - headline1&lt;br /&gt;
   * - headline2&lt;br /&gt;
   * - description&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
  if (!etaObj.finalURLs || etaObj.finalURLs.length &amp;lt; 1) {&lt;br /&gt;
    returnObject.errors.push('Failed to create ETA: finalUrl is missing.' +&lt;br /&gt;
                             ' [Required]');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etaObj.finalURLs &amp;amp;&amp;amp; etaObj.finalURLs.length &amp;gt; 1) {&lt;br /&gt;
    returnObject.errors.push('Failed to create ETA: finalUrl supports only a' +&lt;br /&gt;
                             ' single URL');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!etaObj.headline1) {&lt;br /&gt;
    returnObject.errors.push('Failed to create ETA: headline1 is missing.' +&lt;br /&gt;
                             ' [Required]');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!etaObj.headline2) {&lt;br /&gt;
    returnObject.errors.push('Failed to create ETA: headline2 is missing.' +&lt;br /&gt;
                             ' [Required]');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!etaObj.description) {&lt;br /&gt;
    returnObject.errors.push('Failed to create ETA: description is missing.' +&lt;br /&gt;
                             ' [Required]');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
  * OPTIONAL:&lt;br /&gt;
  * - path1&lt;br /&gt;
  *   - path2 (Only if path1)&lt;br /&gt;
  * - mobileFinalURL&lt;br /&gt;
  * - trackingTemplate&lt;br /&gt;
  * - customParameters&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
  if (etaObj.path2 &amp;amp;&amp;amp; !etaObj.path1) {&lt;br /&gt;
    returnObject.errors.push('Failed to create ETA: path1 is missing. Setting' +&lt;br /&gt;
                             ' path2 requires path1 to be set');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etaObj.mobileFinalURLs &amp;amp;&amp;amp; etaObj.mobileFinalURLs.length &amp;gt; 1) {&lt;br /&gt;
    returnObject.errors.push('Failed to create ETA: mobileFinalURL supports' +&lt;br /&gt;
                             ' only a single URL');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!isValidParamsObject(etaObj.customParameters,&lt;br /&gt;
                           ['string'],&lt;br /&gt;
                           false).success) {&lt;br /&gt;
    returnObject.errors.push('Failed to create ETA: customParameters is not' +&lt;br /&gt;
                             ' a valid parameters object');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return returnObject;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Parses a `spreadsheetRow` for appropriate ETA attributes.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {SpreadSheetRow} spreadsheetRow A row in the spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Object} Returns an object containing the necessary fields&lt;br /&gt;
 *                  for creating an ETA.&lt;br /&gt;
 * @throws {string}&lt;br /&gt;
 */&lt;br /&gt;
function parseETA(spreadsheetRow) {&lt;br /&gt;
&lt;br /&gt;
  var customParametersStr = spreadsheetRow.getString('customParameters');&lt;br /&gt;
  var customParameters = null;&lt;br /&gt;
  if (customParametersStr) {&lt;br /&gt;
    try {&lt;br /&gt;
      customParameters = JSON.parse(customParametersStr);&lt;br /&gt;
    }&lt;br /&gt;
    catch (err) {&lt;br /&gt;
      throw 'Invalid customParemeters value in spreadsheet.';&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  return {&lt;br /&gt;
    campaignId: spreadsheetRow.getNumber('campaignId'),&lt;br /&gt;
    adGroupId: spreadsheetRow.getNumber('adGroupId'),&lt;br /&gt;
    finalURLs: spreadsheetRow.getArray('finalUrl'),&lt;br /&gt;
    headline1: spreadsheetRow.getString('headline1'),&lt;br /&gt;
    headline2: spreadsheetRow.getString('headline2'),&lt;br /&gt;
    description: spreadsheetRow.getString('description'),&lt;br /&gt;
    path1: spreadsheetRow.getString('path1'),&lt;br /&gt;
    path2: spreadsheetRow.getString('path2'),&lt;br /&gt;
    mobileFinalURLs: spreadsheetRow.getArray('mobileFinalUrl'),&lt;br /&gt;
    trackingTemplate: spreadsheetRow.getString('trackingTemplate'),&lt;br /&gt;
    customParameters: customParameters&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Creates a new ETA.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {SpreadSheetRow} spreadsheetRow A row in the spreadsheet.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Object} An Ad object with 'ad' and 'errors' attributes. If no errors&lt;br /&gt;
 *                  were encountered then 'ad' will contain an Ad object of&lt;br /&gt;
 *                  newly created Ad, and 'errors' will be an empty array.&lt;br /&gt;
 *                  Otherwise, if an error was encountered then 'error' will be&lt;br /&gt;
 *                  an array of strings and 'ad' will be null.&lt;br /&gt;
 */&lt;br /&gt;
function createETA(spreadsheetRow) {&lt;br /&gt;
  var etaObj;&lt;br /&gt;
  // Retrieve ETA fields from spreadsheet row.&lt;br /&gt;
  try {&lt;br /&gt;
    etaObj = parseETA(spreadsheetRow);&lt;br /&gt;
  }&lt;br /&gt;
  catch (err) {&lt;br /&gt;
    return {&lt;br /&gt;
      ad: null,&lt;br /&gt;
      errors: ['Failed to create ETA: ' + err.message]&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var returnObject = isValidForETACreation(etaObj);&lt;br /&gt;
&lt;br /&gt;
  // Retrieve parent Campaign to check if campaign exists.&lt;br /&gt;
  var campaignIterator = AdWordsApp.campaigns()&lt;br /&gt;
      .withIds([etaObj.campaignId])&lt;br /&gt;
      .get();&lt;br /&gt;
&lt;br /&gt;
  if (!campaignIterator.hasNext()) {&lt;br /&gt;
    returnObject.errors.push('Unable to create ETA because Campaign parent' +&lt;br /&gt;
                             ' with id ' + etaObj.campaignId + ' no longer' +&lt;br /&gt;
                             ' exists.');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Retrieve parent AdGroup to add new Ad and check if AdGroup exists.&lt;br /&gt;
  var adGroupIterator = AdWordsApp.adGroups()&lt;br /&gt;
      .withIds([etaObj.adGroupId])&lt;br /&gt;
      .get();&lt;br /&gt;
&lt;br /&gt;
  if (!adGroupIterator.hasNext()) {&lt;br /&gt;
    returnObject.errors.push('Unable to create ETA because AdGroup parent' +&lt;br /&gt;
                             ' with id ' + etaObj.adGroupId + ' no longer' +&lt;br /&gt;
                             ' exists.');&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var adGroup = adGroupIterator.next();&lt;br /&gt;
&lt;br /&gt;
  if (returnObject.errors.length === 0) {&lt;br /&gt;
    try {&lt;br /&gt;
      var adBuilder = adGroup.newAd().expandedTextAdBuilder()&lt;br /&gt;
          .withHeadlinePart1(etaObj.headline1)&lt;br /&gt;
          .withHeadlinePart2(etaObj.headline2)&lt;br /&gt;
          .withDescription(etaObj.description)&lt;br /&gt;
          .withFinalUrl(etaObj.finalURLs[0]);&lt;br /&gt;
&lt;br /&gt;
      if (etaObj.path1) {&lt;br /&gt;
        adBuilder.withPath1(etaObj.path1);&lt;br /&gt;
        if (etaObj.path2) {&lt;br /&gt;
          adBuilder.withPath2(etaObj.path2);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (etaObj.mobileFinalURLs &amp;amp;&amp;amp; etaObj.mobileFinalURLs[0]) {&lt;br /&gt;
        adBuilder.withMobileFinalUrl(etaObj.mobileFinalURLs[0]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (etaObj.trackingTemplate) {&lt;br /&gt;
        adBuilder.withTrackingTemplate(etaObj.trackingTemplate);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (etaObj.customParameters) {&lt;br /&gt;
        adBuilder.withCustomParameters(etaObj.customParameters);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var result = adBuilder.build();&lt;br /&gt;
      if (!result.isSuccessful()) {&lt;br /&gt;
        // No ad was created.&lt;br /&gt;
        var errors = result.getErrors();&lt;br /&gt;
&lt;br /&gt;
        var message = 'Failed to create ETA with errors:';&lt;br /&gt;
        for (var i = 0; i &amp;lt; errors.length; i++) {&lt;br /&gt;
          message += '\n' + errors[i];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        returnObject.errors.push(message);&lt;br /&gt;
      } else {&lt;br /&gt;
        var currentAccount = AdWordsApp.currentAccount();&lt;br /&gt;
        returnObject.ad = new Ad(null, null, result.getResult(),&lt;br /&gt;
                                 currentAccount);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    catch (err) {&lt;br /&gt;
      var message = 'Failed to create ETA: ' + err.message;&lt;br /&gt;
      returnObject.errors.push(message);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return returnObject;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Creates a label if it doesn't exist.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} labelName The name of the label to create.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {boolean} True if label was successfully created, or already exist.&lt;br /&gt;
 */&lt;br /&gt;
function createLabel(labelName) {&lt;br /&gt;
  if (isEmptyString(labelName)) {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var trimmedLabelName = labelName.trim();&lt;br /&gt;
&lt;br /&gt;
  // There can only be one label with `labelName`.&lt;br /&gt;
  var labelIterator = AdWordsApp.labels()&lt;br /&gt;
      .withCondition('Name = &amp;quot;' + trimmedLabelName + '&amp;quot;')&lt;br /&gt;
      .get();&lt;br /&gt;
&lt;br /&gt;
  // If labelIterator has no value, then create label.&lt;br /&gt;
  if (!labelIterator.hasNext()) {&lt;br /&gt;
    try {&lt;br /&gt;
      AdWordsApp.createLabel(trimmedLabelName);&lt;br /&gt;
      return true;&lt;br /&gt;
    } catch (err) {&lt;br /&gt;
      print('Failed to create ' + trimmedLabelName);&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Label exist, no need to create it.&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Used for tracking changes to an Ad.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {?number} adId An id of an Ad.&lt;br /&gt;
 * @param {?number} adGroupId An id of an AdGroup.&lt;br /&gt;
 *&lt;br /&gt;
 * @constructor&lt;br /&gt;
 */&lt;br /&gt;
function AdChange(adId, adGroupId) {&lt;br /&gt;
  this.structure = {&lt;br /&gt;
    adId: null,&lt;br /&gt;
    adGroupId: null&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.structure.adId = null;&lt;br /&gt;
  this.structure.adGroupId = null;&lt;br /&gt;
&lt;br /&gt;
  if (!isEmpty(adId) &amp;amp;&amp;amp; !isEmpty(adGroupId)) {&lt;br /&gt;
    this.structure.adId = adId;&lt;br /&gt;
    this.structure.adGroupId = adGroupId;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.structure.changes = [];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Append an object representing change, if changeFunction returns a truthful&lt;br /&gt;
 * value. This serves as a wrapper to all Ad change events such as changing&lt;br /&gt;
 * status, labels, etc.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {string} fieldName The name field being changed.&lt;br /&gt;
 * @param {string} oldValue&lt;br /&gt;
 * @param {string} newValue&lt;br /&gt;
 */&lt;br /&gt;
AdChange.prototype.trackChange = function(fieldName, oldValue, newValue) {&lt;br /&gt;
  if (oldValue === newValue || isArrayShallowEquals(oldValue, newValue)) {&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.structure.changes.push({&lt;br /&gt;
    fieldName: fieldName,&lt;br /&gt;
    oldValue: oldValue,&lt;br /&gt;
    newValue: newValue&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This serves as a wrapper for Ad create changes.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {number} adId Id of newly created Ad.&lt;br /&gt;
 * @param {number} adGroupId Id of AdGroup parent of newly created Ad.&lt;br /&gt;
 */&lt;br /&gt;
AdChange.prototype.trackCreate = function(adId, adGroupId) {&lt;br /&gt;
  this.structure.created = true;&lt;br /&gt;
  this.structure.adId = adId;&lt;br /&gt;
  this.structure.adGroupId = adGroupId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Retrieves a reference to changes. Changes are represented by the internal&lt;br /&gt;
 * `structure` property.&lt;br /&gt;
 *&lt;br /&gt;
 * @return {Object}&lt;br /&gt;
 */&lt;br /&gt;
AdChange.prototype.getChangeStruct = function() {&lt;br /&gt;
  return this.structure;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset all changes that were tracked.&lt;br /&gt;
 */&lt;br /&gt;
AdChange.prototype.resetChanges = function() {&lt;br /&gt;
  this.structure.changes = [];&lt;br /&gt;
  this.structure.created = false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</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_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%B8&amp;diff=715</id>
		<title>Ставки для позиции</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_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%B8&amp;diff=715"/>
		<updated>2018-02-13T15:43:05Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: « &amp;lt;pre&amp;gt;  function main() {   //массив ярлыков.    //если один, то просто &amp;quot;Ярлык1&amp;quot;.   //если массив, то [&amp;quot;Ярлык1&amp;quot;…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function main() {&lt;br /&gt;
  //массив ярлыков. &lt;br /&gt;
  //если один, то просто &amp;quot;Ярлык1&amp;quot;.&lt;br /&gt;
  //если массив, то [&amp;quot;Ярлык1&amp;quot;,&amp;quot;Ярлык2&amp;quot;,...,&amp;quot;ЯрлыкN&amp;quot;]  &lt;br /&gt;
  var LabelNames = [&amp;quot;position&amp;quot;];&lt;br /&gt;
  //максимально допустимая цена за клик&lt;br /&gt;
  var maxPrice = 0.5;&lt;br /&gt;
  //минимально допустимая цена&lt;br /&gt;
  var minPrice = 0.2;&lt;br /&gt;
  //нижняя граница базового диапазна AveragePosition&lt;br /&gt;
  var customLowerAveragePosition = 1;&lt;br /&gt;
  //верхняя граница базовго диапазона AveragePosition&lt;br /&gt;
  var customUpperAveragePosition = 1;&lt;br /&gt;
  //проценты для базового диапазона&lt;br /&gt;
  var customPercent = 0;  &lt;br /&gt;
  //(%) шаг для процентов других диапазонов&lt;br /&gt;
  var stepPercent = 5;&lt;br /&gt;
  //наименьшее возможное значение AveragePosition&lt;br /&gt;
  var minAveragePosition = 1;&lt;br /&gt;
  //наибольшее возможное значение AveragePosition&lt;br /&gt;
  var maxAveragePosition = 9;&lt;br /&gt;
  //diapason&lt;br /&gt;
  var diapason = 0.5;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  var tempPercent = customPercent;&lt;br /&gt;
  var down_max = customLowerAveragePosition;&lt;br /&gt;
  var down_min = down_max - diapason;&lt;br /&gt;
  &lt;br /&gt;
  var up_min = customUpperAveragePosition;&lt;br /&gt;
  var up_max = up_min + diapason;&lt;br /&gt;
  &lt;br /&gt;
  var to_up = maxAveragePosition - customUpperAveragePosition;&lt;br /&gt;
  &lt;br /&gt;
  var labelName = &amp;quot;&amp;quot;;&lt;br /&gt;
  if(LabelNames.constructor === Array){&lt;br /&gt;
    labelName = &amp;quot;LabelNames CONTAINS_ANY ['&amp;quot; + LabelNames.join(&amp;quot;','&amp;quot;) + &amp;quot;']&amp;quot;;&lt;br /&gt;
  }else{&lt;br /&gt;
    labelName = &amp;quot;LabelNames = '&amp;quot; + LabelNames + &amp;quot;'&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  Logger.log(&amp;quot;Condition for labels: &amp;quot; + labelName);&lt;br /&gt;
  &lt;br /&gt;
  var selectedKeyword = 0;&lt;br /&gt;
  while(down_max &amp;gt; minAveragePosition){&lt;br /&gt;
    Logger.log(&amp;quot;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++&amp;quot;);&lt;br /&gt;
    tempPercent = tempPercent - stepPercent;&lt;br /&gt;
    var keywordIterator = AdWordsApp.keywords()&lt;br /&gt;
    .withCondition(labelName)&lt;br /&gt;
    .withCondition(&amp;quot;AveragePosition &amp;lt; &amp;quot; + Number(down_max) + &amp;quot; AND AveragePosition &amp;gt; &amp;quot; + Number(down_min - 0.01))&lt;br /&gt;
    .withCondition(&amp;quot;Impressions &amp;gt; 0&amp;quot;)&lt;br /&gt;
    .forDateRange(&amp;quot;LAST_7_DAYS&amp;quot;)&lt;br /&gt;
    .get();&lt;br /&gt;
    Logger.log(&amp;quot; AveragePosition &amp;lt; &amp;quot; + Number(down_max) + &amp;quot; AND AveragePosition &amp;gt; &amp;quot; + Number(down_min - 0.01));&lt;br /&gt;
    while(keywordIterator.hasNext()){&lt;br /&gt;
      selectedKeyword = selectedKeyword + 1;&lt;br /&gt;
      Logger.log(&amp;quot;   ---------------&amp;quot;);&lt;br /&gt;
      var keyword = keywordIterator.next();&lt;br /&gt;
      Logger.log(&amp;quot;   &amp;quot; + selectedKeyword + &amp;quot;   ----------- keyword: &amp;quot; + keyword.getText());&lt;br /&gt;
      Logger.log(&amp;quot;   old price &amp;quot; + keyword.getMaxCpc());&lt;br /&gt;
       var tempPrice = keyword.getMaxCpc() + (keyword.getMaxCpc() * tempPercent)/100;&lt;br /&gt;
       if (tempPrice &amp;gt; maxPrice) {&lt;br /&gt;
         keyword.setMaxCpc(maxPrice);&lt;br /&gt;
       }else if (tempPrice &amp;lt; minPrice){&lt;br /&gt;
         keyword.setMaxCpc(minPrice);&lt;br /&gt;
       }else{&lt;br /&gt;
         keyword.setMaxCpc(tempPrice);&lt;br /&gt;
       }&lt;br /&gt;
       Logger.log(&amp;quot;   new price &amp;quot; + keyword.getMaxCpc());&lt;br /&gt;
       Logger.log(&amp;quot;   add percent &amp;quot; + tempPercent);&lt;br /&gt;
     }&lt;br /&gt;
    down_max = down_min - 0.01;&lt;br /&gt;
    down_min = down_max - diapason;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  tempPercent = customPercent;&lt;br /&gt;
  &lt;br /&gt;
  while(up_min &amp;lt; maxAveragePosition){&lt;br /&gt;
    Logger.log(&amp;quot;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++&amp;quot;);&lt;br /&gt;
    tempPercent = tempPercent + stepPercent;&lt;br /&gt;
    var keywordIterator = AdWordsApp.keywords()&lt;br /&gt;
    .withCondition(labelName)&lt;br /&gt;
    .withCondition(&amp;quot;AveragePosition &amp;lt; &amp;quot; + Number(up_max) + &amp;quot; AND AveragePosition &amp;gt; &amp;quot; + Number(up_min-0.01))&lt;br /&gt;
    .withCondition(&amp;quot;Impressions &amp;gt; 0&amp;quot;)&lt;br /&gt;
    .forDateRange(&amp;quot;LAST_7_DAYS&amp;quot;)&lt;br /&gt;
    .get();&lt;br /&gt;
    Logger.log(&amp;quot; AveragePosition &amp;lt; &amp;quot; + Number(up_max) + &amp;quot; AND AveragePosition &amp;gt; &amp;quot; + Number(up_min-0.01));&lt;br /&gt;
     while (keywordIterator.hasNext()){&lt;br /&gt;
       selectedKeyword = selectedKeyword + 1;&lt;br /&gt;
       Logger.log(&amp;quot;   ---------------&amp;quot;);&lt;br /&gt;
       var keyword = keywordIterator.next();&lt;br /&gt;
       Logger.log(&amp;quot;   &amp;quot; + selectedKeyword + &amp;quot;   ------------------keyword &amp;quot; + keyword.getText());&lt;br /&gt;
       Logger.log(&amp;quot;   old price &amp;quot; + keyword.getMaxCpc());&lt;br /&gt;
       var tempPrice = keyword.getMaxCpc() + (keyword.getMaxCpc() * tempPercent)/100;&lt;br /&gt;
       if (tempPrice &amp;gt; maxPrice) {&lt;br /&gt;
         keyword.setMaxCpc(maxPrice);&lt;br /&gt;
       }else if (tempPrice &amp;lt; minPrice){&lt;br /&gt;
         keyword.setMaxCpc(minPrice);&lt;br /&gt;
       }else{&lt;br /&gt;
         keyword.setMaxCpc(tempPrice);&lt;br /&gt;
       }&lt;br /&gt;
       Logger.log(&amp;quot;   new price &amp;quot; + keyword.getMaxCpc());&lt;br /&gt;
       Logger.log(&amp;quot;   add percent &amp;quot; + tempPercent);&lt;br /&gt;
     }&lt;br /&gt;
    &lt;br /&gt;
    up_min = up_max;&lt;br /&gt;
    up_max = up_max + diapason;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2_%D0%BD%D0%B0_YouTube&amp;diff=714</id>
		<title>Поиск тематических каналов на YouTube</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2_%D0%BD%D0%B0_YouTube&amp;diff=714"/>
		<updated>2018-02-13T15:41:54Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: « &amp;lt;pre&amp;gt;  function main() {   var spreadsheetUrl = &amp;quot;https://docs.google.com/spreadsheets/d/151uIsb3Ctndruy7AoW3W1unLwmNDsv0ynMrBg-uXOmY/edit&amp;quot;;   var ss = Spreadshee…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function main() {&lt;br /&gt;
  var spreadsheetUrl = &amp;quot;https://docs.google.com/spreadsheets/d/151uIsb3Ctndruy7AoW3W1unLwmNDsv0ynMrBg-uXOmY/edit&amp;quot;;&lt;br /&gt;
  var ss = SpreadsheetApp.openByUrl(spreadsheetUrl);&lt;br /&gt;
  var kwSheet = ss.getSheetByName('Слова');&lt;br /&gt;
  var resSheet = ss.getSheetByName('Площадки');&lt;br /&gt;
  var lastRow = kwSheet.getLastRow();&lt;br /&gt;
  resSheet.clear();&lt;br /&gt;
  var range = kwSheet.getRange(1, 1, lastRow+1, 1);&lt;br /&gt;
  var values = range.getValues();&lt;br /&gt;
  var placements = [];&lt;br /&gt;
  for(var i = 0; values.length - 1 &amp;gt; i; i++) {&lt;br /&gt;
  var query = values[i][0];&lt;br /&gt;
var results = YouTube.Search.list('id,snippet', {q: query, maxResults: 25, type: 'channel'});&lt;br /&gt;
  for (var j in results.items) {&lt;br /&gt;
 var item = results.items[j];&lt;br /&gt;
  placements.push(['youtube.com/channel/'+item.id.channelId,item.snippet.title]);&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
 resSheet.getRange(1, 1, placements.length, 2).setValues(placements);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A7%D0%B8%D1%81%D1%82%D0%BA%D0%B0_%D0%BC%D0%B5%D1%81%D1%82_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=713</id>
		<title>Чистка мест размещения</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A7%D0%B8%D1%81%D1%82%D0%BA%D0%B0_%D0%BC%D0%B5%D1%81%D1%82_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=713"/>
		<updated>2018-02-13T15:40:26Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: «&amp;lt;pre&amp;gt; /* 1) Поиск мест размещений идет по всему аккаунту. Эти исключения мест размещений авто…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
1) Поиск мест размещений идет по всему аккаунту. Эти исключения мест размещений автоматически общий список &amp;quot;PlacementCleanerList&amp;quot;, который создается автоматически.&lt;br /&gt;
&lt;br /&gt;
2) Проверьте, подходят ли вам исключения. Добавьте или удалите ненужные. Можно добавить для исключения и доменную зону. Пример: '.kz'&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
var exclude = ['gta', 'dota', 'minecraft', 'resheb', 'referat', 'igry','igra', 'igri', 'game', 'flash', 'apk', 'android', 'mp3', 'fb2', 'dating', 'goroskop', 'astro', 'video', 'movie', 'book', 'download', 'torrent', 'radio', 'weather', 'pesni', 'chords', 'anekdot', 'zodiak', 'minusovk', 'knig', 'recept', 'recipe', 'spongebob', 'barbie', 'skyrim', 'ferma', 'dom2', 'mafia', 'gadani', 'mario', 'epub', '2048', 'dendy', 'sega', 'zuma', 'aforizm', 'citat', 'pdf'];&lt;br /&gt;
&lt;br /&gt;
var EXCLUDED_PLACEMENT_LIST_NAME = 'PlacementCleanerList';&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
3) Выберите период учета статистики или очистите поле, чтобы обработать данные в аккаунте за весь период.&lt;br /&gt;
&lt;br /&gt;
Возможные периоды:&lt;br /&gt;
LAST_7_DAYS&lt;br /&gt;
LAST_WEEK&lt;br /&gt;
LAST_MONTH&lt;br /&gt;
LAST_14_DAYS&lt;br /&gt;
LAST_30_DAYS&lt;br /&gt;
LAST_BUSINESS_WEEK&lt;br /&gt;
THIS_WEEK_SUN_TODAY&lt;br /&gt;
THIS_WEEK_MON_TODAY&lt;br /&gt;
LAST_WEEK_SUN_SAT&lt;br /&gt;
THIS_MONTH&lt;br /&gt;
ALL_TIME&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
var period = 'LAST_7_DAYS';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function main() {&lt;br /&gt;
 var periodString = '';&lt;br /&gt;
 &lt;br /&gt;
 if(period &amp;amp;&amp;amp; period != 'ALL_TIME') {&lt;br /&gt;
 periodString = &amp;quot;DURING &amp;quot; + period;&lt;br /&gt;
 Logger.log(periodString);&lt;br /&gt;
 } else {&lt;br /&gt;
 Logger.log('DURING ALL TIME');&lt;br /&gt;
 }&lt;br /&gt;
 var report = AdWordsApp.report(&amp;quot;SELECT Domain &amp;quot; +&lt;br /&gt;
 &amp;quot;FROM AUTOMATIC_PLACEMENTS_PERFORMANCE_REPORT &amp;quot; +&lt;br /&gt;
 periodString);&lt;br /&gt;
 &lt;br /&gt;
 var rows = report.rows();&lt;br /&gt;
 var excludePlacementArray = [];&lt;br /&gt;
 &lt;br /&gt;
 while (rows.hasNext()) {&lt;br /&gt;
 var row = rows.next();&lt;br /&gt;
 var placement = row['Domain'];&lt;br /&gt;
 if (containsAny(placement.toString(), exclude)) {&lt;br /&gt;
 excludePlacementArray[excludePlacementArray.length] = placement.toString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 addNegativeKeywordToList(excludePlacementArray);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function containsAny(str, substrings) {&lt;br /&gt;
 for (var i = 0; i != substrings.length; i++) {&lt;br /&gt;
 var substring = substrings[i];&lt;br /&gt;
if (str.indexOf(substring) != - 1 &amp;amp;&amp;amp; str.indexOf('mobileapp::') == -1) {&lt;br /&gt;
 return substring;&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
 return null; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function addNegativeKeywordToList(negativePlacements) {&lt;br /&gt;
 var excludedPlacementListIterator =&lt;br /&gt;
 AdWordsApp.excludedPlacementLists().withCondition(&amp;quot;Name = '&amp;quot; + EXCLUDED_PLACEMENT_LIST_NAME + &amp;quot;'&amp;quot;).get();&lt;br /&gt;
 &lt;br /&gt;
 if (excludedPlacementListIterator.totalNumEntities() == 1) {&lt;br /&gt;
 var excludedPlacementList = excludedPlacementListIterator.next().addExcludedPlacements(negativePlacements);&lt;br /&gt;
 } else {&lt;br /&gt;
 AdWordsApp.newExcludedPlacementListBuilder()&lt;br /&gt;
 .withName(EXCLUDED_PLACEMENT_LIST_NAME)&lt;br /&gt;
 .build().getResult().addExcludedPlacements(negativePlacements);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</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=712</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=712"/>
		<updated>2018-02-13T15:27:28Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: /* Скрипты */&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;
[[Создание аккаунта AdWords]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка поисковой кампании]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка ремаркетинга]]&lt;br /&gt;
&lt;br /&gt;
[[Связывание AdWords и Analytics  и импорт целей]]&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;
&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;
[[Поиск тематических каналов на YouTube]]&lt;br /&gt;
&lt;br /&gt;
[[Чистка мест размещения]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D1%81%D1%81%D1%8B%D0%BB%D0%BE%D0%BA_(%D0%BE%D0%B4%D0%B8%D0%BD_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82)&amp;diff=711</id>
		<title>Инструмент проверки ссылок (один аккаунт)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D1%81%D1%81%D1%8B%D0%BB%D0%BE%D0%BA_(%D0%BE%D0%B4%D0%B8%D0%BD_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82)&amp;diff=711"/>
		<updated>2018-02-13T14:48:50Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1. Создать таблицу, используя шаблон https://docs.google.com/spreadsheets/d/1kytetTPpFJyaSgYYlK24P5vKIvWgh0tWmXwj1thUykY/edit&lt;br /&gt;
&lt;br /&gt;
2. Переменной SPREADSHEET_URL задать нужное значение&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D1%81%D1%81%D1%8B%D0%BB%D0%BE%D0%BA_(%D0%BE%D0%B4%D0%B8%D0%BD_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82)&amp;diff=710</id>
		<title>Инструмент проверки ссылок (один аккаунт)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D1%81%D1%81%D1%8B%D0%BB%D0%BE%D0%BA_(%D0%BE%D0%B4%D0%B8%D0%BD_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82)&amp;diff=710"/>
		<updated>2018-02-13T14:48:20Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1. Создать таблицу, используя шаблон https://docs.google.com/spreadsheets/d/1kytetTPpFJyaSgYYlK24P5vKIvWgh0tWmXwj1thUykY/edit&lt;br /&gt;
2. Переменной SPREADSHEET_URL задать нужное значение&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D1%81%D1%81%D1%8B%D0%BB%D0%BE%D0%BA_(%D0%BE%D0%B4%D0%B8%D0%BD_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82)&amp;diff=709</id>
		<title>Инструмент проверки ссылок (один аккаунт)</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D1%81%D1%81%D1%8B%D0%BB%D0%BE%D0%BA_(%D0%BE%D0%B4%D0%B8%D0%BD_%D0%B0%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82)&amp;diff=709"/>
		<updated>2018-02-13T14:47:25Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: «1. Создать таблицу, используя шаблон Медиа:https://docs.google.com/spreadsheets/d/1kytetTPpFJyaSgYYlK24P5vKIvWgh0tWmXwj1thUykY…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1. Создать таблицу, используя шаблон [[Медиа:https://docs.google.com/spreadsheets/d/1kytetTPpFJyaSgYYlK24P5vKIvWgh0tWmXwj1thUykY/edit]]&lt;br /&gt;
2. Переменной SPREADSHEET_URL задать нужное значение&lt;/div&gt;</summary>
		<author><name>77.122.65.227</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=708</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=708"/>
		<updated>2018-02-13T14:42:31Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &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;
[[Создание аккаунта AdWords]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка поисковой кампании]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка ремаркетинга]]&lt;br /&gt;
&lt;br /&gt;
[[Связывание AdWords и Analytics  и импорт целей]]&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;
&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;
[[Поиск тематических каналов на YouTube]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=607</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=607"/>
		<updated>2018-02-07T15:34:46Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) Конвертим наши статьи в формат utf-8 https://subtitletools.com/convert-text-files-to-utf8-online&amp;lt;br&amp;gt;&lt;br /&gt;
б) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
в) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
г) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech, quickseo1, zimaseo, seorankbuilder, wickedsubmit, Sarj84 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=561</id>
		<title>1. Цели и задачи Веб-аналитики</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=561"/>
		<updated>2018-02-06T14:43:07Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Веб-аналитика'''&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
Веб-аналитика (англ. Webanalytics) – это измерение, сбор, анализ, представление и интерпретация информации о посетителях веб-сайтов с целью их улучшения и оптимизации.&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;
От кол-ва трафика на Ваш сайт до оценки возврата инвестиций (ROI) каждого вложенного Вами доллара.&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;
&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;
в) Показатели эффективности (KPI);&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 Analytics.'''&lt;br /&gt;
&lt;br /&gt;
[https://analytics.google.com/ Google Analytics] показывает, каким образом пользователи перешли на ваш сайт, как они с ним взаимодействовали и как его можно улучшить. &lt;br /&gt;
&lt;br /&gt;
Располагая этой информацией, вы можете повысить рентабельность инвестиций, увеличить количество конверсий и, в конечном счете, больше зарабатывать.&lt;br /&gt;
&lt;br /&gt;
GA является универсальным инструментом, без которого сейчас трудно представить работу SEO-специалиста, SMM-сциалиста, интернет-маркетолога и юзабилиста.&lt;br /&gt;
&lt;br /&gt;
Когда приходит время решать узкие задачи вашего бизнеса, которые связаны с продажами online, &lt;br /&gt;
Google Analytics помогает построить из имеющегося функционала действующий механизм, который способен указать на многие мелочи. &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;
&lt;br /&gt;
'''Ниже приведены возможности данных ресурсов, а также ключевые отличия Яндекс.Метрики от Google Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics дает возможности:&lt;br /&gt;
&lt;br /&gt;
• отслеживание	KPI	(основных показателей эффективности рекламных кампаний);&lt;br /&gt;
&lt;br /&gt;
• оценка	уровня	интерактивности	и юзабельности	сайта;&lt;br /&gt;
&lt;br /&gt;
• получение финансовой статистики, которая генерируется сайтом (получение данных о продажах с сайта с транзакционными составляющими (товар - цена));&lt;br /&gt;
&lt;br /&gt;
• оценка эффективности продвижения сайта (SEO, PPC, SMM);&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 Analytics, а именно:'''&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;
[[2. Основные показатели эффективности KPI Веб-аналитики]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=560</id>
		<title>1. Цели и задачи Веб-аналитики</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=560"/>
		<updated>2018-02-06T14:26:58Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Веб-аналитика'''&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
Веб-аналитика (англ. Webanalytics) – это измерение, сбор, анализ, представление и интерпретация информации о посетителях веб-сайтов с целью их улучшения и оптимизации.&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;
От кол-ва трафика на Ваш сайт до оценки возврата инвестиций (ROI) каждого вложенного Вами доллара.&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;
&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;
в) Показатели эффективности (KPI);&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 Analytics.'''&lt;br /&gt;
&lt;br /&gt;
[https://analytics.google.com/ Google Analytics] показывает, каким образом пользователи перешли на ваш сайт, как они с ним взаимодействовали и как его можно улучшить. &lt;br /&gt;
&lt;br /&gt;
Располагая этой информацией, вы можете повысить рентабельность инвестиций, увеличить количество конверсий и, в конечном счете, больше зарабатывать.&lt;br /&gt;
&lt;br /&gt;
GA является универсальным инструментом, без которого сейчас трудно представить работу SEO-специалиста, SMM-сциалиста, интернет-маркетолога и юзабилиста.&lt;br /&gt;
&lt;br /&gt;
Когда приходит время решать узкие задачи вашего бизнеса, которые связаны с продажами online, &lt;br /&gt;
Google Analytics помогает построить из имеющегося функционала действующий механизм, который способен указать на многие мелочи. &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;
&lt;br /&gt;
'''Ниже приведены возможности данных ресурсов, а также ключевые отличия Яндекс.Метрики от Google Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics дает возможности:&lt;br /&gt;
&lt;br /&gt;
• отслеживание	KPI	(основных показателей эффективности рекламных кампаний);&lt;br /&gt;
&lt;br /&gt;
• оценка	уровня	интерактивности	и юзабельности	сайта;&lt;br /&gt;
&lt;br /&gt;
• получение финансовой статистики, которая генерируется сайтом (получение данных о продажах с сайта с транзакционными составляющими (товар - цена));&lt;br /&gt;
&lt;br /&gt;
• оценка эффективности продвижения сайта (SEO, PPC, SMM);&lt;br /&gt;
&lt;br /&gt;
• удобный дашборд со сводными данными по сравнению с прошедшей неделей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пользуясь Яндекс.Метрикой, в дополнение ко всему вышеперечисленному &lt;br /&gt;
вы можете получить несколько дополнительных функций, не используемых в Google Analytics, а именно:'''&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;
[[2. Основные показатели эффективности KPI Веб-аналитики]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=559</id>
		<title>1. Цели и задачи Веб-аналитики</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=559"/>
		<updated>2018-02-06T14:21:15Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Веб-аналитика'''&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
Веб-аналитика (англ. Webanalytics) – это измерение, сбор, анализ, представление и интерпретация информации о посетителях веб-сайтов с целью их улучшения и оптимизации.&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;
От кол-ва трафика на Ваш сайт до оценки возврата инвестиций (ROI) каждого вложенного Вами доллара.&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;
&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;
в) Показатели эффективности (KPI);&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 Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics показывает, каким образом пользователи перешли на ваш сайт, как они с ним взаимодействовали и как его можно улучшить. &lt;br /&gt;
&lt;br /&gt;
Располагая этой информацией, вы можете повысить рентабельность инвестиций, увеличить количество конверсий и, в конечном счете, больше зарабатывать.&lt;br /&gt;
&lt;br /&gt;
GA является универсальным инструментом, без которого сейчас трудно представить работу SEO-специалиста, SMM-сциалиста, интернет-маркетолога и юзабилиста.&lt;br /&gt;
&lt;br /&gt;
Когда приходит время решать узкие задачи вашего бизнеса, которые связаны с продажами online, &lt;br /&gt;
Google Analytics помогает построить из имеющегося функционала действующий механизм, который способен указать на многие мелочи. &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;
&lt;br /&gt;
'''Ниже приведены возможности данных ресурсов, а также ключевые отличия Яндекс.Метрики от Google Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics дает возможности:&lt;br /&gt;
&lt;br /&gt;
• отслеживание	KPI	(основных показателей эффективности рекламных кампаний);&lt;br /&gt;
&lt;br /&gt;
• оценка	уровня	интерактивности	и юзабельности	сайта;&lt;br /&gt;
&lt;br /&gt;
• получение финансовой статистики, которая генерируется сайтом (получение данных о продажах с сайта с транзакционными составляющими (товар - цена));&lt;br /&gt;
&lt;br /&gt;
• оценка эффективности продвижения сайта (SEO, PPC, SMM);&lt;br /&gt;
&lt;br /&gt;
• удобный дашборд со сводными данными по сравнению с прошедшей неделей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пользуясь Яндекс.Метрикой, в дополнение ко всему вышеперечисленному &lt;br /&gt;
вы можете получить несколько дополнительных функций, не используемых в Google Analytics, а именно:'''&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;
[[2. Основные показатели эффективности KPI Веб-аналитики]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=558</id>
		<title>1. Цели и задачи Веб-аналитики</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=558"/>
		<updated>2018-02-06T14:19:42Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Веб-аналитика'''&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
Веб-аналитика (англ. Webanalytics) – это измерение, сбор, анализ, представление и интерпретация информации о посетителях веб-сайтов с целью их улучшения и оптимизации.&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;
От кол-ва трафика на Ваш сайт до оценки возврата инвестиций (ROI) каждого вложенного Вами доллара.&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;
'''Ключевые этапы веб-аналитики:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
а) Определение офлайн целей (сумма и количество того, что нужно продавать и в какой период); &lt;br /&gt;
&lt;br /&gt;
б)  Отображение целей в онлайн;&lt;br /&gt;
&lt;br /&gt;
в) Показатели эффективности (KPI);&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 Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics показывает, каким образом пользователи перешли на ваш сайт, как они с ним взаимодействовали и как его можно улучшить. &lt;br /&gt;
&lt;br /&gt;
Располагая этой информацией, вы можете повысить рентабельность инвестиций, увеличить количество конверсий и, в конечном счете, больше зарабатывать.&lt;br /&gt;
&lt;br /&gt;
GA является универсальным инструментом, без которого сейчас трудно представить работу SEO-специалиста, SMM-сциалиста, интернет-маркетолога и юзабилиста.&lt;br /&gt;
&lt;br /&gt;
Когда приходит время решать узкие задачи вашего бизнеса, которые связаны с продажами online, &lt;br /&gt;
Google Analytics помогает построить из имеющегося функционала действующий механизм, который способен указать на многие мелочи. &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;
&lt;br /&gt;
'''Ниже приведены возможности данных ресурсов, а также ключевые отличия Яндекс.Метрики от Google Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics дает возможности:&lt;br /&gt;
&lt;br /&gt;
• отслеживание	KPI	(основных показателей эффективности рекламных кампаний);&lt;br /&gt;
&lt;br /&gt;
• оценка	уровня	интерактивности	и юзабельности	сайта;&lt;br /&gt;
&lt;br /&gt;
• получение финансовой статистики, которая генерируется сайтом (получение данных о продажах с сайта с транзакционными составляющими (товар - цена));&lt;br /&gt;
&lt;br /&gt;
• оценка эффективности продвижения сайта (SEO, PPC, SMM);&lt;br /&gt;
&lt;br /&gt;
• удобный дашборд со сводными данными по сравнению с прошедшей неделей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пользуясь Яндекс.Метрикой, в дополнение ко всему вышеперечисленному &lt;br /&gt;
вы можете получить несколько дополнительных функций, не используемых в Google Analytics, а именно:'''&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;
[[2. Основные показатели эффективности KPI Веб-аналитики]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=525</id>
		<title>1. Цели и задачи Веб-аналитики</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=525"/>
		<updated>2018-02-06T11:04:43Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Веб-аналитика'''&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
Веб-аналитика (англ. Webanalytics) – это измерение, сбор, анализ, представление и интерпретация информации о посетителях веб-сайтов с целью их улучшения и оптимизации.&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;
От кол-ва трафика на Ваш сайт до оценки возврата инвестиций (ROI) каждого вложенного Вами доллара.&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;
'''Ключевые этапы веб-аналитики:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
а) Определение офлайн целей (сумма и количество того, что нужно продавать и в какой период); &lt;br /&gt;
&lt;br /&gt;
б)  Отображение целей в онлайн;&lt;br /&gt;
&lt;br /&gt;
в) Показатели эффективности (KPI);&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 Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics показывает, каким образом пользователи нашли ваш сайт, как они с ним взаимодействовали и как его можно улучшить. &lt;br /&gt;
&lt;br /&gt;
Располагая этой информацией, вы можете повысить рентабельность инвестиций, увеличить количество конверсий и, в конечном счете, больше зарабатывать.&lt;br /&gt;
&lt;br /&gt;
GA является универсальным инструментом, без которого сейчас трудно представить работу SEO-специалиста, SMM-сциалиста, интернет-маркетолога и юзабилиста.&lt;br /&gt;
&lt;br /&gt;
Когда приходит время решать узкие задачи вашего бизнеса, которые связаны с продажами online, &lt;br /&gt;
Google Analytics помогает построить из имеющегося функционала действующий механизм, который способен указать на многие мелочи. &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;
&lt;br /&gt;
'''Ниже приведены возможности данных ресурсов, а также ключевые отличия Яндекс.Метрики от Google Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics дает возможности:&lt;br /&gt;
&lt;br /&gt;
•отслеживание	KPI	(основных показателей эффективности рекламных кампаний);&lt;br /&gt;
&lt;br /&gt;
•оценка	уровня	интерактивности	и юзабельности	сайта;&lt;br /&gt;
&lt;br /&gt;
• получение финансовой статистики, которая генерируется сайтом;&lt;br /&gt;
&lt;br /&gt;
•оценка эффективности продвижения сайта (SEO, PPC, SMM).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пользуясь Яндекс.Метрикой, в дополнение ко всему вышеперечисленному &lt;br /&gt;
вы можете получить несколько дополнительных функций, не используемых в Google Analytics, а именно:'''&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;
[[2. Основные показатели эффективности KPI Веб-аналитики]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=524</id>
		<title>1. Цели и задачи Веб-аналитики</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=1._%D0%A6%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%92%D0%B5%D0%B1-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=524"/>
		<updated>2018-02-06T11:03:56Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Веб-аналитика'''&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
Веб-аналитика (англ. Webanalytics) – это измерение, сбор, анализ, представление и интерпретация информации о посетителях веб-сайтов с целью их улучшения и оптимизации.&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;
От кол-ва трафика на Ваш сайт до оценки возврата инвестиций (ROI) каждого вложенного Вами доллара.&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;
'''Ключевые этапы веб-аналитики:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
а) Определение офлайн целей (сумма и количество того, что нужно продавать и в какой период); &lt;br /&gt;
&lt;br /&gt;
б)  Отображение целей в онлайн;&lt;br /&gt;
&lt;br /&gt;
в) Показатели эффективности (KPI);&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 Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics показывает, каким образом пользователи нашли ваш сайт, как они с ним взаимодействовали и как его можно улучшить. &lt;br /&gt;
&lt;br /&gt;
Располагая этой информацией, вы можете повысить рентабельность инвестиций, увеличить количество конверсий и, в конечном счете, больше зарабатывать.&lt;br /&gt;
&lt;br /&gt;
GA является универсальным инструментом, без которого сейчас трудно представить работу SEO-специалиста, SMM-сциалиста, интернет-маркетолога и юзабилиста.&lt;br /&gt;
&lt;br /&gt;
Когда приходит время решать узкие задачи вашего бизнеса, которые связаны с продажами online, &lt;br /&gt;
Google Analytics помогает построить из имеющегося функционала действующий механизм, который способен указать на многие мелочи. &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;
&lt;br /&gt;
'''Ниже приведены возможности данных ресурсов, а также ключевые отличия Яндекс.Метрики от Google Analytics.'''&lt;br /&gt;
&lt;br /&gt;
Google Analytics дает возможности:&lt;br /&gt;
&lt;br /&gt;
•отслеживание	KPI	(основных показателей эффективности рекламных кампаний);&lt;br /&gt;
&lt;br /&gt;
•оценка	уровня	интерактивности	и юзабельности	сайта;&lt;br /&gt;
&lt;br /&gt;
• получение финансовой статистики, которая генерируется сайтом;&lt;br /&gt;
&lt;br /&gt;
•оценка эффективности продвижения сайта (SEO, PPC, SMM).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пользуясь Яндекс.Метрикой, в дополнение ко всему вышеперечисленному &lt;br /&gt;
вы можете получить несколько дополнительных функций, не используемых в Google Analytics, а именно:'''&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;
[[2. Основные показатели эффективности KPI Веб-аналитики]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=297</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=297"/>
		<updated>2018-01-18T09:28:19Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: /* PBN схема по закупке ссылок */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) Конвертим наши статьи в формат utf-8 https://subtitletools.com/convert-text-files-to-utf8-online&amp;lt;br&amp;gt;&lt;br /&gt;
б) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
в) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
г) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech, quickseo1, zimaseo, seorankbuilder, wickedsubmit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=295</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=295"/>
		<updated>2018-01-11T13:53:38Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) Конвертим наши статьи в формат utf-8 https://subtitletools.com/convert-text-files-to-utf8-online&amp;lt;br&amp;gt;&lt;br /&gt;
б) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
в) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
г) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech, quickseo1, zimaseo, seorankbuilder&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=292</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=292"/>
		<updated>2017-12-26T16:07:25Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: /* PBN схема по закупке ссылок */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) Конвертим наши статьи в формат utf-8 https://subtitletools.com/convert-text-files-to-utf8-online&amp;lt;br&amp;gt;&lt;br /&gt;
б) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
в) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
г) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech, quickseo1, zimaseo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=291</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=291"/>
		<updated>2017-12-21T14:20:56Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) Конвертим наши статьи в формат utf-8 https://subtitletools.com/convert-text-files-to-utf8-online&amp;lt;br&amp;gt;&lt;br /&gt;
б) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
в) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
г) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech, quickseo1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</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_Google_Analytics&amp;diff=289</id>
		<title>Настройка Google Analytics</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_Google_Analytics&amp;diff=289"/>
		<updated>2017-12-19T13:52:06Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;1.Создание представлений&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Master view - для ежедневной работы, применены все фильтры, настроены цели, эл. коммерция и так далее.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Test view - для тестов и AB тестирования всякого.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Raw data - представление вообще без фильтров и настроек конфигурации - с сырыми и необработанными данными, в качестве бэкапа.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2.В Master view включаем «Отслеживание поиска по сайту». В поле «Параметр запроса» вносим параметр поиска.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3.Включаем «Фильтрация роботов»&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4.В Master view отсекаем весь зарубежный трафик, это нас сразу спасет от накруток ботов, всякого аналитикс спама, китайских ботов и покажет реальную картину.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;5.В Master view вносим в фильтр офисный ip.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;6.Настраиваем оповещения (если они не включены)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Organic traffic visits decreased by more than -&amp;gt; 20% -&amp;gt; previous week&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Adwords traffic visits decreased by more than -&amp;gt; 20% -&amp;gt; previous week&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;No traffic: All Traffic sessions &amp;lt; 1 – Daily&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Не было ни одной конверсии&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Количество конверсий уменьшилось на 20% по сравнению с предыдущей неделей&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;показатель отказов меньше 5% (некорректно отрабатывает)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;не было транзакций (не работает эл. торговля) за неделю – при условии, что ЭТ настроена&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;7.В Master view в аннотации вносим важные для продвижения действия. Например, переезд на https, окончание внутренней оптимизации итд.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;8.В Master view настраиваем цели&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;9.В Master view устанавливаем seo дашборд https://analytics.google.com/analytics/gallery/#posts/search/%3F_.viewId%3DJLbPyFF7TliTeenfawqBPg/&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;10.Включаем сбор данных по демографии.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;11.Соединяем с search console.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;12. Добавляется настройка аудиторий&amp;lt;/p&amp;gt;&lt;br /&gt;
Обязательно и минимум&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Все посетители&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Все посетители за 30 дней&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Все посетители за 180 дней &amp;lt;br /&amp;gt;&lt;br /&gt;
4. Все кто совершил целевую конверсию (лид)&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Все кто не совершил целевую конверсию (лид)&amp;lt;br /&amp;gt;&lt;br /&gt;
6. ТОП 5% пользователей по времени на сайте&amp;lt;br /&amp;gt;&lt;br /&gt;
7. ТОП 15% по количеству просмотренных страниц&amp;lt;br /&amp;gt;&lt;br /&gt;
8. Все кто посетил 2 страницы&amp;lt;br /&amp;gt;&lt;br /&gt;
9. Все кто посетил 3 страницы &amp;lt;br /&amp;gt;&lt;br /&gt;
10. Все кто посетил 4 страницы &amp;lt;br /&amp;gt;&lt;br /&gt;
11. Определить информационные лендинги и создать аудиторию тех кто посетил именно их (пример на раскрутке страница SEO и страница PPC )&amp;lt;br /&amp;gt;&lt;br /&gt;
Тут речь идет о наиболее важных (трафиковых) страницах. Их важность определяет либо клиент, либо мы на основании самых трафиковых страниц сайта.&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A7%D0%B5%D0%BA-%D0%BB%D0%B8%D1%81%D1%82_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%BC_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B5&amp;diff=285</id>
		<title>Чек-лист по работам на старте</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A7%D0%B5%D0%BA-%D0%BB%D0%B8%D1%81%D1%82_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%BC_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B5&amp;diff=285"/>
		<updated>2017-12-15T14:34:04Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: «'''Стартовые шаги''' *сбор семантики по выделенным категориям *группировка семантики по ка…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
   - Все посетители за 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;
*настройка связи адвордс и аналитики&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;
*добавление новых каналов (медийка/ремаркетиг/gmail/youtube)&lt;br /&gt;
*корректировка ставок в зависимости от результатов &lt;br /&gt;
*аналитика&lt;/div&gt;</summary>
		<author><name>77.122.65.227</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=284</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=284"/>
		<updated>2017-12-15T14:26:05Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: /* Чек-листы */&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;
[[Создание аккаунта AdWords]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка поисковой кампании]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка ремаркетинга]]&lt;br /&gt;
&lt;br /&gt;
[[Связывание AdWords и Analytics  и импорт целей]]&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;/div&gt;</summary>
		<author><name>77.122.65.227</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_Google_Analytics&amp;diff=283</id>
		<title>Настройка Google Analytics</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_Google_Analytics&amp;diff=283"/>
		<updated>2017-12-15T10:58:42Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;1.Создание представлений&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Master view - для ежедневной работы, применены все фильтры, настроены цели, эл. коммерция и так далее.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Test view - для тестов и AB тестирования всякого.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Raw data - представление вообще без фильтров и настроек конфигурации - с сырыми и необработанными данными, в качестве бэкапа.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2.В Master view включаем «Отслеживание поиска по сайту». В поле «Параметр запроса» вносим параметр поиска.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;3.Включаем «Фильтрация роботов»&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;4.В Master view отсекаем весь зарубежный трафик, это нас сразу спасет от накруток ботов, всякого аналитикс спама, китайских ботов и покажет реальную картину.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;5.В Master view вносим в фильтр офисный ip.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;6.Настраиваем оповещения (если они не включены)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Organic traffic visits decreased by more than -&amp;gt; 20% -&amp;gt; previous week&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Adwords traffic visits decreased by more than -&amp;gt; 20% -&amp;gt; previous week&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;No traffic: All Traffic sessions &amp;lt; 1 – Daily&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Не было ни одной конверсии&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Количество конверсий уменьшилось на 20% по сравнению с предыдущей неделей&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;показатель отказов меньше 5% (некорректно отрабатывает)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;не было транзакций (не работает эл. торговля) за неделю – при условии, что ЭТ настроена&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;7.В Master view в аннотации вносим важные для продвижения действия. Например, переезд на https, окончание внутренней оптимизации итд.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;8.В Master view настраиваем цели&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;9.В Master view устанавливаем seo дашборд https://analytics.google.com/analytics/gallery/#posts/search/%3F_.viewId%3DJLbPyFF7TliTeenfawqBPg/&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;10.Включаем сбор данных по демографии.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;11.Соединяем с search console.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;12. Добавляется настройка аудиторий&amp;lt;/p&amp;gt;&lt;br /&gt;
Обязательно и минимум&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Все посетители&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Все посетители за 30 дней&amp;lt;br /&amp;gt;&lt;br /&gt;
3. Все посетители за 180 дней &amp;lt;br /&amp;gt;&lt;br /&gt;
4. Все кто совершил целевую конверсию (лид)&amp;lt;br /&amp;gt;&lt;br /&gt;
5. Все кто не совершил целевую конверсию (лид)&amp;lt;br /&amp;gt;&lt;br /&gt;
6. ТОП 5% пользователей по времени на сайте&amp;lt;br /&amp;gt;&lt;br /&gt;
7. ТОП 15% по количеству просмотренных страниц&amp;lt;br /&amp;gt;&lt;br /&gt;
8. Все кто посетил 2 страницы&amp;lt;br /&amp;gt;&lt;br /&gt;
9. Все кто посетил 3 страницы &amp;lt;br /&amp;gt;&lt;br /&gt;
10. Все кто посетил 4 страницы &amp;lt;br /&amp;gt;&lt;br /&gt;
11. Определить информационные лендинги и создать аудиторию тех кто посетил именно их (пример на раскрутке страница SEO и страница PPC )&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=282</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=282"/>
		<updated>2017-12-11T14:51:06Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) Конвертим наши статьи в формат utf-8 https://subtitletools.com/convert-text-files-to-utf8-online&amp;lt;br&amp;gt;&lt;br /&gt;
б) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
в) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
г) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=281</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=281"/>
		<updated>2017-12-11T14:50:50Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) Конвертим наши статьи в формат utf-8 https://subtitletools.com/convert-text-files-to-utf8-online&lt;br /&gt;
б) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
в) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
г) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=263</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=263"/>
		<updated>2017-12-05T13:03:17Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
б) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
в) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Для отмены заказа и возврата денег необходимо совершить подобные действия https://monosnap.com/file/uJaMWoMrJCXUnjO1S3m2ztiOUuPttq&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=1._%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=262</id>
		<title>1. Назначение подразделения</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=1._%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=262"/>
		<updated>2017-12-04T15:06:36Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: «Генерация прибыли компании путем привлечения:   1. Повторных заказов постоянных покупате…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Генерация прибыли компании путем привлечения: &lt;br /&gt;
&lt;br /&gt;
1. Повторных заказов постоянных покупателей.&lt;br /&gt;
&lt;br /&gt;
2. Ежемесячных платежей за текущее обслуживание.&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8&amp;diff=261</id>
		<title>Управление проектами</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8&amp;diff=261"/>
		<updated>2017-12-04T15:05:54Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: /* Структура отдела: */&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;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=260</id>
		<title>Назначение подразделения</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=260"/>
		<updated>2017-12-04T15:05:34Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: «Миссия отдела продаж заключается в генерации прибыли компании путем продажи услуг по ра…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Миссия отдела продаж заключается в генерации прибыли компании путем продажи услуг по развитию бизнеса новым клиентам (заключение новых контрактов)&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9E%D1%82%D0%B4%D0%B5%D0%BB_%D0%BF%D1%80%D0%BE%D0%B4%D0%B0%D0%B6&amp;diff=259</id>
		<title>Отдел продаж</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9E%D1%82%D0%B4%D0%B5%D0%BB_%D0%BF%D1%80%D0%BE%D0%B4%D0%B0%D0%B6&amp;diff=259"/>
		<updated>2017-12-04T15:03:20Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: /* Структура отдела: */&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;
&lt;br /&gt;
[[Составление коммерческого предложения SEO]]&lt;br /&gt;
&lt;br /&gt;
[[Составление коммерческого предложения PPC]]&lt;br /&gt;
&lt;br /&gt;
[[Выставление счетов]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет по проекту]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=258</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=258"/>
		<updated>2017-12-04T14:47:02Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
б) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
в) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Список blacklist юзеров, которые не принимают русс. статьи: sparkstech&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=257</id>
		<title>Алгоритм закупки PBN</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B7%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8_PBN&amp;diff=257"/>
		<updated>2017-12-04T14:00:04Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: « == PBN схема по закупке ссылок ==   1. У нас должны быть готовы 500 размноженных статей, они дол…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== PBN схема по закупке ссылок ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. У нас должны быть готовы 500 размноженных статей, они должны включать по одной ссылке в каждую статью,  по ТЗ договаривайтесь с исполнителем, в наших интересах засунуть в одно размножение 5-10 целевых посадочных страниц с 5-10 анкоров на каждую страницу. Не больше. Чтобы у нас было максимум до 100 уникальных вариантов страница/анкор (перемножение количества анкоров на целевую страницу). В текстах в самом начале должен быть тег h1, в который будет входить используемый в последствии анкор на странице - можно с разбавкой. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Идем сюда: https://www.seoclerk.com/categories/private-blog-networks&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Выбираем предложения от $5 до $10, где народ предлагает PBN links.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не уверены - спрашивайте у Паши - подходит ли конкретный оффер.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Вот например подходящее предложение, идем в него: https://monosnap.com/file/lTOR2caaU86ASEj4UpfqcsZ1MraLnr&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Жмем Order now: https://monosnap.com/file/5A4MZXQSHkzK0k7ZOVG20fhSAvxxE9&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Оплачиваем с баланса https://monosnap.com/file/jYnfbVcSzrX26ySAWxQAc05rSNKUtA&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Если баланс заканчивается - пингуйте Пашу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Отсылаем васе ровно столько статей, сколько было написано в оффере - в данном случае 5.&amp;lt;br&amp;gt;&lt;br /&gt;
а) добавляем в zip архив выбранные статьи&amp;lt;br&amp;gt;&lt;br /&gt;
б) переносим 5 выбранных статей в папку used&amp;lt;br&amp;gt;&lt;br /&gt;
в) прикрепляем архив в задание, пишем в комментарии: https://monosnap.com/file/HAl5RjJsbfZn3XYxvK7LvakCPlVZs0&amp;lt;br&amp;gt;&lt;br /&gt;
Articles attached.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please use in the tag title on the page content of h1 tag in the beginning of the article. Here what I mean: https://monosnap.com/file/kZUXX45c2BbBcTLHpEpLyNdySfAcMd&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) Жмем Send&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Раз в день проверяем отработанные заказы https://www.seoclerk.com/orders/review/id/desc , и принимаем их после проверки ссылок (можно 1 рандомно из заказа проверять), https://monosnap.com/file/e94GV7NMKwl0lbQskzTMLShQQyy4qX&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Раз в день проверяем Inbox и читаем что там пишут https://monosnap.com/file/zFup8xlCl8LMKjFTfoeOIkT4YS6j9Y&amp;lt;br&amp;gt;&lt;br /&gt;
В зависимости от того, что там - соотв. принимаем те или иные действия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11. Иногда исполители отменяют заказ, например, по причине того что они не принимают статьи на русском языке, в таком случае там будет опция Согласится с отменой - деньги будут возвращены на баланс, и нужно будет статьи, которые были в этом заказе - перенести в Unused.&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=SEO_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=256</id>
		<title>SEO отдел</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=SEO_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=256"/>
		<updated>2017-12-04T13:58:17Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
== Обязанности, зоны ответсвенности, KPI: ==&lt;br /&gt;
&lt;br /&gt;
[[Head of SEO]]&lt;br /&gt;
&lt;br /&gt;
[[SEO Specialist]]&lt;br /&gt;
&lt;br /&gt;
[[Junior SEO Specialist]]&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;
&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 local business]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка Google Analytics]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритм закупки PBN]]&lt;br /&gt;
&lt;br /&gt;
== Типовые заявления==&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1XqPGczlAXmhmDMrPsRP4396JM9kLWItY/view?usp=sharing Заявление на увольнение]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=SEO_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=255</id>
		<title>SEO отдел</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=SEO_%D0%BE%D1%82%D0%B4%D0%B5%D0%BB&amp;diff=255"/>
		<updated>2017-12-04T13:57:58Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
== Обязанности, зоны ответсвенности, KPI: ==&lt;br /&gt;
&lt;br /&gt;
[[Head of SEO]]&lt;br /&gt;
&lt;br /&gt;
[[SEO Specialist]]&lt;br /&gt;
&lt;br /&gt;
[[Junior SEO Specialist]]&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;
&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 local business]]&lt;br /&gt;
&lt;br /&gt;
[[Настройка Google Analytics]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритм закупки PBM]]&lt;br /&gt;
&lt;br /&gt;
== Типовые заявления==&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1XqPGczlAXmhmDMrPsRP4396JM9kLWItY/view?usp=sharing Заявление на увольнение]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE-%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD_%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=254</id>
		<title>Информационно-деловой обмен подразделения</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE-%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD_%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=254"/>
		<updated>2017-12-04T08:41:26Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При старте работы сотруднику передается аккаунт привязанный к Microsoft OneDrive.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Все рабочие файлы (договора, коммерческие предложения) должны храниться в SkyDrive в соответствующем привязанном аккаунте.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: red&amp;quot;&amp;gt;&lt;br /&gt;
Регистрация собственных файлообменников (DropBox, GDrive и проч.) для хранения рабочей документации запрещена.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если потенциальный клиент требует общения через какие либо виды мессенджеров, Whatsapp, Viber, Telegramm, &lt;br /&gt;
вся переписка ведется с аккаунтов зарегистрированных на рабочие телефоны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: red&amp;quot;&amp;gt; Использование личного телефона, личной почты, личных аккаунтов мессенджера -  для связи с клиентами не допускается.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заявки поступающие с сайта регистрируются в PipeDrive и обрабатываются по воронке.&lt;br /&gt;
&lt;br /&gt;
После заключения сделки, письменно через постановку задачи в Asana, менеджер по продажам обязан передать полностью все договоренности, &lt;br /&gt;
&lt;br /&gt;
стратегии и контакты ответственному менеджеру проектов по следующему чеклисту.&lt;br /&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. Стартовые договоренности. &lt;br /&gt;
&lt;br /&gt;
7. Утвержденное коммерческое предложение.&lt;br /&gt;
&lt;br /&gt;
8. Доступа или способы их получения.&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%8B%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%87%D0%B5%D1%82%D0%BE%D0%B2&amp;diff=253</id>
		<title>Выставление счетов</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%8B%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%87%D0%B5%D1%82%D0%BE%D0%B2&amp;diff=253"/>
		<updated>2017-12-04T08:34:26Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: «При заключении договора с юридическим лицом договор и счет должен быть составлен и выст…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При заключении договора с юридическим лицом договор и счет должен быть составлен и выставлен от ФЛП Чернец&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При заключении договора с физическим лицом договор и счет должен быть составлен и выставлен от ФЛП Алексеев или ФЛП Алексеева&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%9E%D1%82%D0%B4%D0%B5%D0%BB_%D0%BF%D1%80%D0%BE%D0%B4%D0%B0%D0%B6&amp;diff=252</id>
		<title>Отдел продаж</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%9E%D1%82%D0%B4%D0%B5%D0%BB_%D0%BF%D1%80%D0%BE%D0%B4%D0%B0%D0%B6&amp;diff=252"/>
		<updated>2017-12-04T08:29:48Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: /* Процессы: */&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;
&lt;br /&gt;
[[Составление коммерческого предложения SEO]]&lt;br /&gt;
&lt;br /&gt;
[[Составление коммерческого предложения PPC]]&lt;br /&gt;
&lt;br /&gt;
[[Выставление счетов]]&lt;br /&gt;
&lt;br /&gt;
[[Отчет по проекту]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%97%D0%B0%D1%8F%D0%B2%D0%BA%D0%B0_%D1%81_%D1%81%D0%B0%D0%B9%D1%82%D0%B0_/_%D0%9F%D0%B8%D1%81%D1%8C%D0%BC%D0%BE_%D1%81_%D1%81%D0%B0%D0%B9%D1%82%D0%B0&amp;diff=251</id>
		<title>Заявка с сайта / Письмо с сайта</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%97%D0%B0%D1%8F%D0%B2%D0%BA%D0%B0_%D1%81_%D1%81%D0%B0%D0%B9%D1%82%D0%B0_/_%D0%9F%D0%B8%D1%81%D1%8C%D0%BC%D0%BE_%D1%81_%D1%81%D0%B0%D0%B9%D1%82%D0%B0&amp;diff=251"/>
		<updated>2017-12-04T08:29:19Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: «В рабочее время входящая заявка должна быть обработана немедленно.   В случае невозможно…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
1. Наименование сайта, чем занимается компания? Какие товары/услуги предоставляет?&lt;br /&gt;
2. Какие текущие цифры, заявок, лидов, оборота, продаж могут предоставить?&lt;br /&gt;
3. Цели продвижения, какие показатели сотрудничества будут считаться успешными?&lt;br /&gt;
4. Портрет клиента, приоритетные направления услуг и товаров?&lt;br /&gt;
5. Основные конкуренты?&lt;br /&gt;
6. Предпочитаемые каналы рекламы?&lt;br /&gt;
&lt;br /&gt;
После проведенных первичных переговоров номер телефона и все сопутствующие данные сразу вносятся в лиды PipeDrive для дальнейшей обработки&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B9_%D0%B7%D0%B2%D0%BE%D0%BD%D0%BE%D0%BA&amp;diff=250</id>
		<title>Входящий звонок</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B9_%D0%B7%D0%B2%D0%BE%D0%BD%D0%BE%D0%BA&amp;diff=250"/>
		<updated>2017-12-04T08:27:12Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
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. Предпочитаемые каналы рекламы?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После проведенных первичных переговоров номер телефона и все сопутствующие данные сразу вносятся в лиды PipeDrive для дальнейшей обработки&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B9_%D0%B7%D0%B2%D0%BE%D0%BD%D0%BE%D0%BA&amp;diff=249</id>
		<title>Входящий звонок</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B9_%D0%B7%D0%B2%D0%BE%D0%BD%D0%BE%D0%BA&amp;diff=249"/>
		<updated>2017-12-04T08:11:35Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
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. Предпочитаемые каналы рекламы?&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B9_%D0%B7%D0%B2%D0%BE%D0%BD%D0%BE%D0%BA&amp;diff=248</id>
		<title>Входящий звонок</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=%D0%92%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B9_%D0%B7%D0%B2%D0%BE%D0%BD%D0%BE%D0%BA&amp;diff=248"/>
		<updated>2017-12-04T08:11:24Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: «В рабочее время входящий звонок должен быть обработан немедленно. В случае невозможност…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
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. Предпочитаемые каналы рекламы?&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.raskrutka.com.ua/index.php?title=10._%D0%9F%D0%BB%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%97%D0%B0%D1%8F%D0%B2%D0%BA%D0%B8&amp;diff=247</id>
		<title>10. Планирование выполнения Заявки</title>
		<link rel="alternate" type="text/html" href="http://wiki.raskrutka.com.ua/index.php?title=10._%D0%9F%D0%BB%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%97%D0%B0%D1%8F%D0%B2%D0%BA%D0%B8&amp;diff=247"/>
		<updated>2017-12-04T08:03:03Z</updated>

		<summary type="html">&lt;p&gt;77.122.65.227: Новая страница: «Входящий звонок   Заявка с сайта / Письмо с сайта»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Входящий звонок]] &lt;br /&gt;
&lt;br /&gt;
[[Заявка с сайта / Письмо с сайта]]&lt;/div&gt;</summary>
		<author><name>77.122.65.227</name></author>
		
	</entry>
</feed>