//トリガー用実行関数
function rssdatatrigger(){
getrssdata(-1);
}
//指定のRSSデータを取得してスプレッドシートに反映する
function getrssdata(flg){
var Prop = PropertiesService.getScriptProperties();
//オプション値を取得する
var rssurl = Prop.getProperty("rssurl");
var rsstype = Number(Prop.getProperty("rsstype"));
var rssscheme = Prop.getProperty("scheme");
//RSS Typeで処理を分岐
switch(rsstype){
case 1:
var contents = getRSS10(rssurl);
break;
case 2:
var contents = getRSS20(rssurl);
break;
case 3: //atom
var contents = parseXml(rssurl,rssscheme);
break;
case 4: //google news
var contents = parseGNews(rssurl);
break;
case 5: //fc2 blog
var contents = fc2feed(rssurl);
break;
}
//contentsのtitle, url, dateをスプレッドシートに貼り付ける
var ssid = Prop.getProperty("mysheetid");
var sheet = SpreadsheetApp.openById(ssid).getSheetByName("data");
//シートをクリアする
sheet.getRange("A2:D").clearContent();
//データを貼り付ける
var lastColumn = contents[0].length; //カラムの数を取得する
var lastRow = contents.length; //行の数を取得する
sheet.getRange(2,1,lastRow,lastColumn).setValues(contents);
//flgにより処理を分岐
if(flg == -1){
}else{
//メッセージを表示
var ui = SpreadsheetApp.getUi();
ui.alert("手動でデータを取得しました。");
return;
}
}
function getRSS10(feedURL) {
var rssdata = [];
var response = UrlFetchApp.fetch(feedURL);
var xml = Xml.parse(response.getContentText(), false);
var items = xml.getElement().getElement("channel").getElements("item");
for(var i = 0; i < items.length; i++) {
var title = items[i].getElement("title").getText();
var url = items[i].getElement("link").getText();
var dateman = items[i].getElement("pubDate").getText();
var detail = items[i].getElement("description").getText();
var text = title + ' ' + url;
//itemlistを生成する
var temprssdata = [];
temprssdata.push(title);
temprssdata.push(detail);
temprssdata.push(url);
temprssdata.push(dateman);
//rssdataにpushする
rssdata.push(temprssdata);
}
//値を返す
return rssdata;
}
//RSS2.0形式の場合
function getRSS20(feedURL){
var rssdata = [];
var response = UrlFetchApp.fetch(feedURL);
var xml = Xml.parse(response.getContentText(), false);
var items = xml.getElement().getElement("channel").getElements("item");
for(var i = 0; i < items.length; i++) {
var title = items[i].getElement("title").getText();
var url = items[i].getElement("link").getText();
var dateman = items[i].getElement("pubDate").getText();
var detail = items[i].getElement("description").getText();
var text = title + ' ' + url;
//itemlistを生成する
var temprssdata = [];
temprssdata.push(title);
temprssdata.push(detail);
temprssdata.push(url);
temprssdata.push(dateman);
//rssdataにpushする
rssdata.push(temprssdata);
}
//値を返す
return rssdata;
}
//FC2Blogの場合
function fc2feed(feedURL){
//XMLをパースする
var xml = UrlFetchApp.fetch(feedURL).getContentText();
var document = XmlService.parse(xml);
var root = document.getRootElement();
//namespaceを取得する
var rss = XmlService.getNamespace('http://purl.org/rss/1.0/');
var dc = XmlService.getNamespace('dc', 'http://purl.org/dc/elements/1.1/');
//itemを取得する
var items = root.getChildren('item', rss);
//返却用の配列を用意する
var rssdata = [];
//ループでitemをさらっていく
for (var i = 0; i < items.length; i++) {
//各要素を取得する
var title = items[i].getChild('title', rss).getText();
var link = items[i].getChild('link', rss).getText();
var dateman = items[i].getChild('date', dc).getText();
var detail = items[i].getChild('description', rss).getText();
//detailの文字数を削る
detail = detail.slice(0,30);
//itemlistを生成する
var temprssdata = [];
temprssdata.push(title);
temprssdata.push(detail);
temprssdata.push(link);
temprssdata.push(dateman);
//rssdataにpushする
rssdata.push(temprssdata);
}
//値を返す
return rssdata;
}
// Atom2.0データ取得とパース
function parseXml(url,num) {
var myXml = UrlFetchApp.fetch(url).getContentText();
var myDoc = XmlService.parse(myXml);
var root = myDoc.getRootElement();
var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
var rssdata = [];
// エントリーのタイトルとURLの塊を取得
var entries = root.getChildren('entry', atom);
//HTMLを生成する
var dataLength = entries.length;
for(var i = 0;i<dataLength;i++){
//コンテンツデータを分解する
var title = entries[i].getChild('title', atom).getText();
var id = entries[i].getChild('id', atom).getText();
var tempid = id.split("=");
var dateman = "";
var detail = "";
//titleにタグのようなものがあった場合に、エスケープ文字にreplaceする
title = title.replace("<","<");
title = title.replace(">",">");
//Quiita対応の為に、-1の時はurlを取得する
switch(Number(num)){
case 1:
//Qiita対応
url = entries[i].getChild('url', atom).getText();
dateman = entries[i].getChild('published', atom).getText();
detail = entries[i].getChild('content', atom).getText();
//detailの文字数を削る
detail = detail.slice(0,100);
break;
case 2:
//gsuiteupdateblog対応
var multi = entries[i].getChildren("link", atom);
url = multi[2].getAttribute('href').getValue();
dateman = entries[i].getChild('published', atom).getText();
detail = entries[i].getChild('content', atom).getText();
break;
case 3:
//StackOverFlow対応
url = entries[i].getChild('link', atom).getAttribute('href').getValue();
dateman = entries[i].getChild('published', atom).getText();
detail = entries[i].getChild('summary', atom).getText();
break;
case 4:
//gsuiteupdateblog対応
var multi = entries[i].getChildren("link", atom);
url = multi[4].getAttribute('href').getValue();
dateman = entries[i].getChild('published', atom).getText();
detail = entries[i].getChild('content', atom).getText();
break;
default:
url = tempid[num];
break;
}
//itemlistを生成する
var temprssdata = [];
temprssdata.push(title);
temprssdata.push(detail);
temprssdata.push(url);
temprssdata.push(dateman);
//rssdataにpushする
rssdata.push(temprssdata);
}
//値を返す
return rssdata;
}
// Google Newsをパースする
function parseGNews(url) {
var myXml = UrlFetchApp.fetch(url).getContentText();
var myDoc = XmlService.parse(myXml);
var root = myDoc.getRootElement();
var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
var rssdata = [];
var obj = [];
// エントリーのタイトルとURLの塊を取得
var entries = root.getChildren('entry', atom);
//HTMLを生成する
var dataLength = entries.length;
for(var i = 0;i<dataLength;i++){
//コンテンツデータを分解する
var title = entries[i].getChild('title', atom).getText();
var url = entries[i].getChild('id', atom).getText();
var dateman = entries[i].getChild('updated', atom).getText();
var detail = entries[i].getChild('content', atom).getText();
//itemlistを生成する
var temprssdata = [];
temprssdata.push(title);
temprssdata.push(detail);
temprssdata.push(url);
temprssdata.push(dateman);
//rssdataにpushする
rssdata.push(temprssdata);
}
//値を返す
return rssdata;
}