繁体   English   中英

将多个 Arguments 添加到 Google 表格中的自定义 Function

[英]Adding Multiple Arguments to a Custom Function in Google Sheets

我已经广泛搜索了答案,但似乎找不到。 我正在尝试更改我的自定义 function 以查找站点地图 URL 及其更新日期以接受一系列输入。

这是当前有效的 function:

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;
}

我试过使用下面的谷歌示例,但似乎不起作用,但我将它合并到我的 function 中。 有任何想法吗?

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 的方式:

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  

}

您没有使用与Google 示例相同的格式。 截至目前,您正在实际检索数据后检查输入是否为数组。

但是您将fetch与数组一起用作输入可能会触发错误,并且 function 可能无法检查sitemapUrl可以与map一起使用。

还要考虑到map将在数组的每个元素中调用 function 并返回一个包含每个元素结果的数组。 因此,在您的情况下,B3:B6 将为 B3、B4、B5 和 B6 处的值调用 function 并返回一个长度为 4 的数组和结果。 对于您想要一个列表的情况,您需要在之后展平数组

我会把你的 function 改成这样:

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() ),但对于这种特定情况,您需要展平重塑输入数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM