Добавление нескольких аргументов в пользовательскую функцию в Google Sheets - PullRequest
0 голосов
/ 14 апреля 2020

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

Вот текущая функция, которая работает:

function sitemap(sitemapUrl, namespace) {
  var array = [];
  var xml = UrlFetchApp.fetch(sitemapUrl).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var sitemapNameSpace = XmlService.getNamespace("http://www.sitemaps.org/schemas/sitemap/0.9");

  var urls = root.getChildren('url', sitemapNameSpace);

  for (var i = 0; i < urls.length; i++) {
    var loc = urls[i].getChild('loc', sitemapNameSpace).getText();
    var lastmod = urls[i].getChild('lastmod', sitemapNameSpace).getText();
    array.push([loc, lastmod]);
  }

  return array;
}

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

function DOUBLE(input) {
  if (input.map) {            // Test whether input is an array.
    return input.map(DOUBLE); // Recurse over array if so.
  } else {
    return input * 2;
  }
}

Редактировать: Вот как я пытался использовать пример Google для своей функции:

function sitemaps(sitemapUrl) {

    var array = [];
    var xml = UrlFetchApp.fetch(sitemapUrl).getContentText();
    var document = XmlService.parse(xml);
    var root = document.getRootElement()
    var sitemapNameSpace = XmlService.getNamespace("http://www.sitemaps.org/schemas/sitemap/0.9")

    var urls = root.getChildren('url', sitemapNameSpace)

    for (var i = 0; i < urls.length; i++) {
     var loc = urls[i].getChild('loc',sitemapNameSpace).getText();
     var lastmod = urls[i].getChild('lastmod',sitemapNameSpace).getText();
    array.push([loc, lastmod]);
  }
   if (sitemapUrl.map) {            
    return sitemapUrl.map(sitemaps); 
  } else {  
    return array  

}

1 Ответ

0 голосов
/ 17 апреля 2020

Вы не используете тот же формат, что и пример Google . На данный момент вы проверяете, является ли ввод массивом после фактического извлечения данных.

Но вы используете fetch с массивом в качестве входных данных, что может вызвать Ошибка , и функция может не добраться до точки, где она проверяет, является ли sitemapUrl может использоваться с map.

Также учтите, что map будет вызывать функцию в каждом элементе массива и возвращать массив с результатом для каждого элемента , Так что в вашем случае B3: B6 вызовет функцию для значения в B3, B4, B5 и B6 и вернет массив длины 4 с результатом. Для вашего случая, в котором вам нужен один список, вам нужно перетянуть массив потом

Я бы изменил вашу функцию так:

function sitemaps(sitemapUrl) {

    if (sitemapUrl.map) {
        return sitemapUrl.map(sitemaps).flat();
    } else {

        var array = [];
        var xml = UrlFetchApp.fetch(sitemapUrl).getContentText();
        var document = XmlService.parse(xml);
        var root = document.getRootElement()
        var sitemapNameSpace = XmlService.getNamespace("http://www.sitemaps.org/schemas/sitemap/0.9")

        var urls = root.getChildren('url', sitemapNameSpace)

        for (var i = 0; i < urls.length; i++) {
            var loc = urls[i].getChild('loc', sitemapNameSpace).getText();
            var lastmod = urls[i].getChild('lastmod', sitemapNameSpace).getText();
            array.push([loc, lastmod]);
        }
        return array
    }
}

Хотя то, что вы делаете, хорошо, учтите, что также существует способ получить все запросы одновременно (UrlFetchApp.fetch()), но для этого конкретного c случая вам придется сгладить изменить форму входного массива.

...