簡體   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