SharePoint のサイトを作っていくと、他のサイト コレクションのリストに保存された情報などをページに表示したいということがあります。例えば、とあるワークフローが他のサイト コレクションにある場合、そのワークフローにより割り当てられるタスクが格納されるリストの新着アイテムを表示したいなどです。ほかにも他のサイト コレクションのお知らせリストの新着アイテムを表示できても良いですね。

しかしながら、SharePoint の標準機能におけるリストに格納されたデータの利用・表示範囲はサイトの単位になっているため、その更に上位のサイト コレクションが異なる場合にはもちろん利用できません。何か方法はないものかと、試しに SharePoint の JavaScript API で試してみたところ実現できそうだったので投稿します。

今回の記事では、SharePoint Online にて動作確認を行っています。SharePoint Online では全てのサイト コレクションが「<tenant>.sharepoint.com」の配下に作成され、クロスドメイン制約に該当しないことも重要な点かなと思います。

クライアント コンテキストの取得

試してみたところ、他のサイト コレクションの情報を扱うには、クライアント コンテキストの取得時に他のサイト コレクションの URL を指定するだけでした。
JavaScript API(JavaScript Object Model)自体については、下記の記事にサンプルが記載されています。

SharePoint JSOM を使用したアイテムの CRUD 方法
http://blogs.technet.com/b/sharepoint_support/archive/2014/11/15/sharepoint-jsom-crud.aspx

クライアント コンテキストの取得は、通常は既にインスタンス化された SP.ClientContext から get_current() を指定して取得するか、new 演算子を使用してサイトの URL を指定して新たに作成します。

var ctx = SP.ClientContext.get_current();
var ctx = new SP.ClientContext("<サイトの URL>");

実は後者の方法は、他のサイト コレクションの URL を指定しても有効であることがわかったというのが今回の件です。

さっそく試してみる

今回は、別のサイト コレクションに「お知らせ」リストを作成し、また別のサイト コレクションに JavaScript を仕込み情報を取得してみました。表示に関しては、SharePoint の標準リスト Web パーツの HTML タグ構造を参考にして表示を整えてみました。

こちらが、実際の他のサイト コレクションに作成されたリストに登録されたアイテム。

20150324-1

こちらが、JavaScript により情報を取得して表示したもの。キャプチャだとわかりづらいですね…。

20150324-2

JavaScript の動作は、SharePoint へアクセスしているユーザーのコンテキストで実行されるため、他のサイト コレクションの取得対象のアイテムへも権限を有する必要があります。

さいごに

他のサイト コレクションの情報を表示できるということで、ポータルの設計においては幅が大きく広がりました。今回の検証では、オンプレミスの環境を用意できていないため試せていないのですが、もしもオンプレミスでも検証された方が居ましたら結果を教えていただけると嬉しいです。