/**
* RSSフィードから記事を取得する
*/
function getArticles() {
// フィード定義を取得
const feeds = getFeeds();
for (const feed of feeds) {
// RSSの読み込み
console.log(feed.name + ': ' + feed.link);
let xml = UrlFetchApp.fetch(feed.link).getContentText();
let document = XmlService.parse(xml);
let root = document.getRootElement();
let rss = XmlService.getNamespace('http://purl.org/rss/1.0/');
let dc = XmlService.getNamespace('dc', 'http://purl.org/dc/elements/1.1/');
let rdf = XmlService.getNamespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#');
let atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
let rootTagName = root.getName().toLowerCase();
let items;
switch (rootTagName) {
case 'rdf': // 1.0
items = root.getChildren('item', rss);
break;
case 'rss': // 2.0
items = root.getChild('channel').getChildren('item');
break;
case 'feed' : // atom
items = root.getChildren('entry', atom);
break;
}
// スプレッドシートからデータを取得
let articlesSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('articles');
let lastRow = articlesSheet.getDataRange().getLastRow();
let urls = articlesSheet.getRange(1, 3, lastRow).getValues();
// 新しい記事かどうかを古いアイテム(記事)から比較するため
items.reverse();
// RSSから取得したデータと比較と保存
for (var item of items) {
let title;
let link;
let pubDate;
switch (rootTagName) {
case 'rdf': // 1.0
title = item.getChild('title', rss).getText();
link = item.getChild('link', rss).getValue();
pubDate = Utilities.formatDate(new Date(item.getChild('date', dc).getValue()), "JST", "yyyy-MM-dd'T'HH:mm:ssXXX");
break;
case 'rss': // 2.0
title = item.getChild('title').getText();
link = item.getChild('link').getValue();
pubDate = Utilities.formatDate(new Date(item.getChild('pubDate').getValue()), "JST", "yyyy-MM-dd'T'HH:mm:ssXXX");
break;
case 'feed': // atom
title = item.getChild('title', atom).getText();
link = item.getChild('link', atom).getAttribute('href').getValue();
pubDate = Utilities.formatDate(new Date(item.getChild('published', atom).getValue()), "JST", "yyyy-MM-dd'T'HH:mm:ssXXX");
break;
}
// URLが一致しないときは新しいデータ
if (urls.some(url => url[0] === link)) {
continue;
}
// スプレッドシートへの保存
articlesSheet.appendRow([feed.name, title, link, pubDate]);
// 連続投稿で怒られるので
Utilities.sleep(1000);
// チャンネルに投稿
postToChannel(feed.name, title, link);
console.log(feed.name + ': ' + title);
}
}
}