【问题标题】:Adding Multiple Arguments to a Custom Function in Google Sheets向 Google 表格中的自定义函数添加多个参数
【发布时间】:2020-04-14 19:41:42
【问题描述】:

我已经到处寻找答案,但似乎找不到。我正在尝试更改查找站点地图 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;
}

我尝试使用下面的 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  

}

【问题讨论】:

  • 谷歌的例子不起作用是什么意思?你能分享你的床单吗?我自己试过了,效果很好。在您的主要功能中,您有两个输入变量,但从不使用第二个,namespace 为什么会这样?
  • 我在上面的函数中包含了我如何使用 Google 的示例。第二个是可编辑的,但我在函数中设置了它,所以它实际上是不必要的。
  • 请提供一个工作表示例,其中包含您将拥有的输入示例以及您希望输出看起来如何的示例。不知道你想得到什么类型的输出。
  • 这里是所需输入和输出示例的链接 - 感谢您的帮助! docs.google.com/spreadsheets/d/…
  • 谢谢,这更有意义,现在我已经修改并使用您的数据进行了测试。我已经编辑了我的答案,包括使用 flat 来创建一个列表。

标签: javascript google-sheets custom-function


【解决方案1】:

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

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

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

我会把你的功能改成这样:

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

【讨论】:

  • 感谢您的回答!我尝试了您的调整,但我仍然不知道如何输入多个参数(即,查找两个不同的站点地图 URL)并返回一个包含两个结果的列表。我的输入应该是什么样的?
猜你喜欢
  • 1970-01-01
  • 2020-02-06
  • 2013-09-14
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多