• Skip to main content
  • Skip to primary sidebar

PPC Scripts

by Lynt services

  • Workshop: Automatizace PPC (Praha, Brno)
  • PPC služby
  • Pár slov o blogu
  • Angličtina
  • Čeština
Jste zde: Domů / Adwords skripty / Skript pro sledování nových a odstraněných produktů v eshopu

Skript pro sledování nových a odstraněných produktů v eshopu

27 listopadu, 2015 od Jakub Kašparů 7 Comments

Skript slouží pro sledováních nových a odstraných produktů v eshopu klienta.

Funkce skriptu

  1. Skript umí pracovat s feedy Heureka, Zboží a Merchant center.
  2. Na základě změn ve feedu Vám u každé položky zapisuje datum přidání.
  3. Díky tomu je možné zjistit, jaké produkty byli přidané za určité období.

Zdrojový kód skriptu

Sklik skript s PNO reportem
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
/* ====== SETTINGS ======= */
var SpreadSheetUrl = "";
 
var DefaultFeedUrl = '';
var DefaultFeedType = 'merchant'; //zbozi|heureka|merchant
var DefaultNotifyEmail = '';
 
var SettingListName = "Nastaveni";
var ActiveListName = "Aktivni";
var DeletedListName = "Smazane";
/* ====== SETTINGS ======= */
 
 
 
 
/* ====== VARIABLES ======= */
var now = new Date();
var SettingList;
var ActiveList;
var DeletedList;
var FeedUrl;
var FeedType;
var NotifyEmail;
/* ====== VARIABLES ======= */
 
 
function lynt_arrayFlatten(arr, index) {
  var newArr = new Array();
  for (var i = 0; i < arr.length; i++) {
    newArr[i] = arr[i][index];
  }
  return newArr;
}
 
function lynt_parseXmlZbozi(feed) {
 
  var feedData = {
    urls: new Array(),
    names: new Array(),
    prices: new Array(),
    count: 0
  };
 
  var xml = UrlFetchApp.fetch(feed).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var ns = root.getNamespace();
  var entries = document.getRootElement().getChildren();
 
  var i;
  for (i = 0; i < entries.length; i++) {
    feedData.urls[i] = entries[i].getChildText('URL', ns);
 
 
    if (entries[i].getChildText('PRICE_VAT', ns)) {
      feedData.prices[i] = entries[i].getChildText('PRICE_VAT', ns);
    } else {
      feedData.prices[i] = 0;
    }
 
    if (entries[i].getChildText('PRODUCTNAME', ns)) {
      feedData.names[i] = entries[i].getChildText('PRODUCTNAME', ns);
    } else if (entries[i].getChildText('PRODUCT', ns)) {
      feedData.names[i] = entries[i].getChildText('PRODUCT', ns);
    } else {
      feedData.names[i] = 'UNKNOWN';
    }
  }
 
  feedData.count = i + 1;
 
  return feedData;
}
 
function lynt_parseXmlHeureka(feed) {
 
  var feedData = {
    urls: new Array(),
    names: new Array(),
    prices: new Array(),
    count: 0
  };
 
  var xml = UrlFetchApp.fetch(feed).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var entries = document.getRootElement().getChildren();
 
  var i;
  for (i = 0; i < entries.length; i++) {
    feedData.urls[i] = entries[i].getChildText('URL');
 
    if (entries[i].getChildText('PRICE_VAT', ns)) {
      feedData.prices[i] = entries[i].getChildText('PRICE_VAT', ns);
    } else {
      feedData.prices[i] = 0;
    }
 
 
    feedData.names[i] = entries[i].getChildText('PRODUCTNAME');
  }
 
  feedData.count = i + 1;
 
  return feedData;
}
 
 
function lynt_parseXmlMerchant(feed) {
 
  var feedData = {
    urls: new Array(),
    names: new Array(),
    prices: new Array(),
    category: new Array(),
    count: 0
  };
 
  var xml = UrlFetchApp.fetch(feed).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var ns = root.getNamespace('g');
  var entries = document.getRootElement().getChild('channel').getChildren('item');
 
  var i;
 
  for (i = 0; i < entries.length; i++) {
    feedData.urls[i] = entries[i].getChildText('link');
    feedData.names[i] = entries[i].getChildText('title');
    if (entries[i].getChildText('price', ns)) {
      var price = entries[i].getChildText('price', ns).replace(' Kč', '').replace(/\s/g, '');
      price = price * 1;
      feedData.prices[i] = price;
    } else {
      feedData.prices[i] = 0;
    }
 
  }
 
  for (i = 0; i < entries.length; i++) {
    feedData.urls[i] = entries[i].getChildText('link');
    feedData.names[i] = entries[i].getChildText('title');
    if (entries[i].getChildText('custom_label_0', ns)) {
      feedData.category[i] = entries[i].getChildText('custom_label_0', ns);
    } else {
      feedData.category[i] = '';
    }
  }
  feedData.count = i + 1;
  return feedData;
}
 
function setup() {
  //set up sheets and global variables
  var reportSpreadsheet = SpreadsheetApp.openByUrl(SpreadSheetUrl);
  SettingList = reportSpreadsheet.getSheetByName(SettingListName);
  if (SettingList == null) {
    SettingList = reportSpreadsheet.insertSheet(SettingListName, 0);
    SettingList.setColumnWidth(2, 150);
    SettingList.setColumnWidth(3, 400);
    var range = SettingList.getRange(2, 2, 4, 2).setBorder(true, true, true, true, true, true);
    range.setValues([
      ['URL feedu', DefaultFeedUrl],
      ['Typ feedu', DefaultFeedType],
      ['Notifikaèní e-mail', DefaultNotifyEmail],
      ['Poslední zpracování', '']
    ]);
  }
  FeedUrl = SettingList.getRange(2, 3).getValue();
  FeedType = SettingList.getRange(3, 3).getValue();
  NotifyEmail = SettingList.getRange(4, 3).getValue();
  ActiveList = reportSpreadsheet.getSheetByName(ActiveListName);
  if (ActiveList == null) {
    ActiveList = reportSpreadsheet.insertSheet(ActiveListName, 1);
    ActiveList.setColumnWidth(1, 400);
    ActiveList.setColumnWidth(2, 300);
    ActiveList.setColumnWidth(3, 150);
    if (FeedType == 'merchant') {
      ActiveList.getRange(1, 1, 1, 5).setValues([
        ['URL produktu', 'Název produktu', 'Cena', 'Kategorie', 'Datum přidání']
      ]);
    } else {
      ActiveList.getRange(1, 1, 1, 4).setValues([
        ['URL produktu', 'Název produktu', 'Cena', 'Datum přidání']
      ]);
    }
  }
  DeletedList = reportSpreadsheet.getSheetByName(DeletedListName);
  if (DeletedList == null) {
    DeletedList = reportSpreadsheet.insertSheet(DeletedListName, 2);
    DeletedList.setColumnWidth(1, 400);
    DeletedList.setColumnWidth(2, 300);
    DeletedList.setColumnWidth(3, 150);
    DeletedList.setColumnWidth(4, 150);
    DeletedList.getRange(1, 1, 1, 4).setValues([
      ['URL produktu', 'Název produktu', 'Datum přidání', 'Datum odebrání']
    ]);
  }
  //Deleting 'list 1' sheet
  var list1_sheet = reportSpreadsheet.getSheetByName("List 1");
  if (list1_sheet != null) {
    reportSpreadsheet.deleteSheet(list1_sheet);
  }
  return reportSpreadsheet;
}
 
function main() {
  var feedData;
  var reportSpreadsheet = setup();
  switch (FeedType) {
    case 'zbozi':
      feedData = lynt_parseXmlZbozi(FeedUrl);
      break;
    case 'heureka':
      feedData = lynt_parseXmlHeureka(FeedUrl);
      break;
    case 'merchant':
      feedData = lynt_parseXmlMerchant(FeedUrl);
      break;
  }
  //Logger.log("XML feed parsed");
  if (feedData) { //get number of rows
    var numRows = reportSpreadsheet.getSheetByName(ActiveListName).getLastRow();
    if (numRows > 1) {
      //get products URLs
      aktivni = lynt_arrayFlatten(reportSpreadsheet.getSheetByName(ActiveListName).getRange(2, 1, numRows, 1).getValues(), 0);
 
      //delete rows with past produducts
      for (var i = aktivni.length; i > 1; i--) {
        if (aktivni[i - 2] && feedData.urls.indexOf(aktivni[i - 2]) === -1) {
          var row = reportSpreadsheet.getSheetByName(ActiveListName).getRange(i, 1, 1, 3).getValues();
          row[0][3] = now;
          reportSpreadsheet.getSheetByName(DeletedListName).appendRow(row[0]);
          reportSpreadsheet.getSheetByName(ActiveListName).deleteRow(i);
        }
      }
    }
    //Logger.log("outdated products removed");
    //add rows with new products
    var toAdd = new Array();
    var numLines = 0;
    var mailMessage = "";
    for (var i = 0; i < feedData.urls.length; i++) {
      if (feedData.urls[i] && (numRows < 2 || aktivni.indexOf(feedData.urls[i]) === -1)) {
 
        if (FeedType == 'merchant') {
          toAdd.push([feedData.urls[i], feedData.names[i], feedData.prices[i], feedData.category[i], now]);
          mailMessage += feedData.names[i] + " (" + feedData.urls[i] + ")\n";
          numLines++;
        } else {
          toAdd.push([feedData.urls[i], feedData.names[i], feedData.prices[i], now]);
          numLines++;
          mailMessage += feedData.names[i] + " (" + feedData.urls[i] + ")\n";
        }
      }
    }
    if (numLines) {
      mailMessage = "V XML feedu " + FeedUrl + " se objevily nové záznamy (" + numLines + "): \n\n" + mailMessage;
      numRows = reportSpreadsheet.getSheetByName(ActiveListName).getLastRow();
      //Logger.log(mailMessage);
      var matches = FeedUrl.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
      var domain = matches && matches[1];
      MailApp.sendEmail(NotifyEmail, 'Změna v XML feedu ' + domain, mailMessage);
      reportSpreadsheet.getSheetByName(ActiveListName).getRange(numRows + 1, 1, numLines, 5).setValues(toAdd);
      //Logger.log("new products added");
    }
 
    SettingList.getRange(5, 3).setValue(now);
  }
}

Kategorie:Adwords skripty

Reader Interactions

Comments

  1. Petr says

    1 února, 2016 at 5:10 pm

    Bylo by cool, kdyby tu bylo víc info pro uživatele, co narazí např. na tento článek aby nemusel složitě hledat a pátrat 🙂

    Kam daný script vložím, kde uvidím výstup?

    Díky za info.

    Odpovědět
  2. Milan says

    30 března, 2016 at 1:49 pm

    Preview mi neprejde kvôli chybe: ReferenceError: „ns“ is not defined. (line 93). Skúšal som rôzne feedy aj klientov. Robím niečo zle?

    Odpovědět
    • Marek Žáček says

      1 července, 2016 at 11:35 am

      Dělá to proto, že tam není definovaná proměnná. Je potřeba mezi řádky 86 a 87 nakopírovat řádek 47. Vycházím z číslování zde ze skriptu v článku.
      Pak už to projde.

      Odpovědět
  3. Lukáš Kolovrat says

    11 srpna, 2016 at 11:30 am

    Ahoj, Jakube,
    při zpracování píše skript tuto chybu: „Limit Exceeded: Email Body Size.“ (Týká se to řádku 263).
    Jak to, prosím, obejít? Dá se ta velikost emailu někde přenastavit? Jedná se vlastně jen o první email, pak už velikosti emailu budou v normě.

    Odpovědět
    • Lukáš Kolovrat says

      12 srpna, 2016 at 9:12 pm

      Odpovím si sám: Jedná se o pevně stanovené limity Google. Tabulka je zde: https://developers.google.com/apps-script/guides/services/quotas
      Problém nastane patrně jen na začátku, kdy chce skript odeslat emailem vlastně všechny produkty z feedu (na začátku jsou pro skript všechny produkty nově přidané).
      Vyřešil jsem to na zakomentováním řádku 6 a 263. Po tom, co se produkty načetly, jsem řádky odkomentoval a nastavil plánované spuštění každý den. Poté již skript běžel bez problémů.

      Kromě J. Kašparů (za poskytnutí skvělého skriptu) děkuji i Marku Žáčkovi, který vyřešil problém s proměnou „ns“ (zdejší koment z 1.7.16).

      Odpovědět
      • Jakub Kašparů says

        12 srpna, 2016 at 9:20 pm

        Vy mě tu už vlastně vůbec nepotřebujete 🙂 Takže super.

        Odpovědět
  4. Lukáš Kolovrat says

    22 října, 2022 at 8:33 pm

    Script je super, ale je potřeba jej upgradovat do Nového prostředí scriptů.
    Neřešil již někdo z vás?
    Díky.

    Odpovědět

Napsat komentář Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *


Primary Sidebar

Naplánované WorkShopy a školení

  • Automatizace PPC kampaní 9.6.17 – Praha
Google Partner

Tools

AWQL Generator
Keyword Combinator
Datastudio Case generator

Autor blogu

Jakub Kašparů, Lynt

Jakub Kašparů

Lynt services s.r.o.
jakub.kasparu@lynt.cz
724 806 769
Twitter JKasparu
LinkedIn LinkedIn

Nejnovější příspěvky

  • Vychází PPC Robot 1.0 11 června, 2019
  • Co je důležité znát pro vytváření AWQL reportů 29 května, 2017
  • Rychlá analýza zákazníků pro PPC kampaně 20 října, 2016

Nejnovější komentáře

  • Lukáš Kolovrat: Skript pro sledování nových a odstraněných produktů v eshopu
  • Lukáš Kolovrat: Nové možnosti reportingu v rámci Adwords skriptů Adwords API v201601
  • Danča: Skript, který porovnává organické dotazy z GA s dotazy z Adwords a hledá příležitosti

RSS Blog Lynt.cz

  • Globální scan otevřených .git repozitářů
  • Vytvoření a použití SSH klíče pro Git ve Windows
  • 10% českých webů – přesměrování špatné a horší
  • Technické zpracování webů WebTop100 2019
  • Vychází PPC Robot 1.0

RSS Blog Medio.cz

  • Zóny: Velká novinka v Google Tag Manageru
  • Kalendář akcí v internetovém marketingu pro rok 2018
  • SEO restart 2017 prezentace a odkazy

© Copyright 2016 Lynt services s.r.o.