概要
私は処理の自動化に、Google Apps Scriptを利用しています。
Google Apps Scriptでは、JavaScriptのプログラムを用いて処理を実行するので、プログラムを書ける人であれば、かなり柔軟に処理を実行することができます。
ここでは私が利用している、RSSを利用して情報が更新されているかを知るためのGoogle Apps Scriptを紹介します。
RSSについて
RSSは、ブログなどで記事が追加されているかを知るために使われているものです。通常RSSリーダーなどを用いて、さまざまなWebサービスのRSSを取得して閲覧するというのが一般的ですが、私の場合は、取得したデータをチャットサービスに書き込んだり、情報を保存しておきたいということがあるため、Google Apps Scriptを利用して、スプレッドシートに書き込んでいます。
RSSには、RSS1.0、RSS2.0、Atomなどの種類があります。今回説明するRSSを読み込むプログラムは、Atomに対応するものです。他のRSS1.0やRSS2.0などの場合はフォーマットが異なるため、別のプログラムとなります。
RSSの読み込み
RSSとしてデータを取得する際に、最後に更新した時以降で更新があるかを知るには、過去に取得したデータと照らし合わせて、新しいものがあるかを確認します。
そのため、取得したデータを一度Google Spreadsheetに保存して、そこに保存されたデータと比較することにしました。
// SpreadSheetのid
let sheetId = 'Google SpreadSheetのId '
// RSSを取得するURL
let url = 'url '
function postReleaseNotification() {
// RSSの読み込み
let xml = UrlFetchApp.fetch(url).getContentText()
let document = XmlService.parse(xml)
let root = document.getRootElement()
let atom = XmlService.getNamespace( 'http://www.w3.org/2005/Atom ')
let entries = root.getChildren( 'entry ', atom)
let sheet = SpreadsheetApp.openById(sheetId).getActiveSheet()
// 過去のデータを取得
let lastRow = sheet.getDataRange().getLastRow()
let urls = sheet.getRange(1, 2, lastRow).getValues()
// 古いものから比較するため
entries.reverse()
// RSSから取得したデータと比較と保存
for (var entry of entries) {
let title = entry.getChild( 'title ', atom).getText()
let link = entry.getChild( 'link ', atom).getAttribute( 'href ').getValue()
let updated = Utilities.formatDate(new Date(entry.getChild( 'updated ', atom).getText()), 'JST ', "yyyy-MM-dd 'T 'HH:mm:ssXXX")
// URLが一致しないときは新しいデータ
if (urls.some(url => url[0] === link)) {
continue
}
// スプレッドシートへの保存
sheet.appendRow([title, link, updated])
}
}
スプレッドシートと連携する必要があるので、少し複雑になっています。また、スプレッドシートを使うため、あらかじめスプレッドシートを作成して、IDを取得しておく必要があります。そのIDは、sheetId変数に代入します。
やっていることはそれほど難しくなく、Spreadsheetの読み込みと保存、RSSとして読み込んだデータのパースが主な処理となります。
ちなみにRSSのデータ自体はXML形式のデータとなるため、しっかりとしたルールのもとに書かれています。つまり適切にパースさえできればデータを取得できます。
さいごに
Google Apps ScriptはJavaScriptでプログラムを書けるので、様々なことができ、とても便利です。
みなさんも、もしよければ使ってみてください。