Edited at

Google Apps Script で RSS(Atom) 配信サービス作るためのライブラリ作りました

RSS(Atom) を配信していないサイトの RSS を自前で用意する気になり、お手軽に作れそうだった Google Apps Script(GAS) で web の記事1を参考に作ったのですが、その際に RSS の xml を作るのが面倒だったので、 規定のフォーマットのオブジェクトを渡したら xml に変換するライブラリを用意しました。

GAS で RSS 配信サービスが必要な方、もしよろしければお使いください。

なお、 RSS 配信と謳っておきながら対応している xml は Atom のみです。


依存ライブラリの設定


  1. GAS のエディタ画面のメニューの [リソース]-[ライブラリ...] をクリックしてダイアログを開きます。

  2. [ライブラリを追加] という入力欄に MuOceWm5hEHRyN-rW66jK0WxlxRXaDxkn という値を入力し、 [追加] ボタンをクリックします。

  3. グリッドの [タイトル] というカラムの値が AtomService というレコードが追加されるので、 [バージョン] というカラムのコンボボックスから最新のバージョンを選択し、保存ボタンを押します。


使い方

function 内で以下のようなオブジェクトを作成します。オブジェクトのシェイプの詳細は こちら をご参照ください。

const feed = {

author: {
name: 'your name',
},
entry: [
id: {
uri: encodeURI('URI'),
},
link: [
{
href: encodeURI('URI'),
rel: 'self',
title: 'Title',
},
{
href: encodeURI('URI'),
rel: 'alternate',
title: 'Title',
},
],
summary: {
text: 'Summary',
},
title: {
text: 'Title',
},
updated: {
dateTime: new Date(),
},
],
generator: {
uri: encodeURI('URI'),
version: '1',
text: 'generator-name',
},
icon: {
uri: encodeURI('URI'),
},
id: {
uri: encodeURI('URI'),
},
link: [
{
href: encodeURI('URI'),
rel: 'self',
title: 'Title',
},
],
logo: {
uri: encodeURI('URI'),
},
title: {
text: 'Title',
},
updated: {
dateTime: new Date(),
},
};


xml への変換

上記のようなオブジェクトを marshal というメソッドに渡すことで xml 文字列に変換します。

const xml = AtomService.marshal(feed);

この文字列を以下のような形で doGet とかで戻してやると配信できます。

function doGet() {

const feed = ...
const xml = AtomService.marshal(feed);
return ContentService
.createTextOutput(xml)
.setMimeType(ContentService.MimeType.XML)
;
}


変換可能かのチェック

上記 marshal 内でも呼び出していますが、オブジェクトが変換可能か、規定のシェイプに合致しているかをチェックするメソッドを別途用意しています。

問題があった場合に Error を throw します。

AtomService.isMarshalable(feed);

このチェックはあくまで変換可能かのチェックのみで、 Atom のシンタックスチェックは行なっていないので、必要な場合には、 W3C の Validation Service などを利用してください。


こんなの用意した背景

最初は Node のライブラリ2を使って webpack で一つにまとめてという感じでやろうとしていたのですが、ビルドした js がなぜか GAS 上では文法エラーになってしまい、泣く泣く断念して自前で用意することにしました。

どなたかライブラリ含めた状態で上手くビルドできる方がいらっしゃったらやり方を共有して頂けると幸いです...


使ったライブラリとか

つい先日 clasp が Typescript をサポートした! という記事がアップされていましたが、その前に同じ作者様の GAS のGoogle謹製CLIツール clasp という記事を発見していたので、 clasp を使いました。そして、私がこの作業始めた時に既に TypeScript に対応していたので、 TypeScript で書きました。

詳細は前述の記事に譲りますが、 ローカルで TypeScript で作成したものを非常に簡単にプッシュ・デプロイまでできます。

TSLint でのチェックと、 Jest でのテストも問題なくできます。

GAS で TypeScript を使わない理由がないです。


ソースコード

ソースコードは以下においてあります。

https://github.com/kobanyan/AtomService

実際にデプロイされているコードは以下になります。

https://script.google.com/d/1_sGF6z2Z4nYQ9aag4DMCPS-tSo__mU0Icst8qrCAsvRE2rQmSppLiw28/edit?usp=sharing