※本記事はアフィリエイト広告(PR)を含みます
この記事では、Google Apps Script(GAS)で複数サイトのRSSフィードを読み取り、最新記事のタイトル・URL・公開日をスプレッドシートに自動でためる仕組みを作ります。所要時間は約20分。必要なのはGoogleアカウントだけで、コードはコピペでOKです。
この仕組みでできること
RSSフィードを公開しているサイト(多くのブログ・ニュースサイトが対応)を登録しておくと、定期的に新着記事の情報がスプレッドシートの行として追加されていきます。
集まる情報は次の3つです。
- 記事タイトル
- 記事URL
- 公開日時
これを眺めるだけで「今どんな記事が出ているか」が一覧でわかり、ブログのネタ出しが一気にラクになります。
ステップ1:スプレッドシートを準備する
- Googleスプレッドシートを開き、空白のシートを新規作成します。
- シート名(左下のタブ)を
feedsに変更します。 - 1行目に見出しとして、A1に「収集日時」、B1に「サイト」、C1に「タイトル」、D1に「URL」、E1に「公開日」と入力します。
[画像: feedsシートの1行目に見出しを入れた状態]
見出し行は必須ではありませんが、後で見返すときに圧倒的にわかりやすくなります。
ステップ2:スクリプトエディタを開く
- メニューの 拡張機能 → Apps Script をクリックします。
- 新しいタブで「無題のプロジェクト」というエディタが開きます。
- プロジェクト名を
RSS収集などわかりやすい名前に変更しておきます(左上の「無題のプロジェクト」をクリック)。
[画像: Apps Scriptエディタの初期画面]
ステップ3:収集コードを貼り付ける
エディタにある function myFunction() {} をすべて削除し、次のコードをそのまま貼り付けてください。
// 監視したいRSSフィードのURLをここに追加
const FEEDS = [
{ name: 'はてなブログ開発', url: 'https://staff.hatenablog.com/feed' },
{ name: 'Googleウェブマスター', url: 'https://developers.google.com/search/blog/feed.xml' },
];
function collectFeeds() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('feeds');
const now = new Date();
// 既存URLを取得して重複を防ぐ
const existing = sheet.getRange('D:D').getValues().flat();
FEEDS.forEach(feed => {
try {
const xml = UrlFetchApp.fetch(feed.url).getContentText();
const doc = XmlService.parse(xml);
const root = doc.getRootElement();
let items = [];
// RSS2.0形式(<item>)
const channel = root.getChild('channel');
if (channel) {
items = channel.getChildren('item');
} else {
// Atom形式(<entry>)
const ns = root.getNamespace();
items = root.getChildren('entry', ns);
}
items.slice(0, 5).forEach(item => {
const title = getText(item, 'title');
const link = getLink(item);
const date = getText(item, 'pubDate') || getText(item, 'updated');
if (link && existing.indexOf(link) === -1) {
sheet.appendRow([now, feed.name, title, link, date]);
}
});
} catch (e) {
Logger.log(feed.name + ' の取得に失敗: ' + e);
}
});
}
function getText(item, tag) {
const ns = item.getNamespace();
let child = item.getChild(tag);
if (!child) child = item.getChild(tag, ns);
return child ? child.getText() : '';
}
function getLink(item) {
let link = item.getChild('link');
if (link && link.getText()) return link.getText(); // RSS
const ns = item.getNamespace();
link = item.getChild('link', ns);
return link ? link.getAttribute('href').getValue() : ''; // Atom
}
FEEDS の中身を、自分が監視したいサイトのRSS URLに書き換えてください。1行=1サイトで、カンマ区切りで何個でも追加できます。
ステップ4:動かして権限を許可する
- エディタ上部の関数選択メニューで
collectFeedsを選びます。 - ▶ 実行 ボタンをクリックします。
- 初回は「承認が必要です」と出るので、権限を確認 → 自分のアカウントを選択します。
- 「このアプリはGoogleで確認されていません」と出たら、詳細 → (プロジェクト名)に移動 をクリックし、最後に 許可 を押します。
[画像: GASの承認画面で「許可」を押す箇所]
実行が終わったら、スプレッドシートに戻ってみてください。feeds シートに記事が追加されていれば成功です。
実際に私の環境(はてな+Google検索ブログを登録)で試したところ、初回実行で8件ほど一気に入りました。重複チェックを入れているので、2回目以降は新着分だけが増えていきます。
ステップ5:自動実行(トリガー)を設定する
手動実行では意味が薄いので、定期的に勝手に動くようにします。
- エディタ左側の 時計アイコン(トリガー) をクリックします。
- 右下の トリガーを追加 をクリックします。
- 設定を次のようにします。
- 実行する関数:
collectFeeds - イベントのソース:時間主導型
- 時間ベースのトリガー:時間ベースのタイマー
- 時間の間隔:6時間おき(お好みで1日おきなどでもOK)
- 実行する関数:
- 保存 を押します。
これで6時間ごとに自動でフィードを巡回し、新着があればシートに追記してくれます。
つまずきポイント:うまくいかないとき
シートに何も追加されない
まず feeds というシート名が正確か確認してください。全角スペースや大文字小文字の違いでも getSheetByName は失敗します。コードの 'feeds' とタブ名を完全一致させましょう。
特定のサイトだけ取れない
RSSではなくAtom形式だったり、そもそもフィードを公開していない可能性があります。エディタの 実行ログ(実行後に下部へ表示)に「取得に失敗」と出ていないか確認してください。ブラウザでRSS URLを直接開いて、XMLが表示されるかどうかが切り分けの目安です。
「承認が必要です」が何度も出る
初回承認時に許可をスキップしているケースが多いです。ステップ4の手順で、最後の 許可 まで必ず押し切ってください。
取得件数が多すぎる/少なすぎる
コード内の items.slice(0, 5) の数字が、1サイトあたりの取得件数です。5 を 10 にすれば最新10件まで拾います。
まとめ
この記事では、GASでRSSフィードを巡回し、ブログのネタ候補をスプレッドシートに自動収集する仕組みを作りました。ポイントは次の通りです。
feedsシートとシート名を一致させるFEEDS配列に監視したいRSS URLを並べる- 時間主導型トリガーで6時間おきに自動実行する
次のアクションとしては、集まったタイトルをChatGPTに渡して「自分のブログ向けの切り口」に変換させると、ネタ出しまで一気通貫で自動化できます。まずは1〜2サイトだけ登録して、無理のない範囲から始めてみてください。
※GoogleのUIや仕様は変更される場合があります。画面表示が本記事と異なるときは、最新の表記に読み替えてください。
PR: ChatGPTなどの生成AIを学び仕事に活かす!「DMM 生成AI CAMP」
RSSで集めたネタを記事に仕上げる段階では、生成AIを使いこなせると作業効率が一段上がります。ChatGPTなどを仕事にどう活かせるか気になったら、DMM 生成AI CAMPの無料セミナーをのぞいてみては。学習プランや疑問点は無料相談で確かめられます。


コメント