Подписка на изменения цены товаров с Я.Маркета через Google Spreadsheets

Единственная формула в листе — в ячейке A1

Яндекс.Маркет продолжает сваливаться в какой то треш — все активнее режет пользовательский функционал. Так в один из очередных релизов оттуда пропали подписки на оповещения о ценах.

Раньше можно было подписаться на желаемую цену — и если цена товара упадет до этой суммы, то на почту валилось оповещение. Теперь нельзя.

Пришлось сочинять самому через Google Sheets.

Раз в час забираю актуальную цену на интересующий меня товар, сравниваю с желаемой ценой. Если цена ниже или равна — высылаю себе оповещение что цена упала.


Забираем минимальную цену из карточки товара.

Формулой IMPORTXML ходим на Яндекс.Маркет в карточку нужного товара. Кусок с ценой забираем через XPath — это такая форма адресации тегов на странице.

XPath выглядит так: “ /html/body/div[1]/div[1]/div[3]/div/div/div[1]/div”. Его можно скопировать прямо из инструментов разработчика — см скриншот.

Как легко достать XPath любого интересующего эелемента

Правда в этом теге отдается диапазон цен (“61 300 — 65 990”). Нам нужно отрезать все пробелы и всё что после тире. Делаем регулярками- оборачиваем в формулу REGEXREPLACE(“где ищем”,"что ищем”,”на что заменяем”). Получаем вот такое: REGEXREPLACE(<исходная формула с importxml>,"( ‒ .*| )”,””).

В итоге в ячейке оказывается искомая минимальная цена со страницы.

На этом этапе у нас получился только парсер цен, причем данные он забирает только при открытии/обновлении страницы Google Sheets.


Автоматизируем

Идем в Tools — Script editor, пишем пару функций. Первая будет тянуть данные и сохранять время последнего апдейта.

function getData() {
SpreadsheetApp.getActiveSheet().getRange(‘a2’).setValue(‘=REGEXREPLACE(IMPORTXML(“https://m.market.yandex.ru/product/14283201/offers?hid=91491&track=top1&deliveryincluded=0","/html/body/div[1]/div[1]/div[3]/div/div/div[1]/div"),"( ‒ .*| )”,””)’);
var timestamp = Utilities.formatDate(new Date(), “GMT+3”, “dd.MM HH:mm”);
SpreadsheetApp.getActiveSheet().getRange(‘e2’).setValue(timestamp);
}

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

function sendEmailsNotify() {
var sheet = SpreadsheetApp.getActiveSheet();
var rangeCondition = sheet.getRange(“A2:C2”);
var ConditionValue = rangeCondition.getValues();
if (ConditionValue[0][0] <= ConditionValue[0][2] ) {
var timestamp = Utilities.formatDate(new Date(), “GMT+3”, “dd.MM HH:mm”);
MailApp.sendEmail(“sheetsnotify@yourmail.com”, “[Alert] [“+timestamp+”] Google Pixel 128 < “ +ConditionValue[0][2] , “https://m.market.yandex.ru/product/14283201/offers?hid=91491&track=top1&deliveryincluded=0");
}
}

Настраиваем триггеры запуска функций.

Я решил не выдумывать лишнего и просто дергать каждую функцию раз в час — мне не так критично получать инфу о цене в ту же секунду. Идём в Resources — Current project triggers, создаем триггеры на срабатывание каждой функции.

Раз в час будет выполняться каждая функция

Сохраняем, тестируем, ждем.

Итого: полчаса работы, десяток строчек кода — и все готово :)