Блог про интернет-маркетинг для бизнеса

PPC

Динамический ремаркетинг в AdWords без Google Merchant Center — скрипт для автоматического обновления фида

183
2
32

Хотите, чтобы динамический ремаркетинг работал эффективно? Ваши объявления должны содержать актуальную информацию о товарах. Если на сайте регулярно меняются цены или расширяется ассортимент, каждый раз нужно подгружать измененный каталог товаров в аккаунт Google. В этой статье я расскажу, как настроить автоматическое обновление фида с помощью таблиц Google.

При загрузке фида с помощью Google Merchant Center товарный фид обновляется автоматически, согласно установленному расписанию. К сожалению, в Украине, Беларуси и Казахстане пока недоступен Merchant Center, поэтому нужно постоянно следить за изменениями и загружать фид вручную.

Мой способ избавит вас от необходимости регулярно загружать фид в Google AdWords. Вам понадобится:

  1. Подготовить фид в формате XML или YML.
  2. Создать таблицу Google и настроить скрипт, который будет загружать в нее данные из фида.
  3. Загрузить полученную таблицу в свой аккаунт Google AdWords и настроить обновление.

Скрипт для парсинга данных в таблицу Google разработали Analytics Strategist Алексей Данилин и Software Engineer at Serpstat Антон Белоус.

1. Импортируйте данные из фида в таблицу Google

1.1. Создайте файл в таблицах Google.

1.2. Выберите в верхнем меню пункт «Инструменты» — «Редактор скриптов».

Импортируйте данные с фида в таблицу Google

В окне редактирования скриптов сразу откроется новый проект, в котором вы будете работать. Дайте понятное название вашему проекту, например такое, как прописали ранее для созданной таблицы Google.

Откроется новый проект

1.3. Далее перейдем непосредственно к работе со скриптом. Сначала полностью удалите имеющиеся на странице строки кода.

Удалите имеющиеся на странице строки кода

Затем скопируйте и вставьте в свой проект этот скрипт:

var doc = SpreadsheetApp.getActiveSpreadsheet();
try {
var s_settings = doc.getSheetByName("Settings");
s_settings.clear();
}
catch(e) {
var s_settings = doc.insertSheet();
s_settings.setName("Settings");
}

function parseXml() {
var url = 'http://адрес_нашего_xml_файла';
var xml = UrlFetchApp.fetch(url).getContentText();
var document = XmlService.parse(xml);
var root = document.getRootElement();

var ns = XmlService.getNamespace('http://www.w3.org/1999/xhtml');
Logger.log(ns);
var entries = document.getRootElement().getChildren();
Logger.log(entries);
var orders = entries[0].getChildren('offers')[0].getChildren('offer');
Logger.log(orders);

var rows = [];
rows.push(['ID','Final URL','Item category','Item title','Image URL','Price'])
for (var i = 0; i < orders.length; i++) {
 var id = orders[i].getAttribute('id').toString().split("'")[1];
 var url = orders[i].getChildText('url').toString().trim();
 var cat = orders[i].getChildText('vendor');
 var name = orders[i].getChildText('model');
 var pic = orders[i].getChildText('picture').toString().trim();
 var currencyId = orders[i].getChildText('currencyId').toString().trim();
 var price = orders[i].getChildText('price').toString()+' '+currencyId;
 var newRow = [
    id, url, cat, name, pic, price
   ];
 rows.push(newRow);
}
Logger.log(rows[rows.length-1]);
s_settings.getRange(1,1,rows.length, 6).setValues(rows);
}

1.4. Чтобы скрипт корректно работал именно с вашим фидом, необходимо отредактировать несколько строк в коде.

В строке 12 вместо «http://адрес_нашего_xml_файла» укажите адрес вашего фида, из которого скрипт будет тянуть информацию о товарах.

Укажите адрес вашего xml или yml-файла

В некоторых случаях для работы скрипта достаточно вставить ссылку на ваш фид, но, возможно, придется скорректировать еще несколько пунктов.

1.5. Проанализируйте структуру вашего фида. Передаваемые параметры должны совпадать со значениями атрибутов, указанными в этом фрагменте скрипта:

rows.push(['ID','Final URL','Item category','Item title','Image URL','Price'])
for (var i = 0; i < orders.length; i++) {
 var id = orders[i].getAttribute('id').toString().split("'")[1];
 var url = orders[i].getChildText('url').toString().trim();
 var cat = orders[i].getChildText('vendor');
 var name = orders[i].getChildText('model');
 var pic = orders[i].getChildText('picture').toString().trim();
 var currencyId = orders[i].getChildText('currencyId').toString().trim();
 var price = orders[i].getChildText('price').toString()+' '+currencyId;

Рассмотрим подробнее, какие значения должны передаваться:

  • из атрибута getAttribute('id') в столбец ID импортируется информация об идентификационном номере товара;
  • из getChildText('url') в столбец Final URL передается значение ссылки на карточку товара;
  • из getChildText('vendor') в Item category подтягивается информация о названии категории;
  • из getChildText('model') в Item title передается название товара.
  • из getChildText('picture') в Image URL — ссылка на изображение продукта;
  • из атрибута getChildText('price') в столбец Price — цена товара.

Если в вашем фиде названия параметров отличаются от указанных выше значений атрибутов, необходимо отредактировать код скрипта. Допустим, информация о товаре в продуктовом каталоге выглядит так:  

<offer id="№ ID товара" type="vendor.model" available="true">
<url>http://ссылка на страницу товара</url>
<price>100</price>
<currencyId>UAH</currencyId>
<categoryId>1</categoryId>
<picture>http://ссылка на рисунок товара.jpg</picture>
<typePrefix>Смартфон</typePrefix>
<categoryname>Samsung</categoryname>
<name>Galaxy S4</name>
<param>White</param>
</offer>

Как видите, название и категория товара передаются с помощью параметров «name» и «categoryname», а не «vendor» и «model». Замените в коде значения атрибутов.

Название и категория товара передается с помощью параметров

1.6. После редактирования скрипта нажмите на кнопку «Сохранить», а затем — «Выполнить»

Сохраните скрипт

В правом верхнем углу появиться сообщение, что скрипт начал выполняться.

скрипт начал выполняться

Редактор скриптов запросит авторизацию — нажмите «Предоставить разрешение».

предоставить разрешение на выполнение скрипта

1.7. Чтобы убедится, что данные из фида извлекаются правильно, перейдите непосредственно к таблице. Должны появится столбцы, как на скриншоте.

Данные из фида извлекаются правильно

2. Настройте правила обновления данных

Чтобы информация в таблице регулярно обновлялась, необходимо в редакторе скриптов создать соответствующий триггер.

2.1. В верхнем меню выберите пункт «Ресурсы» — «Триггеры текущего проекта».

Настройте правила обновления данных

Чтобы перейти к настройке вашего первого триггера, в открывшемся окне нажмите на строку с синим текстом.

Триггеры текущего проекта

2.2. Сначала выберите, как часто должен обновляться фид.

 как часто должен обновляться фид

2.3. Рекомендую настроить оповещения, которые будут сообщать вам об ошибках обновления файла. Для этого нажмите на ссылку «Уведомления».

Нажмите на ссылку «Уведомления»

По умолчанию в настройках будет указана ваша почта и ежедневные оповещения. Выберите удобное время, а при необходимости измените или добавьте еще одного получателя. Нажмите кнопку «ОК» и сохраните изменения.

в настройках будет указана ваша почта и ежедневные оповещения

3. Добавьте фид в Google AdWords

3.1. Скачайте сгенерированную таблицу в формате CSV. Для этого нажмите в верхнем меню на «Файл» и в выпадающем списке выберите «Скачать как» — «CSV-файл (текущий лист)».

Скачайте сгенерированную таблицу

3.2. Приступим непосредственно к загрузке каталога товаров в AdWords. Перейдите в «Общую библиотеку» и кликните на подпункт «Коммерческие данные».

Перейдите в «Общую библиотеку»

3.3. Нажмите на кнопку «+Данные» и выберите «Фид динамических медийных объявлений» — «Выбранный пользователем».

Фид динамических медийных объявлений

3.4. Нажмите кнопку «Выбрать файл», выберите CSV-файл с фидом и загрузите его в аккаунт.

Выберите CSV-файл

После предварительной обработки файла нажмите «Применить изменения».

нажмите кнопку «Применить изменения»

3.5. Чтобы установить частоту обновления данных, в списке «Коммерческие данные» перейдите к добавленному фиду. На вкладке «Запланированные загрузки» нажмите на кнопку «+Расписание».

Запланировать загрузку

3.6. Установите периодичность обновления. В качестве источника укажите таблицу Google, для которой ранее настроили скрипт.

выбрать период обновления фида

Обратите внимание на примечание с информацией, на какой адрес необходимо открыть доступ к таблице Google для вашего аккаунта AdWords. 

Доступ к аккаунту

3.7. Проверьте, работает ли обновление файла. Для этого нажмите кнопку «Обновить» во вкладке «Запланированные загрузки».

«Обновить» во вкладке «Запланированные загрузки»

Выводы

Чтобы автоматизировать обновления фида в аккаунте Google AdWords, нужно следовать простому алгоритму:

  1. Создайте таблицу Google в редакторе скриптов и добавьте наш код.
  2. В скрипт добавьте ссылку на ваш фид и при необходимости замените значения атрибутов.
  3. Настройте триггеры, с помощью которых информация в таблице будет автоматически обновляться.
  4. Сохраните информацию в формате в CSV и загрузите в Google AdWords.
  5. Настройте период загрузки данных и проверьте, обновляется ли информация.

Показывайте вашим пользователям актуальную информацию о товарах.

Обнаружили ошибку? Выделите ее и нажмите Ctrl + Enter.

Комментарии (32)

  1. 0
    21 день назад

    Загружаю фид в эдвордс, но выдает ошибку "Ваш набор данных/фид содержит один или несколько недопустимых столбцов: Price;;." Подскажите, пожалуйста, где ошибка

    Фид

    • 0
      Sergei Shcheglov
      21 день назад

      Здравствуйте, Сергей!

      Фид открыть не удалось, скорее всего или валюта указана не верно, или символ между целыми и десятичными не точка.

  2. 0
    28 дней назад

    Сергей, подскажите как из доступных валют http://prntscr.com/hc1quk в этом же потоке достать требуемый курс (значение) и при каждом проходе умножить его на значение price http://prntscr.com/hc1rut ?

  3. 0
    5 месяцев назад

    Здравствуйте. Выдает ошибку в строке

     var document = XmlService.parse(xml);


    Error on line 480: XML document structures must start and end within the same entity. (line 14, file "Code")

    • 0
      Максим Адынцев
      5 месяцев назад

      Здравствуйте, Максим!


      Сложно сказать, не имея доступов к файлу и фиду. Скорее всего какая-то ошибка в структуре самого фида.

      Также встречали проблему с новым вариантом фида по ТЗ от Яндекса - там скрипт почему-то не видит закрывающийся тег. Открывающийся видит, а вот закрывающийся нет.

      В таком случае нужно делать фид по старому образцу и тогда все работает.

  4. 0
    7 месяцев назад

    Подскажите как сделать округление прайса до кратных 5 или 10?

    Цена высвтавлены в дол, а при конертации в руб получаем 62998.74 RUB 

    Хотелось бы округлять до 63000р

    Спасибо.

    • 0
      Igor
      7 месяцев назад

      Здравствуйте, Игорь!

      В зависимости от того, где происходит конвертация, если еще на сайте, то необходимо там ее округлить.

      Если уже в файле, то необходимо дорабатывать скрипт.

      Но если у Вас цены на сайте в долларах, то возможно, и в прайсе указывать в долларах? Или и там и там в рублях.

      • 0
        Сергей Карпенко
        7 месяцев назад

        На сайте стоит округление, на яндекс маркете тоже округление, надо чтобы скрипт тоже умел округлять, подскажите как правильно сделать округление в скрипте?


        Сайт умеет только в уе цены принимать и через курс уже конвертирует в руб через курс.

        • 0
          Igor
          7 месяцев назад

          Можно попробовать, чтобы суммы, которые передаются в xml-файл уже передавались округленные.

          Или округлять в скрипте, но для этого нужно консультироваться с программистами.

  5. 0
    8 месяцев назад

    Добрый день. 

    Подскажите, пожалуйста, пытаюсь использовать ваш скрипт, но выдает следующую ошибку: 

    TypeError: Не удается вызвать метод "getChildren" объекта undefined. (строка 21, файл Код)

    Все товары в xml фиде заключены в теги <items>, а каждый товар в тег <item>. В скрипт внес соответствующие изменения и откорректировал параметры: http://prntscr.com/em7sdp

    Вот пример самого xml фида: http://prntscr.com/em7u0b

    Буду благодарен за помощь! 

    • 0
      Friend
      5 месяцев назад

      Здравствуйте!

      Скорее всего проблема в том, что параметр <name> находится в тегах <collection>

      Скриншот:


      Необходимо вынести <name> за пределы тега <collection> и проверить работу скрипта еще раз.

  6. 0
    9 месяцев назад

    Сергей, здравствуйте, 

    не совсем понимаю один момент. В начале статьи указано, что "Вам понадобится:  Подготовить фид в формате XML или YML."

    Но, в справке GA, например, речь идет только о формате CSV. Фид создается в этом формате и находится на сайте в таком виде site.com/feed.csv, а от туда мы его тянем с помощью скрипта в Google таблицу, верно?

    • 0
      Sergey
      9 месяцев назад

      Здравствуйте, Сергей!

      Если у Вас есть фид в формате CSV, то его можно сразу загружать в аккаунт AdWords.

      Данный способ будет полезен тем, у кого есть файл xml/yml, но нет возможности сделать обновляющийся файл CSV.

  7. 0
    9 месяцев назад

    Добрый день, возникла проблема со считыванием изображения
    http://take.ms/RMY1g
    Объясните пожалуйста, в чем проблема

  8. 0
    9 месяцев назад

    Сергей, добрый день. Скрипт выдает ошибку: http://joxi.ru/D2P80NJSpJMxE2 Подскажите в чем может быть причина?

    • 0
      Stanislav Pirogov
      9 месяцев назад

      Здравствуйте, Станислав!


      Возможно причина в структуре xml/yml файла.

      Обратите внимание на эти параметры:

      1. Все товары в файле находятся в тегах:

      <offers>

      ***

      </offers>

      2. Внутри этих тегов, каждый товар находится в тегах:

      <offer>

      ***

      </offer>

      http://img.netpeak.ua/marketer/148819186638_kiss_36kb.png

      Возможно у Вас другая структура, но чтобы более подробно изучить необходимо иметь xml/yml файл.


      Спасибо.

  9. 0
    9 месяцев назад

    А можно ли этот скрипт немного переделать, чтоб он вытягивал параметры, которые нужны для динамического ремаркетинга в фейсбук?

    • 0
      Денис Абдалкин
      9 месяцев назад

      Для динамического ремаркетинга Facebook этот скрипт еще не применяли.

      Но если в xml/yml есть все необходимые данные для фида, то можно переделать скрипт и обновлять фид динамического ремаркетинга Facebook.

  10. 0
    9 месяцев назад

    Добрый день.

    Очень круто сделали, спасибо.

    Но подскажите, зачем гугл таблицу сохранять в csv, если можно сразу указать гугл таблицу и оттуда грузить фид?

    • 0
      Денис Абдалкин
      9 месяцев назад

      Здравствуйте, Денис!


      Если у Вас уже есть загружен фид, то тогда можно сразу обновить его с Google Таблицы.

      А если загружаете новый, то AdWords ругается на неправильное расширение файла.

  11. 0
    9 месяцев назад

    День добрый,

    Крутой скрипт и метод. Спасибо!

    Но он подходит для xml подготовленного для Яндекс Маркет.

    А как спарсить xml для google merchant, так как там название атрибутов с двоеточием (<g:id>76</g:id>) и ваш скрипт, к сожалению, не хочет обработать такие атрибуты?


    • 0
      Иван Гопак
      8 месяцев назад

      Здравствуйте!


      Если файл для Яндекс Маркета создавался не по последним требованиям то он подойдет.

      В последнем вариантах техзадания для новых yml-файлов Яндекс Маркета есть условия, которые требуют значительной доработки скрипта.


      Чтобы парсить данные с файла для Google Merchant (с указанными Вами атрибутами) - необходимо обращаться за помощью к программистам.

      В теории это можно сделать, но на практике не применяли.

      • 0
        Сергей Карпенко
        9 месяцев назад

        Здравствуйте!


        Вообщем нашел решение, если нужно спарсить с файла для Google Merchant. Даже два.

        1. Можно использовать встроенную функцию google sheets =IMPORTXML("url","//item"), url - URL xml файла

        //item - атрибут всех элементов в xml файле, в случае xml для Яндекс Маркет будет - //offer

        и потом через редактор скриптов настроить обновление. Пример скрипта можно взять тут - тут

        но этот способ работает, если у вас в xml файле не больше 1000 элементов


        2. В скрипте нужно поменять несколько строчек:

        в 17 строке - var ns = XmlService.getNamespace('g', 'http://base.google.com/ns/1.0');

        в строках 27-33, если в названиях атрибутов используются префиксы g, то добавляется  ns:

        var ids = orders[i].getChildText('id', ns);

         var url = orders[i].getChildText('link');

         var cat = orders[i].getChildText('product_type', ns);

         var name = orders[i].getChildText('title');

         var pic = orders[i].getChildText('image_link', ns);

         var price = orders[i].getChildText('price', ns)+ ' UAH';

         var s_price = orders[i].getChildText('sale_price', ns)+ ' UAH';

Чтобы оставить комментарий, необходимо авторизироваться

Подписаться

на самую полезную рассылку по интернет-маркетингу

Самое

обсуждаемое популярное читаемое