見出し画像

Notion で(自分なりの)タスク管理を行う方法?(RSS編)

前回は、タイムラインやカレンダービュー、Notion カレンダーの活用法について、私自身も検討中の部分まで含めて説明し、

Notion で(自分なりの)タスク・時間管理を行う方法の「実践編」として、紹介したかったことは、大体、語り終えたと思います。

また、いずれ「振り返り記事」のようなものを書くかもしれませんが、良ければ、是非、マガジンで、これまでの流れをご確認ください。

まず、「入門編」で「スモールスタート」し、「運用編」で、使いながらシステムを完成させて、「拡張編」では、更なるカスタマイズを検討し、
そして、「実践編」で、自分なりの運用方針も固まってきたでしょうか?

後は、個々のタスクやプロジェクトごとに、特別な機能を追加してみるくらいしか、やることは残されていないかもしれません。

というわけで、今回からは、「番外編」に突入し、気分次第で、ある程度、雑多なトピックも取り上げていきましょう!

というか、知っての通り、Notion は、そもそも、タスク管理に特化したアプリというわけではないので、
実は、これから紹介していく内容の方が、汎用性は高く、
別に、タスク管理をしないにしても、ある種の Notion の使い方として、むしろ興味を持ってくれる人は多いのではないでしょうか。

今回のテーマは、例えば、更新されたら読み逃したくないブログがあったりして、ちゃんと読んだかどうかを Notion のデータベースで管理したり、
Notion にメモを取りたいという方にオススメの手法です。

ちょっと難しい部分もあるかもしれませんが、まぁ、今時 ChatGPT などの力も借りれば、誰しも、なんとかできるでしょう。


RSS を確認する

まず、Feedly などの RSS リーダーを使えば事足りるというのであれば、それでも構いません!笑

note の他に、よく見に行っているブログ等がない人には、RSS リーダーすら不要かもしれませんし、RSS って何?というレベルかもしれませんね。

逆に言うと、これから説明するのは、ある意味、自分なりの RSS リーダーを作成しているようなもので、
わざわざ自分で実装しなければならない代わりに、個人的なニーズを満たすシステムを構築できる可能性が高まり、
既に Notion を使っている人には、集約されるというメリットもあります。

まぁ、ともかく、以下の具体例を参考にしてみてください。

私の場合は、最近、とある(毎日更新の)マガジンの連載を追っていて、

基本的に、毎日のルーチンで、昼頃に(当日の記事はまだアップされていないかもしれないため)昨日の記事を読むことにしており、
その「記事を読む」タスクに紐付けた「ユタカジン」プロジェクトのノートに、次のようなテーブルを設置しているのですが、

「記事リスト」テーブルを作成する

以前までは、記事を読む際に、「名前(記事のタイトル)」や「著者」などの情報を、このテーブルへコピペしていました。

しかし、「更新日時」まで入力したりするのは、ちょっと面倒ですよね。

まぁ、主な目的は、いちばん右の列に、自分で「要点」をまとめておくことにより、過去の記事を探しやすくすることなので、
別に、「更新日時」などは、最悪、なくても困らないのですが。

とは言え、一応、その日時で並べ替えておきたいという気持ちもあります。

そこで、RSS の出番というわけです。

つまり、RSS フィードは(/rss と付けた)次のような URL から取得でき、

https://note.com/taskchute/m/m80cde2fde6bf/rss

これを解析して必要な情報を抽出し、上のテーブルに(Notion API で)自動的にデータが追加されるようにすれば、コピペ作業から解放されます!

もちろん、記事へのリンクも取ってこれるので、直接、Notion から読みたい記事に飛べるだけでも便利かもしれません。

RSS を解析する

それでは、RSS を解析する方法を説明していきましょう。

以前、Google カレンダーから今日の予定を取得して、「タスクリスト」データベースにタスクを自動追加する手順を紹介しましたが、

これに対比させて言うなら、RSS フィードから記事の情報を取得して、「記事リスト」データベースへ追加することになります。

要するに、Notion API でデータベースにデータを追加する部分は、ほとんど同様なので、問題は、RSS からデータを抽出するところですね。

今回も、例によって GAS(Google Apps Script)を活用させてもらいましょう(使い方などの概要は、上の記事を参照してください)。

上手く聞けば、ChatGPT が教えてくれるかもしれませんが、例えば、以下のようになるでしょうか。

function parseRSS() {
  const xml = UrlFetchApp.fetch("https://note.com/taskchute/m/m80cde2fde6bf/rss").getContentText();
  const root = XmlService.parse(xml).getRootElement();
  const items = root.getChildren('channel')[0].getChildren('item');
  items.forEach((item) => {
    const title = item.getChild('title').getText();
    console.log(title);
    const url = item.getChild('link').getText();
    console.log(url);
    const creator = item.getChild('creatorName', XmlService.getNamespace("https://note.com")).getText();
    console.log(creator);
    const date = new Date(item.getChild('pubDate').getText());
    console.log(date);
  });
}

RSS フィードは、XML という形式で、GAS では「XmlService.parse()」を使うと、比較的、簡単にデータを取り出せます。

まぁ、簡単と言っても、「getChildren()」や「getChild()」で、何をどう取得すればいいかを読み解けることが前提ですが。

興味があれば、上のコードにおけるデータの取得の仕方と、元の XML の記述を比較して、どのように対応しているのか、確認してみてください。

https://note.com/taskchute/m/m80cde2fde6bf/rss

ここのハードルさえ越えられれば、他の情報、例えば「description」なども取得したいと思った時に、応用が効くはずです。

少し難しいのは、「note:creatorName」を取得している部分で、この「:」で区切られた前半の部分は「プレフィックス」と呼ばれており、
実は、XML の名前空間「xmlns」に付けられた各プレフィックスは、RSS フィードの一行目で定義されているので、

xmlns:note="https://note.com"

この「<note:creatorName>」タグで囲まれた情報を XML から取得するためには、仕様上、次のように書く必要があります。

const creator = item.getChild('creatorName', XmlService.getNamespace("https://note.com")).getText();

ともあれ、この「parseRSS()」を実行してみると、以下のようなログが出力されましたでしょうか?

RSS を解析して必要なデータを取得する

ちなみに、note の RSS では、通常、最新の「25件」より前の記事のデータは取得できないので、ご注意ください。
記事数が多いと、とんでもないデータ量になってしまいますからね。

また、例えば、以下のように、更新日時で絞り込むことにより、12時間前から現在までの間に更新された記事だけを取得するようなこともできます。

function parseRSS() {
  const xml = UrlFetchApp.fetch("https://note.com/taskchute/m/m80cde2fde6bf/rss").getContentText();
  const root = XmlService.parse(xml).getRootElement();
  const items = root.getChildren('channel')[0].getChildren('item');
  const today = new Date();
  const ago = new Date(today.getTime() - (12 * 60 * 60 * 1000));
  items.forEach((item) => {
    const date = new Date(item.getChild('pubDate').getText());
    if (ago < date) {
      const title = item.getChild('title').getText();
      console.log(title);
      const url = item.getChild('link').getText();
      console.log(url);
      const creator = item.getChild('creatorName', XmlService.getNamespace("https://note.com")).getText();
      console.log(creator);
      console.log(date);
    }
  });
}

変数「ago」に、現在時刻から(ミリ秒単位で)12時間を引いた日時を入れておき、各記事の更新日時と比較しているだけですが、
後ほど、これを自動実行させるための「トリガー」設定を行う際、ここで指定した時間が重要となってくるため、覚えておいてください。

Notion にデータを自動追加する

さて、これで、後は、取得したデータを、Notion API を使ってデータベースに追加していくだけです。

Google カレンダーの予定を「タスクリスト」へ追加した時と同様に、
まず、Notion 上にテーブルを作成したら、そのデータベースの ID を控えておき、次に、そのテーブルに応じた送信データを構成します。

まぁ、もちろん、RSS から取得できるデータとも対応していないといけないので、大体、似たような感じにはなるでしょう。
私の場合、最終的には、以下のようなコードになりました。

function parseRSS() {
  const xml = UrlFetchApp.fetch("https://note.com/taskchute/m/m80cde2fde6bf/rss").getContentText();
  const root = XmlService.parse(xml).getRootElement();
  const items = root.getChildren('channel')[0].getChildren('item');
  const today = new Date();
  const ago = new Date(today.getTime() - (12 * 60 * 60 * 1000));
  items.forEach((item) => {
    const date = new Date(item.getChild('pubDate').getText());
    if (ago < date) {
      const title = item.getChild('title').getText();
      const url = item.getChild('link').getText();
      const creator = item.getChild('creatorName', XmlService.getNamespace("https://note.com")).getText();
      const data = {
        "parent": { "type": "database_id", "database_id": "xxxxx" },
        "properties": {
          "title": { "type": "title", "title": [{ "type": "text", "text": { "content": title } }] },
          "URL": { "type": "url", "url": url },
          "著者": { "rich_text": [{ "type": "text", "text": { "content": creator } }] },
          "更新日時": { "type": "date", "date": { "start": date } }
        }
      };
      const options = {
        'method': 'post',
        'headers': {
          'Authorization': 'Bearer secret_XXXXX',
          'Content-Type': 'application/json',
          'Notion-Version': '2022-06-28'
        },
        'payload': JSON.stringify(data)
      };
      UrlFetchApp.fetch('https://api.notion.com/v1/pages', options);
    }
  });
}

今度は、「console.log()」で出力する代わりに、Notion API でデータを送信するわけですね。

例によって、"xxxxx" と "secret_XXXXX" の部分は、「記事リストデータベースの ID」と「Notion API のシークレット」に書き換えてください。

ちなみに、その辺の細かいことは、よく分からなければ、以前の記事が参考になると思うので、念の為、もう一度リンクを貼っておきます。

では、上の記事と同様に、サイドバーから(目覚まし時計のアイコンの)トリガーページを開いて、
定期的に「parseRSS()」が自動実行されるように、設定しましょう。

ここで、実は、「時間ベースのタイマー」には、1, 2, 4, 6, 8, 12時間おきしか、選択肢がないという点にも、要注意です。

「トリガーを追加」する

もちろん、念の為、なるべく頻繁に実行しておきたいなら、「分ベースのタイマー」を使っても構いません。
なんにせよ、上で「更新日時」による記事の絞り込みを行った際の時間設定と、間隔を合わせておく必要があるというわけですね。

また、その気になれば、このトリガーの設定すら、スクリプトで行う(自動化する)ことも可能らしいので、
もし、お望みの選択肢がなかったり、もっと厳密な時間に実行してほしいという場合には、調べてみてください。

まぁ、今回の(私の)使い方においては、そこまで正確な時間に実行する必要もないでしょう。
そもそも、元の記事の更新が遅れていたりしたら、昨日の記事もまだ追加されていない、ということは、稀にあるかもしれませんが。

ともあれ、これで、12時間以内に更新された記事のデータが、12時間おきにデータベースへ追加されていくはずです!

更新された記事のデータが自動的に追加される

まとめ

今回は、note のマガジンを例に、RSS フィードを解析し、
記事のタイトルやリンクなどを、自動的に Notion のデータベースへ追加していく方法を紹介しました。

私の場合、「ユタカジン」の記事を読むというタスクが、毎日のルーチンの一つとなっているので、
そのタスクに紐づけられたプロジェクトのページに、上のようなテーブルを配置しているというわけですね。

note のマガジンの場合は、同様のスクリプトが使えると思いますし、
今回の内容は、特に、自分のニーズに合わせて、様々な応用が考えられるのではないでしょうか。

ただし、RSS の種類によっても、結構、書き方が変わってくるので、その点は、ご注意ください。
RSS 2.0 のフィードなら、note と同じように扱えるのですが、RSS 1.0 や Atom 形式の場合、例えば、更新日時の取得の仕方が少し違ったりします。

その辺の場合分けについてや、RSS リーダーを使う代わりに、記事のリンクだけ LINE へ送る方法などについても、いずれ紹介したいですね。

ではまた。

この記事が気に入ったらサポートをしてみませんか?