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 内で以下のようなオブジェクトを作成します。オブジェクトのシェイプの詳細は [こちら](https://github.com/kobanyan/AtomService/blob/master/AtomService.d.ts) をご参照ください。

```javascript
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 文字列に変換します。

```javascript
const xml = AtomService.marshal(feed);
```

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

```javascript
function doGet() {
  const feed = ...
  const xml = AtomService.marshal(feed);
  return ContentService
    .createTextOutput(xml)
    .setMimeType(ContentService.MimeType.XML)
  ;
}
```

### 変換可能かのチェック

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

```javascript
AtomService.isMarshalable(feed);
```

このチェックはあくまで変換可能かのチェックのみで、 Atom のシンタックスチェックは行なっていないので、必要な場合には、 W3C の [Validation Service](https://validator.w3.org/feed/#validate_by_uri) などを利用してください。

## こんなの用意した背景

最初は Node のライブラリ[^2]を使って webpack で一つにまとめてという感じでやろうとしていたのですが、ビルドした js がなぜか GAS 上では文法エラーになってしまい、泣く泣く断念して自前で用意することにしました。
どなたかライブラリ含めた状態で上手くビルドできる方がいらっしゃったらやり方を共有して頂けると幸いです...

## 使ったライブラリとか

つい先日 [clasp が Typescript をサポートした！](https://qiita.com/HeRo/items/f2ce057c6b1456e896ad) という記事がアップされていましたが、その前に同じ作者様の [GAS のGoogle謹製CLIツール clasp](https://qiita.com/HeRo/items/4e65dcc82783b2766c03) という記事を発見していたので、 [clasp](https://github.com/google/clasp) を使いました。そして、私がこの作業始めた時に既に TypeScript に対応していたので、 TypeScript で書きました。

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

[TSLint](https://palantir.github.io/tslint/) でのチェックと、 [Jest](https://jestjs.io) でのテストも問題なくできます。 

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

## ソースコード

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

https://github.com/kobanyan/AtomService

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

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

[^1]: https://www.infoscoop.org/blogjp/2014/11/27/gas-rss-service/ など
[^2]: https://www.npmjs.com/package/feed など