locked
SharePoint Online アンケートフォーム内でのClientContext取得ができません RRS feed

  • 質問

  • お世話になります。

    SharePoint Online のアンケートリストの入力フォーム内で、回答者の氏名を取得したいと思っております。

    NewForm.aspx にスクリプトエディタでJavaScriptを作成し、以下のコードでユーザプロファイルを取得しようとしていますが、SP.ClientContext が undefined になり、値が取得できません。


        function getMyProfileProperty(strPropName){
            SP.SOD.executeFunc('userprofile', 'SP.UserProfiles', function(){
                var clientContext = new SP.ClientContext.get_current();
                var peopleManager = new SP.UserProfiles.PeopleManager(clientContext);
                var myProperties = peopleManager.getMyProperties();
                clientContext.load(myProperties);
                clientContext.executeQueryAsync(
                    function(sender, args){
                        var vProperties = myProperties.get_userProfileProperties();
                        userName = vProperties[strPropName];
                        alert(userName);
                    },function(sender, args){
                        alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
                    });
            });
        }

    ExecuteOrDelayUntilScriptLoaded(function() {getMyProfileProperty("LastName");}, "sp.js");


    コード自体に間違いはないようで、カスタムリストの NewForm.aspx に同じコードを入れた場合には正常に動作しました。
    また今回問題になっているフォームでも、URLに NewForm.aspx?ToolPaneView=2 として編集画面で開いた場合は正常に動作します。

    アンケートフォームのテンプレートに、何か必要なモジュールが取り込まれていないようにも思えますが、解決策はありますでしょうか?

    どうぞよろしくお願いいたします。

    2017年6月17日 12:13

回答

  • こちらのSharePoint Online環境でも試してみたのですが、少々動きが異なりますね。

    こちらでは、アンケートのNewForm.aspxにスクリプトエディタをはりつけて、上記コードを入れてみたところ、アンケート入力画面表示時、getMyProfilePropertyが呼ばれない現象となりました。

    この現象においては、

    ExecuteOrDelayUntilScriptLoaded(function() {getMyProfileProperty("LastName");}, "sp.js");

    の直前に、

    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function(){});

    を、入れることで、画面表示時にユーザー名が取得できております。

    そちらの環境と状況が異なるので、なんとも言えませんが、上記の対応で動きは変わりますでしょうか。

    • 回答としてマーク naa03675 2017年6月21日 7:08
    2017年6月21日 5:16

すべての返信

  • 補足しますと、アンケートフォーム内でも SPオブジェクトにはアクセスできます。
    デバッガで確認したところ、カスタムリストフォームのSPオブジェクトにはClientContextメソッドが見えますが、アンケートフォームではClientContextが存在していないように見えます。

    2017年6月17日 13:28
  • 無理やりですが、

    SP.SOD.executeFunc('userprofile', 'SP.UserProfiles', function(){

    の前に、この1行を入れることで、改善されますでしょうか。

    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function(){});

    2017年6月20日 6:04
  • ありがとうございます。

    試したところ、Internet Explorer11では、ご教示いただいた

    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function(){});

    を追加し、その後ろにダミーの alert関数を入れた場合に、意図した値を取得することができました。
    タイミングの問題があるようで、alert関数を外すと やはりClientContextの取得に失敗します。

    また、実際にどこまで影響があるかわからないのですが、デバッガで起動した場合に

    O365Shell.d=function(){if(O365Shell.a.z){O365.Log.WriteShellLog(175164,1,1,0); 後略

    の部分で「未定義または NULL 参照のプロパティ 'z'は取得できません」というエラーが出るようになりました。
    これは当方で作成したものではなく、フォームにあらかじめ設定されたスクリプトです。


    IEでは上記のような動きでしたが、FireFoxとChromeでは残念ながら効果がありませんでした。
    カスタムリストのフォームであれば、最初の質問でアップロードしたスクリプトは、FireFoxでもChromeでも

    動作しています。

    よろしくお願いいたします。

    • 編集済み naa03675 2017年6月21日 7:09
    2017年6月21日 3:45
  • こちらのSharePoint Online環境でも試してみたのですが、少々動きが異なりますね。

    こちらでは、アンケートのNewForm.aspxにスクリプトエディタをはりつけて、上記コードを入れてみたところ、アンケート入力画面表示時、getMyProfilePropertyが呼ばれない現象となりました。

    この現象においては、

    ExecuteOrDelayUntilScriptLoaded(function() {getMyProfileProperty("LastName");}, "sp.js");

    の直前に、

    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function(){});

    を、入れることで、画面表示時にユーザー名が取得できております。

    そちらの環境と状況が異なるので、なんとも言えませんが、上記の対応で動きは変わりますでしょうか。

    • 回答としてマーク naa03675 2017年6月21日 7:08
    2017年6月21日 5:16
  • 動作しました! 各ブラウザとも値を取得することができましたし、
    「未定義または NULL 参照のプロパティ 'z'は取得できません」のエラーも出なくなりました。

    本当に助かりました。ありがとうございました。

    2017年6月21日 7:07