创建一个函数来处理 Google 个工作表中的 RSS 提要
Creating a Function to Process an RSS Feed in Google Sheets
我正在尝试创建一个可以导入 Google Sheet 的功能,以查看来自该网站的最新账单。我遇到的一个问题是,当我只创建一个要附加到 Google Sheet 的变量时,此代码将起作用并附加第一个单元格。但是当我使用相同的逻辑创建多个变量时,但是对于这个 link 带给你的 xml 文件的不同部分,即使我为原始文档创建完全不同的变量,它也会给我这个错误和根:TypeError:无法读取空的 属性 'getValue'。谁能告诉我我做错了什么,这样我至少可以得到它,这样所有这些项目都可以通过解决这个错误附加到 Google Sheet 并告诉我一个如何进行循环以获取所有这些项目?
function getData() {
//get the data from boardgamegeek
var url = 'https://legis.delaware.gov/rss/RssFeeds/IntroducedLegislation';
var xmlrss = UrlFetchApp.fetch(url).getContentText();
var document = XmlService.parse(xmlrss);
var root = document.getRootElement();
//Clear out existing content
var sheet = SpreadsheetApp.getActiveSheet();
var rangesAddressesList = ['A:F'];
sheet.getRangeList(rangesAddressesList).clearContent();
//set variables to data from rss feed
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var title = root.getChild('channel').getChild('item').getChild('title').getText();
var session = root.getChild('channel').getChild('item').getChild('derss:legislativeSession').getText();
var link = root.getChild('channel').getChild('item').getChild('link').getText();
var category = root.getChild('channel').getChild('item').getChild('category').getText();
var description = root.getChild('channel').getChild('item').getChild('description').getText();
var pubDate = root.getChild('channel').getChild('item').getChild('pubDate').getText();
sheet.appendRow(["Session", "Title", "Category", "Pub Date", "Description", "Link"]);
sheet.appendRow([session, title, category, pubDate, description, link]);
}
我相信你的目标如下。
- 您想使用 Google Apps 脚本按顺序检索
legislativeSession, title, category, pubDate, description, link
的值。
- 您想将检索到的值放入 Google Spreadsheet.
修改点:
- 在
derss:legislativeSession
的情况下,derss
是名字space。所以在这种情况下,需要使用名称 space.
- 当我看到你的XML数据时,有很多
item
标签。但是在您的脚本中,第一个 item
正在尝试检索。
- 当取回所有
items
的值时,在循环中使用appendRow
时,处理成本会变高。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
function getData() {
var url = 'https://legis.delaware.gov/rss/RssFeeds/IntroducedLegislation';
var xmlrss = UrlFetchApp.fetch(url).getContentText();
// Set the object for retrieving values in order.
var retrieveNames = {legislativeSession: "Session", title: "Title", category: "Category", pubDate: "PubDate", description: "Description", link: "Link"};
// Parse XML data.
var document = XmlService.parse(xmlrss);
var root = document.getRootElement();
// Retrieve itmes.
var item = root.getChild('channel').getChildren("item");
// Retrieve name space of "derss".
var derssNs = root.getChild('channel').getNamespace("derss");
// By retrieving values from each item, create an array for putting values to Spreadsheet.
var values = item.reduce((ar, e) => ar.concat(
[Object.keys(retrieveNames).map(k => e.getChild(...(k == "legislativeSession" ? [k, derssNs] : [k])).getText())]
), [Object.values(retrieveNames)]);
// Put the created array to Spreadsheet.
var sheet = SpreadsheetApp.getActiveSheet();
var rangesAddressesList = ['A:F'];
sheet.getRangeList(rangesAddressesList).clearContent();
sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}
- 在这个修改后的脚本中,假设活动sheet是第一个sheet。如果您的实际情况不同,请修改以上脚本。
参考文献:
我正在尝试创建一个可以导入 Google Sheet 的功能,以查看来自该网站的最新账单。我遇到的一个问题是,当我只创建一个要附加到 Google Sheet 的变量时,此代码将起作用并附加第一个单元格。但是当我使用相同的逻辑创建多个变量时,但是对于这个 link 带给你的 xml 文件的不同部分,即使我为原始文档创建完全不同的变量,它也会给我这个错误和根:TypeError:无法读取空的 属性 'getValue'。谁能告诉我我做错了什么,这样我至少可以得到它,这样所有这些项目都可以通过解决这个错误附加到 Google Sheet 并告诉我一个如何进行循环以获取所有这些项目?
function getData() {
//get the data from boardgamegeek
var url = 'https://legis.delaware.gov/rss/RssFeeds/IntroducedLegislation';
var xmlrss = UrlFetchApp.fetch(url).getContentText();
var document = XmlService.parse(xmlrss);
var root = document.getRootElement();
//Clear out existing content
var sheet = SpreadsheetApp.getActiveSheet();
var rangesAddressesList = ['A:F'];
sheet.getRangeList(rangesAddressesList).clearContent();
//set variables to data from rss feed
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var title = root.getChild('channel').getChild('item').getChild('title').getText();
var session = root.getChild('channel').getChild('item').getChild('derss:legislativeSession').getText();
var link = root.getChild('channel').getChild('item').getChild('link').getText();
var category = root.getChild('channel').getChild('item').getChild('category').getText();
var description = root.getChild('channel').getChild('item').getChild('description').getText();
var pubDate = root.getChild('channel').getChild('item').getChild('pubDate').getText();
sheet.appendRow(["Session", "Title", "Category", "Pub Date", "Description", "Link"]);
sheet.appendRow([session, title, category, pubDate, description, link]);
}
我相信你的目标如下。
- 您想使用 Google Apps 脚本按顺序检索
legislativeSession, title, category, pubDate, description, link
的值。 - 您想将检索到的值放入 Google Spreadsheet.
修改点:
- 在
derss:legislativeSession
的情况下,derss
是名字space。所以在这种情况下,需要使用名称 space. - 当我看到你的XML数据时,有很多
item
标签。但是在您的脚本中,第一个item
正在尝试检索。 - 当取回所有
items
的值时,在循环中使用appendRow
时,处理成本会变高。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
function getData() {
var url = 'https://legis.delaware.gov/rss/RssFeeds/IntroducedLegislation';
var xmlrss = UrlFetchApp.fetch(url).getContentText();
// Set the object for retrieving values in order.
var retrieveNames = {legislativeSession: "Session", title: "Title", category: "Category", pubDate: "PubDate", description: "Description", link: "Link"};
// Parse XML data.
var document = XmlService.parse(xmlrss);
var root = document.getRootElement();
// Retrieve itmes.
var item = root.getChild('channel').getChildren("item");
// Retrieve name space of "derss".
var derssNs = root.getChild('channel').getNamespace("derss");
// By retrieving values from each item, create an array for putting values to Spreadsheet.
var values = item.reduce((ar, e) => ar.concat(
[Object.keys(retrieveNames).map(k => e.getChild(...(k == "legislativeSession" ? [k, derssNs] : [k])).getText())]
), [Object.values(retrieveNames)]);
// Put the created array to Spreadsheet.
var sheet = SpreadsheetApp.getActiveSheet();
var rangesAddressesList = ['A:F'];
sheet.getRangeList(rangesAddressesList).clearContent();
sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}
- 在这个修改后的脚本中,假设活动sheet是第一个sheet。如果您的实际情况不同,请修改以上脚本。