通过 Google Apps 脚本解析 XML 提要(无法读取未定义的 属性 'getChildren'”)

Parse XML Feed via Google Apps Script (Cannot read property 'getChildren' of undefined")

我需要使用 Google Apps 脚本解析 Google 警报 RSS 提要。 Google Alerts RSS-Feed

我发现 a script 应该可以完成这项工作,但我无法让它与 Google 的 RSS Feed 一起工作:

feed 看起来像这样:

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:idx="urn:atom-extension:indexing">
<id>tag:google.com,2005:reader/user/06807031914929345698/state/com.google/alerts/10604166159629661594</id>
<title>Google Alert – garbe industrial real estate</title>
<link href="https://www.google.com/alerts/feeds/06807031914929345698/10604166159629661594" rel="self"/>
<updated>2022-03-17T19:34:28Z</updated>
<entry>
<id>tag:google.com,2013:googlealerts/feed:10523743457612307958</id>
<title type="html"><b>Garbe Industrial</b> plant Multi-User-Immobilie in Ludwigsfelde - <b>Property</b> Magazine</title>
<link href="https://www.google.com/url?rct=j&sa=t&url=https://www.property-magazine.de/garbe-industrial-plant-multi-user-immobilie-in-ludwigsfelde-117551.html&ct=ga&cd=CAIyGWRmNjU0ZGNkMzJiZTRkOWY6ZGU6ZGU6REU&usg=AFQjCNENveXYlfrPc7pZTltgXY8lEAPe4A"/>
<published>2022-03-17T19:34:28Z</published>
<updated>2022-03-17T19:34:28Z</updated>
<content type="html">Die <b>Garbe Industrial Real Estate</b> GmbH startet ihr drittes Neubauprojekt in der Metropolregion Berlin/Brandenburg. Der Projektentwickler hat sich&nbsp;...</content>
<author>

...
</feed>

我想提取条目 -> id, title, link, updated, content.

我使用了这个脚本:

function ImportFeed(url, n) {
  var res = UrlFetchApp.fetch(url).getContentText();
  var xml = XmlService.parse(res);

  //var item = xml.getRootElement().getChild("channel").getChildren("item")[n - 1].getChildren();
  var item = xml.getRootElement().getChildren("entry")[n - 1].getChildren();

  var values = item.reduce(function(obj, e) {

    obj[e.getName()] = e.getValue();
    return obj;
    }, {});
  
  return [[values.id, values.title, values.link, values.updated, values.content]];  
}

我修改了这部分,但我得到的只是“TypeError: Cannot read 属性 'getChildren' of undefined”

//var item = xml.getRootElement().getChild("channel").getChildren("item")[n - 1].getChildren();
  var item = xml.getRootElement().getChildren("entry")[n - 1].getChildren();

欢迎任何想法!

在你的情况下,下面的修改脚本怎么样?

修改后的脚本:

function SAMPLE(url, n = 1) {
  var res = UrlFetchApp.fetch(url).getContentText();
  var root = XmlService.parse(res.replace(/&/g, "&amp;")).getRootElement();
  var ns = root.getNamespace();
  var entries = root.getChildren("entry", ns);
  if (!entries || entries.length == 0) return "No values";
  var header = ["id", "title", "link", "updated", "content"];
  var values = header.map(f => f == "link" ? entries[n - 1].getChild(f, ns).getAttribute("href").getValue().trim() : entries[n - 1].getChild(f, ns).getValue().trim());
  return [values];
}
  • 在这种情况下,当您使用getChildgetChildren时,请使用名称space。我认为这可能是您遇到问题的原因。

  • 根据您的脚本,我猜想您可能会将您的脚本用作自定义函数。在这种情况下,请将函数名称从 ImportFeed 修改为其他名称,因为 IMPORTFEED 是 Google 电子表格的 built-in 函数。在此示例中,使用 SAMPLE

  • 如果要更改列,请修改header

  • 在此示例中,n 的默认值为 1。在本例中,检索到第一个条目。

  • 例如,
  • 在此脚本中,您可以将 =SAMPLE("URL", 1) 作为自定义函数放入单元格。至此,返回结果值。

注:

  • 如果above-modified脚本不是您问题的直接解决方案,您能否提供res的示例值?据此,我想修改脚本。

  • 作为附加信息,当您想通过脚本编辑器执行脚本来放置所有值时,您还可以使用以下脚本。

      function myFunction() {
        var url = "###"; // Please set URL.
    
        var res = UrlFetchApp.fetch(url).getContentText();
        var root = XmlService.parse(res.replace(/&/g, "&amp;")).getRootElement();
        var ns = root.getNamespace();
        var entries = root.getChildren("entry", ns);
        if (!entries || entries.length == 0) return "No values";
        var header = ["id", "title", "link", "updated", "content"];
        var values = entries.map(e => header.map(f => f == "link" ? e.getChild(f, ns).getAttribute("href").getValue().trim() : e.getChild(f, ns).getValue().trim()));
    
        var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); // Please set the sheet name.
        sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
      }
    

参考文献: