Share via


自動タグ付けサンプル アドイン (SharePoint)

ECM.AutoTagging サンプルは、プロバイダー ホスト型アドインを使用して、SharePoint ライブラリに追加されたコンテンツに (カスタム ユーザー プロファイルのプロパティをソースとするデータを使って) 自動的にタグを付ける方法を示しています。

このアドインは、Azure Web サイトでホストされるリモート イベント レシーバーを使用して、以下のことを行います。

  • フィールド、コンテンツ タイプ、およびドキュメント ライブラリを作成します。
  • カスタムのユーザー プロファイル プロパティの値を取得します。
  • 分類フィールドを設定します。

以下を行う場合は、このソリューションを使用します。

  • SharePoint Online にイベント レシーバーを実装します。
  • コンテンツの作成時に追加のメタデータを付加して、検索結果を改善します。
  • コンテンツを分類します。
  • SharePoint の最新バージョンに移行する前にコードを最新の状態にしてください。お客様は過去にイベント レシーバーを使用されたことがあります。

はじめに

まず、ECM.AutoTagging のサンプル アドインを GitHub 上の Office 365 Developer パターンおよびプラクティス プロジェクトからダウンロードしてください。

注:

この記事で提供されるコードは、明示または黙示のいかなる種類の保証なしに現状のまま提供されるものであり、特定目的への適合性、商品性、権利侵害の不存在についての暗黙的な保証は一切ありません。

このアドインを実行する前に、次の手順を実行します。

  1. Azure Web サイトを作成してから、そこに ECM.AutoTaggingWeb プロジェクトを展開します。

  2. Office 365 の Appregnew.aspx ページを使用してアドインを登録します。

  3. このアドインは、アプリ専用のアクセス許可を使用します。 Office 365 の AppInv.aspx ページを使用して、アプリ専用のアクセス許可を割り当てる必要があります。 次の図に示すように、AppInv.aspx ページで、AppManifest.xml ファイルから [アクセス許可要求 XML] ボックスに次の XML をコピーします。

       <AppPermissionRequests AllowAppOnlyPolicy="true">
         <AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl" />
         <AppPermissionRequest Scope="http://sharepoint/taxonomy" Right="Read" />
         <AppPermissionRequest Scope="http://sharepoint/social/tenant" Right="Read" />
       </AppPermissionRequests>
    

    アプリ ID と [アクセス許可要求 XML] ボックスが強調表示されている AppInv.aspx ページのスクリーン ショット

  4. ECM.AutoTaggingWeb プロジェクトの ReceiverHelper.cs ファイルの CreateEventReciever メソッドにおいて、Azure Web サイトの URL で ReceiverUrl プロパティを更新します。

         public static EventReceiverDefinitionCreationInformation CreateEventReciever(string receiverName, EventReceiverType type)
             {
    
                 EventReceiverDefinitionCreationInformation _rer = new EventReceiverDefinitionCreationInformation();
                 _rer.EventType = type;
                 _rer.ReceiverName = receiverName;
                 _rer.ReceiverClass = "ECM.AutoTaggingWeb.Services.AutoTaggingService";
                 _rer.ReceiverUrl = "https://<Your domain>.azurewebsites.net/Services/AutoTaggingService.svc";
                 _rer.Synchronization = EventReceiverSynchronization.Synchronous;
                 return _rer;
             }
    
    

  5. アドインをパッケージ化して展開します。

アドインを開始すると、次の図に示すように、ドキュメント自動タグ付けプロバイダー ホスト型アドインのスタート ページが表示されます。 このスタート ページには、イベント レシーバーを割り当てたり削除したりする前に実行する必要がある追加の構成手順が表示されます。

3 つのセットアップ手順が強調表示された自動タグ付けアドイン スタート ページのスクリーン ショット。

ECM.Autotagging サンプル アドインを使用する

このサンプルでは、リモート イベント レシーバーを使用して、ドキュメント ライブラリに追加されたドキュメントに自動的にタグ付け、つまりメタデータの追加を行います (カスタム ユーザー プロファイル プロパティのデータを使用)。

リモート イベント レシーバーを使用してドキュメントに自動的にタグを付けるためのプロセス フローを次の図に示します。

ライブラリ内のドキュメントにタグ付けする手順の図。ユーザーがコンテンツを作成する際、アドインはイベント レシーバーとコンタクトをとり、イベント レシーバーはユーザーのプロファイルにアクセスして情報を SharePoint に送信します。

リモート イベント レシーバーを使用して、ドキュメント ライブラリ内に新規作成されたドキュメントにメタデータを割り当てるには、以下を実行します。

  1. ユーザーが新しいコンテンツを作成するか、ドキュメント ライブラリにアップロードします。 リモート イベント レシーバーが割り当てられて、このドキュメント ライブラリに対する ItemAdding イベントまたは ItemAdded イベントを処理します。

  2. ItemAdding メソッドまたは ItemAdded メソッドが、リモート イベント レシーバーへの呼び出しを実行します。

  3. プロバイダー ホスト型アドインが、そのユーザーの SharePoint User Profile Service のカスタム ユーザー プロファイル プロパティの値を取得します。 このサンプル アドインでは、以前追加された Classification カスタム ユーザー プロファイル プロパティが取得されます。

  4. リモート イベント レシーバーが、そのユーザーのカスタム ユーザー プロファイル プロパティの値で新しいドキュメント上のメタデータを更新します。

[シナリオ 1 の実行] ボタン

[シナリオ 1 の実行] ボタンを選択すると、アドインは以下を実行します。

  1. ドキュメント ライブラリを作成します。

  2. ItemAdding イベント用にリモート イベント レシーバーを作成する。

    注:

    この記事では、ItemAdding イベント レシーバー タイプについて説明します。 一般に、ItemAdding イベント レシーバー タイプは、ItemAdded イベント レシーバー タイプよりもパフォーマンスが優れています。 ECM.Autotagging サンプルは、ItemAdding イベント レシーバー タイプと ItemAdded イベント レシーバー タイプの両方のコードを提供します。

  3. ドキュメント ライブラリにリモート イベント レシーバーを追加します。

ECM.AutoTaggingWeb プロジェクトの Default.aspx.cs ページの btnScenario1_Click メソッド内の次のコードがこれらの手順を示しています。

protected void btnScenario1_Click(object sender, EventArgs e)
        {
            var _libraryToCreate = this.GetLibaryInformationItemAdding();
 
            var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
            using (var ctx = spContext.CreateUserClientContextForSPHost())
            {
                try 
                { 
                    if(!ctx.Web.ListExists(_libraryToCreate.Title))
                    {
                        ScenarioHandler _scenario = new ScenarioHandler();
                        _scenario.CreateContosoDocumentLibrary(ctx, _libraryToCreate);
                    }
                    List _list = ctx.Web.Lists.GetByTitle(_libraryToCreate.Title);
                    EventReceiverDefinitionCreationInformation _rec = ReceiverHelper.CreateEventReciever(ScenarioHandler.AUTOTAGGING_ITEM_ADDING_RERNAME, EventReceiverType.ItemAdding);
                    ReceiverHelper.AddEventReceiver(ctx, _list, _rec);
                }
                catch(Exception _ex)
                {

                }
            }
        }  

CreateContosoDocumentLibrary メソッドに対する呼び出しが実行されます。 ScenarioHandler.cs ファイル内の次のコードは、OfficeDevPnP.Core からのメソッドを使用して、カスタム コンテンツ タイプのカスタム ドキュメント ライブラリを作成します。 ドキュメント ライブラリ内の既定のコンテンツ タイプが削除されます。

public void CreateContosoDocumentLibrary(ClientContext ctx, Library library)
        {
            // Check the fields.
            if (!ctx.Web.FieldExistsById(FLD_CLASSIFICATION_ID))
            {
                ctx.Web.CreateTaxonomyField(FLD_CLASSIFICATION_ID,
                                            FLD_CLASSIFICATION_INTERNAL_NAME,
                                            FLD_CLASSIFICATION_DISPLAY_NAME,
                                            FIELDS_GROUP_NAME,
                                            TAXONOMY_GROUP,
                                            TAXONOMY_TERMSET_CLASSIFICATION_NAME);
            }

            // Check the content type.
            if (!ctx.Web.ContentTypeExistsById(CONTOSODOCUMENT_CT_ID))
            {
                ctx.Web.CreateContentType(CONTOSODOCUMENT_CT_NAME,
                                          CT_DESC, CONTOSODOCUMENT_CT_ID,
                                          CT_GROUP);
            }

            // Associate fields to content types.
            if (!ctx.Web.FieldExistsByNameInContentType(CONTOSODOCUMENT_CT_NAME, FLD_CLASSIFICATION_INTERNAL_NAME))
            {
                ctx.Web.AddFieldToContentTypeById(CONTOSODOCUMENT_CT_ID,
                                                  FLD_CLASSIFICATION_ID.ToString(),
                                                  false);
            }

            
            CreateLibrary(ctx, library, CONTOSODOCUMENT_CT_ID);
        }

private void CreateLibrary(ClientContext ctx, Library library, string associateContentTypeID)
        {
            if (!ctx.Web.ListExists(library.Title))
            {
                ctx.Web.AddList(ListTemplateType.DocumentLibrary, library.Title, false);
                List _list = ctx.Web.GetListByTitle(library.Title);
                if (!string.IsNullOrEmpty(library.Description))
                {
                    _list.Description = library.Description;
                }

                if (library.VerisioningEnabled)
                {
                    _list.EnableVersioning = true;
                }

                _list.ContentTypesEnabled = true;
                _list.RemoveContentTypeByName("Document");
                _list.Update();
                
     
                ctx.Web.AddContentTypeToListById(library.Title, associateContentTypeID, true);
                ctx.Web.Context.ExecuteQuery();
               
            }
            else
            {
                throw new Exception("A list, survey, discussion board, or document library with the specified title already exists in this website.  Please choose another title.");
            }
        }

このコードの実行後に、AutoTaggingSampleItemAdding ドキュメント ライブラリがサイト コンテンツ 4 に作成されます。

新しい AutoTaggingSampleItemAdd ドキュメント ライブラリが含まれる [サイト コンテンツ] ページのスクリーン ショット。


ECM.AutoTaggingWeb プロジェクトでは、ReceiverHelper.cs ファイル内の CreateEventReciever メソッドが、ItemAdding イベント レシーバーの定義を作成します。 ECM.AutoTaggingWeb プロジェクトでは、Services フォルダーに、AutoTaggingService.svc という名前の Web サービスが含まれています。 ECM.AutoTaggingWeb プロジェクトを Azure Web サイトに発行すると、この Web サービスもサイトに展開されました。 CreateEventReciever メソッドが、ドキュメント ライブラリでこの Web サービスをリモート イベント レシーバーとして割り当てます。

CreateEventReciever メソッドの次のコードは、Web サービスをリモート イベント レシーバーに割り当てる方法を示しています。

public static EventReceiverDefinitionCreationInformation CreateEventReciever(string receiverName, EventReceiverType type)
        {

            EventReceiverDefinitionCreationInformation _rer = new EventReceiverDefinitionCreationInformation();
            _rer.EventType = type;
            _rer.ReceiverName = receiverName;
            _rer.ReceiverClass = "ECM.AutoTaggingWeb.Services.AutoTaggingService";
            _rer.ReceiverUrl = "https://<Your domain>.azurewebsites.net/Services/AutoTaggingService.svc";
            _rer.Synchronization = EventReceiverSynchronization.Synchronous;
            return _rer;
        }


AddEventReceiver メソッドの次のコードは、リモート イベント レシーバーをドキュメント ライブラリに割り当てます。

public static void AddEventReceiver(ClientContext ctx, List list, EventReceiverDefinitionCreationInformation eventReceiverInfo)
        {
            if (!DoesEventReceiverExistByName(ctx, list, eventReceiverInfo.ReceiverName))
            {
                list.EventReceivers.Add(eventReceiverInfo);
                ctx.ExecuteQuery();
            }
        }


これで、リモート イベント レシーバーがドキュメント ライブラリに追加されます。 ドキュメントを AutoTaggingSampleItemAdding ドキュメント ライブラリにアップロードすると、ドキュメントがそのユーザーの Classification カスタム ユーザー プロファイル プロパティの値でタグ付けされます。

次の図は、ドキュメントにプロパティを表示する方法を示しています。

プロパティが展開された状態のライブラリ内のテスト ドキュメントのスクリーン ショット。


次の図は、[分類] フィールドを伴う、ドキュメントのメタデータを示しています。

[分類] フィールドに HBI が入っているテスト ドキュメントのメタデータを示すスクリーン ショット。


AutoTaggingService.svc.cs ファイル内の HandleAutoTaggingItemAdding メソッドは、GetProfilePropertyFor メソッドを使用して、Classification ユーザー プロファイル プロパティの値を取得します。

public void HandleAutoTaggingItemAdding(SPRemoteEventProperties properties,SPRemoteEventResult result)
        {
            using (ClientContext ctx = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
            {
                if (ctx != null)
                {
                    var itemProperties = properties.ItemEventProperties;
                    var _userLoginName = properties.ItemEventProperties.UserLoginName;
                    var _afterProperites = itemProperties.AfterProperties;
                    if(!_afterProperites.ContainsKey(ScenarioHandler.FLD_CLASSIFICATION_INTERNAL_NAME))
                    {
                        string _classficationToSet = ProfileHelper.GetProfilePropertyFor(ctx, _userLoginName, Constants.UPA_CLASSIFICATION_PROPERTY);
                        if(!string.IsNullOrEmpty(_classficationToSet))
                        { 
                            var _formatTaxonomy = AutoTaggingHelper.GetTaxonomyFormat(ctx, _classficationToSet);
                            result.ChangedItemProperties.Add(ScenarioHandler.FLD_CLASSIFICATION_INTERNAL_NAME, _formatTaxonomy);
                        }
                    }
                }
            }
        }


> [!重要] > **GetProfilePropertyFor** メソッドから **Classification** 値を取得した後、**Classification** の値を特定の方法で書式設定してから、ドキュメントにメタデータとして格納する必要があります。 AutoTaggingHelper.cs ファイルの **GetTaxonomyFormat** メソッドは、**Classification** 値を書式設定する方法を示しています。
public static string GetTaxonomyFormat(ClientContext ctx, string term)
        { 
            if(string.IsNullOrEmpty(term))
            {
                throw new ArgumentException(string.Format(EXCEPTION_MSG_INVALID_ARG, "term"));
            }
            string _result = string.Empty;
            var _list = ctx.Web.Lists.GetByTitle(TAXONOMY_HIDDEN_LIST_NAME);
            CamlQuery _caml = new CamlQuery();

            _caml.ViewXml = string.Format(TAXONOMY_CAML_QRY, term);
            var _listItemCollection = _list.GetItems(_caml);

            ctx.Load(_listItemCollection,
                eachItem => eachItem.Include(
                    item => item,
                    item => item.Id,
                    item => item[TAXONOMY_FIELDS_IDFORTERM]));
            ctx.ExecuteQuery();

            if (_listItemCollection.Count > 0)
            {
                var _item = _listItemCollection.FirstOrDefault();
                var _wssId = _item.Id;
                var _termId = _item[TAXONOMY_FIELDS_IDFORTERM].ToString(); ;
                _result = string.Format(TAXONOMY_FORMATED_STRING, _wssId, term, _termId);
            }

            return _result;
        }

[イベント シナリオ 1 の削除] ボタン

[イベント シナリオ 1 の削除] ボタンを選択すると、次のコードが実行されて、ドキュメント ライブラリからイベント レシーバーが削除されます。

public static void RemoveEventReceiver(ClientContext ctx, List list, string receiverName)
        {
            ctx.Load(list, lib => lib.EventReceivers);
            ctx.ExecuteQuery();

            var _rer = list.EventReceivers.Where(e => e.ReceiverName == receiverName).FirstOrDefault();
            if(_rer != null)
            {
                _rer.DeleteObject();
                ctx.ExecuteQuery();
            }
        }

関連項目