SharePoint Online のモダンサイトには「ニュース」という機能があります。このニュースが投稿されたときに、Power Automate のフローを実行したいといったことがあると思います。

たとえば、ニュースが投稿されたら通知として誰かに自動的にメールを送るとか、自動的にチームに投稿するとかそういった用途が考えられます。

しかしながら Power Automate の SharePoint コネクタには、ニュースの投稿で実行されるトリガーが用意されていないので、用意されているトリガーを利用してあれこれと設定で上手い具合に工夫してみました。

不完全版としているのは、うまく実行されない場合があるからです。ただし運用の工夫次第で十分使えると思ったので、メモを公開しておきます。

ファイルが作成または変更されたとき (プロパティのみ) トリガーを利用する

SharePoint のニュースは、新しい記事が作成されると「サイトのページ」というライブラリの中にページファイルが作成されます。そのため、ニュースが作成されたかを検知するためには、あたらしいファイルが作成されたかどうかを検知すれば良いわけです。

トリガーの設定

ただし、今回の用途で利用する場合、このトリガーには大きな問題があります。それは「ライブラリ名」の設定で「サイトのページ」ライブラリが選択できないという問題です。

さてどうしましょうか…、対策は単純です。「カスタム値の入力」を選択し、「サイトのページ」と入力しましょう。これだけで大丈夫です。

「サイトのページ」はライブラリ名なので、もしも日本語以外の言語でサイトを作成している場合は、その言語のライブラリ名を入力する必要があります。

トリガーの条件の設定

もう一つこのトリガーには大きな問題があります。それはニュースの下書きが作成されたタイミングでもトリガーが動作してしまうことです。これでは無駄に何回もフローが実行されてしまいます。

そこで、「トリガーの条件」という設定を行います。まずはトリガーの右上にある「・・・」をクリックし、「設定」をクリックしましょう。

すると、トリガーの設定に表示が変わりますが、ここの一番下にあるのが「トリガーの条件」の設定です。トリガーはここに設定した条件を満たさない限り実行されなくなります。

それでは設定していきましょう。「追加」をクリックし、次の式を入力します。

@equals(triggerBody()?['PromotedState'],2.0)

そうしたらもう一度「追加」をクリックし、さらに次の式を入力します。

@equals(mod(float(triggerBody()?['{VersionNumber}']),1.0),0)

ちょっと解説していきましょう。

最初の条件式は、あらたに作成されたページが投稿済みのニュースであるかどうかを判定しています。サイトのページ ライブラリには「昇格した状態」という列が用意されており、次のような値を取ります。

昇格した状態の値ページの状態
0ニュース以外のページ
1「ニュースを投稿する」ボタンが押される前の状態
2「ニュースを投稿する」ボタンが押された後の状態

つまりは、ニュースの作成を開始し、「ニュースを投稿する」ボタンを押すまでは「1」となり、投稿ボタンが押されたら「2」になります。

そのため、ひとつめのトリガーの条件を利用して、そのページが投稿されたニュースかどうかを判定しています。

2 番目の条件式は、ニュースが更新されたときに必要な条件です。ニュースを更新する場合には、更新の下書きを作成するとページのマイナーバージョンが増えていきます。たとえば 1.1、1.2、1.3 のような感じですね。そして「ニュースの更新」ボタンが押されるとメジャーバージョンが増えて 2.0 となります。この条件式では、ページがメジャーバージョンであるかどうかを判定しています。

方法としては単純で、バージョン番号の情報を 1 で割り、余りが 0 かどうかを調べています。0 ならメジャーバージョンですよね。(float 関数を利用しているのは、バージョン番号は数値ではなく文字列のため、余剰計算するためには数値型に変換する必要があるためです)

これらのトリガーの条件を設定することによって、ページがニュースであるとき、かつ、ページがメジャーバージョンであるときにのみ、このトリガーが実行されるという設定になっています。

ちなみに、新しく投稿されたときだけ実行できれば良いよということであれば、条件式は次のようになります。

@equals(triggerBody()?['{VersionNumber}'],'1.0')

このあたりは目的や用途に応じて変えましょう。

アクションの設定

トリガーが設定できたら、あとはメールを送るなり、チームに投稿するなりのアクションを設定しましょう。たとえば次のように設定できます。

本文のところは次のように設定しています。

<div style="border:1px solid #d0d0d0;background:white;border-radius:2px;padding:12px">
  <div>
    <div style="font-size:1.6em;font-weight:bold">
      <a href="@{triggerOutputs()?['body/{Link}']}" target="_blank">@{triggerOutputs()?['body/Title']}</a>
    </div>
    <div style="font-size:0.8em">
      @{convertFromUtc(triggerOutputs()?['body/Modified'],'Tokyo Standard Time', 'yyyy/MM/dd HH:mm:ss')} / @{triggerOutputs()?['body/Editor/DisplayName']}
    </div>
    <div>
      <p style="margin:1em 0">@{triggerOutputs()?['body/Description']}</p>
    </div>
  </div>
</div>

これが実行されると次のようにチームに投稿されます。

それっぽくできましたね。

不完全版なわけ

さて、不完全版としているわけですが、トリガーがうまく実行されないパターンがあるからです。そのパターンとは次のようなときです。

  1. ページとして作成する
  2. ページを発行する
  3. 「レベル上げ」から「このサイトのニュースとして投稿」を選択する

この操作を行ってニュースを投稿した場合には、どうやらページのファイル自体は更新されず(更新日時が変わらない)、トリガーを実行することができないようでした…。

回避策としては、ニュースは必ずはじめからニュースとして投稿してもらうか、ページからレベル上げをする場合には、ニュースにレベル上げしたあとで、記事を編集モードにして「ニュースの更新」をクリックしてもらうかなどが考えられます。

まあ、このくらいであれば、なんとか運用が回るかなという感じですかね。

さいごに

以前から良く利用されている SharePoint のお知らせリストでも、新しい記事が投稿されたときにメールで通知を送りたいといった要望は良くありました。

ちょっとややこしい設定が必要にはなりますが、ニュースを利用した場合でも Power Automate を利用して同じようなことが可能になります。しかも Power Automate ならメール以外にも Microsoft Teams にも通知として自動投稿が可能になりますね。

ぜひ試してみてください!そして、不完全版とした部分について、解決策を見つけたという方がいましたら教えてください!