MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

SharePoint News に購読機能を追加する - 購読者管理とメールでの通知

はじめに

組織内のチームで定期的にニュースやブログを投稿している場合、一般のブログサービスのように購読者(ブログやニュースに興味のあるユーザー)に対して自動的にニュース・ブログの通知を送りたいという要望があります。

SharePoint OnlineではメールやYammerへの投稿を通じてサイトに作成されたニュースをお知らせする機能がありますが、これはユーザーが手動で行う必要があり、新規投稿の自動通知のような機能ではありません。

あるいは、定期的に配信されるニュースダイジェストの機能もOffice 365では提供されていますが、これはMicrosoft Graphによって決定されるもので、購読者自身がサイトを指定できない点で、希望するものと多少異なります。

Automatically sending news post digests with branding - Microsoft Support

このような不満点を解消する、比較的簡単な方法をご紹介します。もちろんこのブログで紹介するのでPower Automateを利用しますが。

購読者管理

まずは対象となるユーザー (= 購読者) の管理を考えます。

これは、例えばFormsや、メールでの依頼など、何を使ってもよいですが、ユーザーが手軽に購読のON/OFFをできるよう、今回はSharePoint リストのView formattingを使います。

下図のようなリストを作成します。プレーンなリストに対して、subscribers という名前の 人またはグループ列を追加します。 この時、複数の人を追加できるようにチェックしておきます。

アイテムを適当なタイトルで追加して、ビューの書式設定に以下のJSONを設定します。

{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json",
  "hideSelection": true,
  "hideColumnHeader": true,
  "rowFormatter": {
    "elmType": "div",
    "children": [
      {
        "elmType": "div",
        "style": {
          "text-align": "left"
        },
        "children": [
          {
            "elmType": "div",
            "attributes": {
              "class": "sp-row-title"
            },
            "txtContent": "Click button to subscribe to this blog and receive notifications of new posts by email. "
          },
          {
            "elmType": "button",
            "customRowAction": {
              "action": "setValue",
              "actionInput": {
                "subscribers": "= if(indexOf(join([$subscribers.email],';'),@me) == -1, appendTo([$subscribers],@me), removeFrom([$subscribers],@me))"
              }
            },
            "txtContent": "=if(indexOf(join([$subscribers.email],';'),@me) == -1, 'subscribe', 'unsubscribe')"
          }
        ]
      }
    ]
  }
}

ここではボタンを表示して、それをクリックすることで表示中のユーザーを sunscribers 列に追加・削除するようなアクションを設定しています。 (actionInput 部分)

ビューを保存すると以下のような表示になります。ボタンを押して動作を確認してみましょう。

あとはこのリストをサイトページ上に貼り付けるだけです。

注意: このリストは購読者により更新できる必要があります。このリストには必ず投稿権限を付与してください。

ニュース投稿の通知機能

リストで管理される購読者に対してニュースの新着通知をメールで行います。これにはまさにニュースのメールでのお知らせに使われているAPIを利用します。

このAPIは、画面に表示されているように、メール送信対象になるユーザー(複数)と通知に表示するコメントを指定できます。

SharePoint API の実行には Power Automate の 「SharePointへのHTTP要求」アクションを利用します。この時、アクションのインプットにメールの送信先とメッセージ (オプション) と、通知するページのURLが必要になります。

{
  "message": "読んでね",
  "recipientEmails": [
    "nagao@contoso.com",
    "hiro3@contoso.com"
  ],
  "subject": "",
  "url": "https://contoso.sharepoint.com/sites/JPPUG_demo/SitePages/TestNews.aspx"
}

このようなJSONを構成するわけですが、recipientEmails は購読者を管理しているSharePointリストのアイテムから取得できます。またurl は、ファイルプロパティを取得するアクションで確認することができます。

これを踏まえて、全体のフローは以下のようになります。

特に注意が必要な①と②を詳しく見ていきましょう。

①の部分では、ニュース投稿の検出と投稿されたページの詳細を取得しています。

ニュースは Site Pages の中にページが追加されるので、フローのトリガーには「ファイルが作成されたとき」を使います。

ただし、標準ではSite Pagesは候補となるライブラリの一覧には表示されないので、手入力する必要があります。

続く「ファイルのプロパティ取得」アクションでも同様に、対象となるライブラリにはSite Pagesをカスタム値として指定します。

これでSite Pagesの中にファイルが作成されたときにフローを実行することができます。

ただ、Site Pagesに追加されるファイル(ページ)はニュースだけではありません。普通にサイトページを作成されてもフローが実行されてしまいます。 ニュース以外のページ追加をフィルターするのが②の部分です。

発行されたニュースでは、ページのプロパティにある PromotedState の値が 2 に設定されます。これを利用して条件分岐を追加します。 正常に前段までのアクションが実行できていれば動的コンテンツ内に PromotedState が表示されます。 条件分岐では PromotedState is equal to 2となるように入力を設定します。

条件に当てはまったらあとはSharePoint の APIを実行するだけです。

以上のようなフローによって、購読者に対して新規のニュースを自動でお知らせすることができます。

通知のメールにはToに受信者がすべて表示されてしまうので、それを避けたい場合にはApply to eachで個別に送信しましょう。※その場合もrecipientEmailsは配列型である点に注意してください。

付録

今回の方法では通知方法として SharePoint上で行うのと同等のAPIを利用しましたが、もしメールを送りたい場合(例えばグループのメールアドレスから送りたいような場合)には Exchange Onlineのメール送信アクションを利用するとよいでしょう。 その場合は以下のブログを参考にしてください。

collab365.com