続・ディスカッション掲示板で返答があったら通知が欲しい

以前─というか2008年1月ですからもう遥か記憶の彼方なのですが、ディスカッション掲示板とワークフローの挙動に関するエントリを書きました。

ディスカッション掲示板に、SharePoint Designer で「アイテム変更時に起動して作成者にメール送信するワークフロー」を適用すると、何故かコメントがついた際にもワークフローが起動して、親アイテム(トピック)の作成者にメール通知が飛ぶ、という内容でした。現象的にはどう見てもバグなのですが、ユーザとしては「コメントが付くと通知される」という意味で、ある意味、有益な仕様でした。

しかし、先日、あるの方から、このエントリの設定をしたがうまく動かない、と情報を頂きました。昔の記憶を掘り起こしつつ、自前環境でもテストしてみると…。本当だ、動きません(汗)

おかしいな~。当時は確かに動いた記憶があるのですが。
というか、いつのまにか Designer で参照設定出来る列項目が増えている?
スレッド?トピック?そんなのありましたっけ?

─どうやら、いつのまにか仕様が変更されていたようです。
そういえば、2008年当時、「エンコードされた絶対URLでメールからスレッドが開ける」という情報を頂きましたが、私の環境ではどうしても駄目だった、なんてこともありました。時期を考えると、SP1、もしくはインフラストラクチャ更新プログラムによるものでしょうか?今となっては、検証しようがないのですが。


そこで、改めて「投稿トピックにコメントあると通知される機能」を実装してみたいと思います。

まず、実は、単純にコメント投稿を知るだけであれば、そもそも標準の「通知」機能だけで可能です。
自分が登録したトピックに通知を設定するだけ。
コメントがあると「○○に対する返信が追加されました」と通知が飛びます。

しかし、この方法では、ユーザは毎回、自分の投稿に対して「通知」を設定する必要があます。
正直、あまり実用的ではありません。
やはり自動で通知が飛んで欲しいところです。

それでは、実際の設計に入ります。

まず、ディスカッション掲示板を用意します。
ここでは dis とします。
さらに、このリストと対になるカスタムリスト tuchi を作成します。
どちらのリストも、ユーザに投稿以上の権限を与えて下さい。

tuchi を設定します。

「タイトル」列の表示名を threadID に変更。 *
添付無効、フォルダ無効、検索無効。 *
列(一行テキスト)threadTTL を作成。既定値なし。
列(集計値)thread46 を作成。式は = LEFT([threadID],46) テキスト形式。
列(集計値)threadLINK を作成。計算式は = “http://server/site/Lists/dis/” & [threadTTL]。
既定のビューのソートを threadID の昇順に。 *

なお、[ * ] の項目は省略可です。

dis に、SharePoint Designer でワークフローを適用します。

名称:disNew
起動:新規
ステップ1:tuchiにアイテムを作成
条件:なし
アクション:
- リストアイテムを作成する
    └ tuchi
    └ threadID 値:現在のアイテム:スレッド(スレッド)
    └ threadTTL 値: 現在のアイテム:ディスカッション タイトル

管理者のトピックに対して、舞黒太郎がコメントすると、tuchi に以下のアイテムが登録されます。

さて、次は tuchi に SharePoint Designer でワークフローを適用します。

名称:tuchiNew
起動:新規
ステップ1:トピック
条件:threadTTL が 空である
アクション:
- ワークフローを停止し Topic をログに記録する
ステップ2:コメント
条件:なし
アクション:
- 電子メールを送信する
    └ 宛先:ワークフロー参照…
        └ ソース : tuchi
        └ フィールド : 作成者
            └ リストアイテムの検索
            └ フィールド : tuchi:threadID
            └ 値 : 現在のアイテム:thread46

メール件名はは適当に。
本文には、以下の参照値を追加しておきます。

・現在のアイテム:作成者
・現在のアイテム:threadLINK

このワークフローを適用した後、先程同様、管理者のトピックに対して舞黒太郎がコメントを投稿すると、ふたつのワークフローが連動し、トピック作成者である「管理者」に通知メールが届きます。

こんな感じです。
もちろん [トピックへのリンク] は dis への有効なリンクになっています。
ワークフローをもう少し工夫すれば、より実用的になるでしょう。
ユーザ名を日本語名にしたり、コメント本文を追加したり、等。

設計は以上です。
この仕組のポイントを簡単にご説明すると threadID と thread46 がミソになります。

threadID(スレッド値)は、文字通りそのディスカッションのスレッドを特定する値です。
トピックは必ず46桁の英数字になります。
コメントの場合、その値を引き継いだ上で、後ろに10桁の英数字が加わります。

また、この仕様は親→子間だけでなく、子→子でも同じであるようです。
SharePointはこの値を利用して、内部的にスレッドの階層を管理しているんですね。
図らずも、理屈は私が以前 Infopath で作成したツリー掲示板と同じでした。

例:
親 0x01CC9A4C1E5AD2A106D4B2424659A371E8CBB779591F
子 0x01CC9A4C1E5AD2A106D4B2424659A371E8CBB779591F00000CBE1F
孫 0x01CC9A4C1E5AD2A106D4B2424659A371E8CBB779591F00000CBE1F0000F7B5E6

従って、この値の先頭から46桁を LEFT 関数で取得すれば、トピックを特定できます。
あとは、そこからトピックの作成者を取得して、メールの宛先に設定すれば通知の完成です。

なお、この例ではリストを二つに分けていますが、この仕様を理解していれば、実は tuchi リストを利用せずに、 dis の内部ですべて完結させることもできます。

ただこの場合、設計がやや煩雑になります。
また、SP2未適用の場合、自己更新によるワークフローのループを考慮する必要もありますので、個人的には、リストを外出しする方法をお薦めします。

ディスカッション掲示板で返答があったら通知が欲しい
ツリー式ディスカッション掲示板を Infopath でつくってみた ver1
ディスカッションリストのアイテムが持つ値は?


これまでのコメント

  1. tama より:

    AGENT: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
    こんばんわ。
    エントリいただきありがとうございます。
    スレッドの部分大変勉強になりました。
    来週早速作ってみたいと思います。(ご報告にあがります!)

  2. tama より:

    AGENT: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.2)
    こんばんわ。
    一通り作ってみて理想どおりの動きができました。
    「返信があったらメイン画面のお知らせに通知」というのをやりたかったので、メール配信の部分をカスタムリストへのitem作成に変えてやりました。
    設計説明、丁寧にしていただきありがとうございました!!

login

Author

中村 和彦(シンプレッソ・コンサルティング株式会社 代表)が「ユーザ視点の SharePoint 情報」を発信します。元大手製造業 SharePoint 運用担当。現SharePoint コンサルタント。お仕事のお問い合わせはこちらまでお願いします。当ブログにおける発信内容は個人に帰属し所属組織の公式発信/見解ではありません。
FB : 中村 和彦
blog: Be・Better!
MS MVP SharePoint 2009/10-2011/9
MS MVP Office 365 2012/10-2014/9