SharePoint Designer を利用してワークフローを作成した場合、リスト アイテムの更新者などの部署名や役職などの情報を利用したいと思うことも時々あるかと思います。もちろん、これらの情報が SharePoint のユーザー プロファイルに設定されていることが前提となるのですが、「SharePoint 2013 ワークフロー」では SharePoint REST API を利用することが可能ですので、この REST API 経由でユーザー プロファイルのすべての値を利用することができます。今回は、そうした SharePoint REST API をワークフローから呼び出して、ユーザー プロファイルを利用する方法について書きたいと思います。

SharePoint 2013 ワークフローから REST API を呼び出すための「HTTP Web サービスを呼び出す」アクションの利用方法は、以前の記事をご確認ください。

SharePoint 2013 ワークフローの「HTTP Web サービスを呼び出す」アクションを試してみる (前編)
http://idea.tostring.jp/?p=1651

SharePoint 2013 ワークフローの「HTTP Web サービスを呼び出す」アクションを試してみる (後編)
http://idea.tostring.jp/?p=1677

ワークフロー作成前の事前準備

SharePoint 2013 ワークフローから SharePoint REST API を利用してユーザー プロファイルの値を利用するためには、ワークフローに対して REST API を呼び出す権限を与える必要があります。

おおよその手順は、MSDN の下記の記事にまとめられていますので、ここでは概要のみ簡単にご紹介します。

SharePoint 2013 ワークフロー プラットフォームを使用した引き上げられた権限でのワークフローの作成
https://msdn.microsoft.com/ja-jp/library/office/jj822159.aspx

  1. まずは、ワークフローを作成したいサイトで [サイトの設定]-[サイト機能の管理] のなかにある「ワークフローでアプリの権限を使える」をアクティブ化します。
  2. つぎに、[サイトの設定]-[サイト アプリの権限] を開き、ワークフローの「アプリ ID」を確認します。この時必要になるのは、「| と @ の間」の文字列です。
  3. 最後に、http(s)://<Server Name>/<Site Collection>/_layouts/15/appinv.aspx を開き、先ほどのアプリ ID を利用し、ワークフローの権限を設定します。

ユーザー プロファイルを取得する REST API を呼び出すためには、ここでユーザー プロファイルに対しての「読み取り」権限も付与する必要があります。そのため、「権限の要求 XML」に指定する XML は下記のようになります。

<AppPermissionRequests>
  <AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="FullControl" />
  <AppPermissionRequest Scope="http://sharepoint/social/tenant" Right="Read" />
</AppPermissionRequests>

MSDN の記載との違いは、3 行目に追加している部分です。これにより、ユーザー プロファイルに対して「読み取り」権限が付与されます。

<AppPermissionRequest Scope="http://sharepoint/social/tenant" Right="Read" />

この設定で作成を押すと、下図のような画面がでますので「ユーザー プロファイルへのアプリケーションのアクセスを許可: 読み取り」が表示されていることを確認し、「信頼する」をクリックして終わりです。

ワークフローを作成する

今回作成するワークフローは、『リスト アイテムの登録者の部署名を「登録者の部署名」列に文字列として入れる』というものにしたいと思います。

下図のように、一行テキスト列を追加したリストを用意しました。

それでは、SharePoint Designer 2013 を起動し、対象のリストに対して「SharePoint 2013 ワークフロー」の作成画面を開きます。ここの手順は省略します。先ほどの MSDN の記事をご参考に操作を行ってください。

プロファイルを取得したいユーザーのログイン名を取得する

まずは、SharePoint REST API を呼び出すための準備として、ユーザー プロファイルを取得したいユーザーのログイン名をワークフローのローカル変数に格納します。アクションの中から「ワークフローの変数を設定する」アクションを追加します。

「ワークフロー変数」には、「新しい変数の作成」から文字列型の変数を作成しセットします。「値」には、[fx] ボタンから下図のように設定して「ログイン名」を取得します。

この時に取得されるログイン名は、クレーム ID の場合(SharePoint Online のときも)「i:0#.w|membership|account@domain.com」のような形式になっています。ここに「#」があると REST API 呼び出しでエラーになりますので、エンコード文字列の「%23」に置換しておきます。

文字列の置換を行うためには、「文字列内のサブ文字列を置換する」アクションですね。下図のように設定しました。

SharePoint REST API を利用してユーザー プロファイルを取得する

次に、いよいよ REST API の呼び出しを行います。ここで「アプリ ステップ」を利用して SharePoint REST API を呼び出します。リボンメニューから [アプリ ステップ] をクリックしましょう。

そうすると、「アプリ ステップ」がステージに追加されますので、ここに「HTTP Web サービスを呼び出す」アクションを追加します。ここまでの手順では、下図のようになります。

いろいろと設定ができるように見えますが、今回必要な設定は、「この」と「応答」です。

「この」の設定では、REST API のアドレスを設定します。ユーザー プロファイルから部署名を取得するには、下記のように記述する必要があります。

http(s)://<Server Name>/<Site Collection>/_api/SP.UserProfiles.PeopleManager/GetUserProfilePropertyFor(accountName=@v,propertyName=’Department’)?@v='<Login Name>’

最後のログイン ユーザー名の指定のところに、先ほど変数に入れたログイン ユーザー名を指定します。設定は、下図のようになります。

また、propertyName を変えるとユーザー プロファイルの他の値も取得できます。取得したい値の propertyName は、次のページなどにまとまっていました。

既定のユーザー プロファイル プロパティ (SharePoint Server 2010)
https://technet.microsoft.com/ja-jp/library/hh147513.aspx

「応答」には、辞書型の変数を作成しセットしておきます。「HTTP Web サービスを呼び出す」の設定はこれで終了です。

SharePoint REST API からの戻り値を利用して値をセットする

次に、「辞書からアイテムを取得する」アクションを利用して、REST API からの戻り値から部署名を取り出します。ここでの値の取り出し方は、始めにご紹介した以前の記事をご参照頂ければと思いますが、今回の場合、値のパスは「value」で取り出せます。また、合わせて「リスト アイテムを更新する」アクションで目的の列に値をセットし、「ステージに移行」に「ワークフローの最後 に移動する」を設定したら完成です。

完成したワークフローは、下図のようになっています。

さて、作成したワークフローを発行し、動作を確認してみましょう。

動作確認

まずは、「登録者の部署名」が空白の状態でアイテムを登録します。

その後、今回作成したワークフローが実行されると、ユーザー プロファイルの部署名が自動的に入力されます。

無事に動作してよかったです。

さいごに

少々開発者寄りの知識は必要になりますが、今回の方法をマスターしておくと、ユーザー プロファイルの値を様々なワークフロー内で活用できるようになります。その他にも、今回の方法を応用し、SharePoint REST API をうまく利用することで、より高度な処理もワークフローで自動化できます。SharePoint Online では、Microsoft Flow や PowerApps などの新たな機能も出てきていますが、オンプレミスを含めてまだまだワークフローの活用機会はあると思います。そうした場合には、ぜひご参考にしていただけたらと思います。

今回は記事が長くなってしまいました。おつかれさまでした。