Po delší době zas jeden krátký skript do Google Sheets, tentokrát parser libovolné standardní sitemap.xml. Opět je to zpracované jako funkce, tedy stačí pak do nějaké buňky přidat např.

=sitemap("https://www.sitemaps.org/sitemap.xml")

a kouzlo se zjeví.

Jinak lze použít i vestavěné funkce

=IMPORTXML("https://www.centropol.cz/sitemap.xml", "//*[local-name() ='url']/*[local-name() ='loc']|)

ale ta teď myslím neumožňuje import více sloupců, krom toho jsem nad tím chtěl mít kontrolu, tedy např. převádět timestamp na standardní datum, nepřeskakovat chybějící proměnné atp.

Kód je myslím vševysvětlující, pro začátečníky doporučuji svůj starší článek Jak na uživatelské funkce v Google Sheets.

/**
 * Get values from web sitemap (details on https://www.sitemaps.org/protocol.html)
 * @param {"https://www.sitemaps.org/sitemap.xml"} sitemap_url Full URL of sitemap.xml file
 * @param {false} show_header Whenever there should be a headerline with sitemap tagnames, default false
 * @param {"http://www.sitemaps.org/schemas/sitemap/0.9"} namespace If not default, look for xmlns value in the source of the xml sitemap
 * @return Rows of sitemap entries, columns of tags
 * @customfunction
 */

function SITEMAP(sitemap_url,show_header,namespace) {
  try {
    var xml = UrlFetchApp.fetch(sitemap_url).getContentText();
    namespace = (namespace)? namespace : 'http://www.sitemaps.org/schemas/sitemap/0.9';
    var document = XmlService.parse(xml);
    var root = document.getRootElement();
    var sitemapNameSpace = XmlService.getNamespace(namespace);
    
    var urls = root.getChildren('url', sitemapNameSpace);
    var locs = [];
    
    if (show_header) locs.push(["loc","lastmod","changefreq","priority"]);
    
    
    for (var i=0;i < urls.length;i++) {
      var loc = (urls[i].getChild('loc', sitemapNameSpace).getText()); 
      var lastmod = new Date(urls[i].getChildText('lastmod', sitemapNameSpace)); 
      var changefreq = (urls[i].getChildText('changefreq', sitemapNameSpace)); 
      var priority = (urls[i].getChildText('priority', sitemapNameSpace)) ;
      locs.push([loc,lastmod,changefreq,priority]);
    }
    return locs;  
  } catch (e) {
    Logger.log(e);
    return e; 
  }
}

Napsat komentář

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