Power AutomateでRSSから取得した情報をExcelに書き出す

企業ブログなどの新着情報をファイル化しておきたいという場合には、定期的に情報をとってきてExcelやSharePointリストに書き出すような仕組みを、Power Automateで簡単に作ることができます。
RSSって何?
「Rich Site Summary(リッチ・サイト・サマリー)」という技術で、ブログや企業HPが更新情報を配信できる仕組み。さまざまなサイトのRSSをそれを読めるツール(OutlookにもRSS取り込み機能あり)に登録しておくと、新着記事を一覧化してくれる素敵な仕組みでです。WordPressのブログの場合、サイトの後ろに/feed とつけてやると、RSSのURLが取得できます。たぶん。フィードと言ったりもします。
一時期はLiveDoorリーダーやGoogleリーダー、はてはRSSなど便利で熱いRSSを取り込んで一覧にするツールがたくさんありましたが、なぜか下火に。近年はFeedlyくらいしかなかったところ、デスクトップ版ChromeにRSSリーダーが復活するという話もあり、古くて新しい技術です。実際便利です。
Microsoftの新着情報がRSSで公開されている
Microsoftも各製品の情報をRSSで配信しています。
https://support.microsoft.com/ja-jp/rss-feed-picker

こちらのサイトでは、Microsoftのどの製品のRSSフィードが欲しいか、一覧から選択して選ぶことができます。ちなみにWindows11のは https://support.microsoft.com/ja-jp/feed/rss/7ebec7c8-1b8a-c547-bea4-cd285c103fd3 でした。ブラウザで開くとこんな感じの文字の羅列・・・

Yahoo!ニュース もRSSフィードを持ってる
いろんな種類のニュースを取得したいなら、Yahoo!ニュースのフィードもよさそうです。
Googleニュースなら検索結果のRSSフィードを得られる!
GoogleニュースでRSSを取得するには一定の法則があるので、ちょっと工夫すると自分好みの話題に関する情報を集められそうです。今回はこれで行きます。
ほしい情報のキーワードで検索
まずは https://news.google.com/ を開いて、ニュースの検索窓に取得したい情報のキーワードを入力します。今回は「乃木坂」で検索してみました。

検索すると、以下のようなURLになりました。日本語がエンコードされているのでわかりにくいですが、searchの後ろに検索文字列が含まれています。
https://news.google.com/search?q=%E4%B9%83%E6%9C%A8%E5%9D%82&hl=ja&gl=JP&ceid=JP%3Aja
このURLのhttps://news.google.com/ の後の部分に「rss」を加えてやります
https://news.google.com/rss/search?q=%E4%B9%83%E6%9C%A8%E5%9D%82&hl=ja&gl=JP&ceid=JP%3Aja
するとなんということでしょう。乃木坂情報満載のフィードが取得できました。

早速作ってみよう。RSSをPower Automateで取得。
今回は毎日新着情報を読みに行こうと思うので、新しいフローから「スケジュール済みクラウドフロー」を選択しました。

更新間隔を1日に変えて作成。

RSSで検索して「すべてのRSSフィード項目を一覧表示します」を選択します。

先ほど取得したURLを張り付けます。

とりあえずテストを実行してみると、大量のフィードが取得できました。

このフローは毎日定時に実行するので、過去24時間分を取得できればよいでしょう。「以降」の項目には24時間前の時間がセットすることにします。以下のようにaddHour関数とutcNow関数を組み合わせました。-24の部分は過去何時間さかのぼるかを指定しています。ニュースによってはこれだと表示されないかもしれないので、テスト中は-1000とか数を増やして確認してみてください。

addHours(utcNow(),-24,'yyyy-MM-dd HH:mm:ssZ')
過去24時間分に絞ったことで、表示されるニュース件数が4項目に減りました。

SharePointに書き出すExcelファイルを用意
あらかじめ、RSSから取得した情報を記録しておくExcelファイルをSharePoint上に用意しておきます。RSSコネクタで取得できた項目のなかで、値が入っていて使えそうなのは,「id」「title」「primayLink」「links」「publishDate」のようです。linksは最初の項目以外はprimaryLinkと同じみたいなので、これに合わせてExcelの列を作ります。

これに合わせてExcelでも列名をつけて、テーブル化します。

テーブル化したら、「テーブルデザイン」を開き、テーブルに名前を付けておきます。今回は「乃木坂RSS」としてみました。

Apply to eachの中にExcel Onlineコネクタを追加する
RSSで取得したデータは複数のアイテムがあって、それぞれのアイテムにタイトルとかリンクとかが含まれている形になっています。なので、まずはApply to eachで繰り返しを作り、そこにRSSからの出力を入れてやります。
さらに、ループの中にExcelコネクタの「表に行を追加」を加えて、先ほど作成したExcelファイルがある場所を指定して、テーブルを指定します。

「詳細オプション」を開くと、あらかじめExcelで作ったテーブルの項目が表示されています。
フィールドのID、フィールドのタイトル、プライマリフィールドリンク、フィードの更新日時をそれぞれの列に設定します。

4件の記事がとれていました。一番最初のIDだけ数字になっているのは、ここだけ複数の記事がまとめられているからみたい。まあ、とりあえず無視してよいかと。


二重投稿を防ぐには?
とりあえず完成はしましたが、もう一回フローを動かしてみると、単純に取得した情報がテーブルの最後に追加されてしまい、二重投稿になります。これは避けたい・・・。

ID(タイトルでもよいかな?)が同じならば追加せず、IDが見つからない時だけ更新してみます。
ループの前に、いちど表内に存在する行の一覧をとり、「選択」をつかってidの部分だけをIDにマップしてやりました。

選択の出力結果はこんな感じ。IDだけがカッコつきですが抽出できました。

次に、ループの中の「表に行を追加」を、条件を満たすときだけ実行するようにしました。

条件の左辺は
string(body('選択'))
条件の右辺は
item()?['id']
にしました。左辺が右辺を含む場合には表に書き込みをせず、まだ表になければ追加するという仕組みです。JSONをstring関数で文字列にしているのはちょっと強引かもしれませんが。
Power Automate楽しい
他にもPower Automateの逆引き辞典のようなものを集めていますので、見てもらえると嬉しいです。
ディスカッション
コメント一覧
まだ、コメントがありません