質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.96%

JavaScriptで、任意の順番で実行するコードの書き方が分かりません。

解決済

回答 8

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,235

mie.8

score 9

前提・実現したい事

SharePoint Online に、JavaScriptを埋め込み、処理を行いたいです。

順番としては・・・
①既存の「保存ボタン」を押されたら処理するJavaScript → PreSaveAction()
②保存処理終了後( PreSaveAction()実行後 )に、処理をするJavaScript → Function2()

のように、処理をさせたいです。

*参考URL → リスト フォームの「保存」ボタン クリック時に任意の JavaScript 処理を追加する

  簡単にお伝えすると、新規作成したアイテムに対し、少し手を加えたいので
アイテム新規作成 → ①の処理、の後に
少し手を加える → ②の処理 を行いたいです。

発生している問題・Error Message

この処理( 対象PreSaveAction() )が "実行された場合のみ"、『Function2()』を実行する
・・・という書き方が分かりません。

実際のソースコード

function PreSaveAction() {

    /**
     * ①既存の「保存ボタン」を押されたら処理するJavaScript → PreSaveAction()
     *
     * 既存の、「保存ボタン」が押されたら行う処理~
     *
     *
     */

    // 保存処理 開始

    var cliCtx                 = new SP.ClientContext("サイトのURL");
    var registList             = cliCtx.get_web().get_lists().getByTitle("リスト名");
  var itemCreateInfo         = new SP.ListItemCreationInformation();
    this.registeredListItem    = registList.addItem(itemCreateInfo);

    /*---------------------------------------------------------------------------*/
    // アイテム追加処理
    /*---------------------------------------------------------------------------*/
    registeredListItem.set_item("カラム名", "登録する値");
    registeredListItem.update();
    cliCtx.load(registeredListItem);
    cliCtx.executeQueryAsync(Function.createDelegate(this));

    /*---------------------------------------------------------------------------*/
    // 「保存ボタン」押下時のアクション
    /*---------------------------------------------------------------------------*/
    if (true) {
        return true;
    } else {
        return false;
    }

    // 保存処理 終了
}

/*****************************************************************************/
// 保存ボタン押下後の処理
/*****************************************************************************/
function Function2() {

    /**
     * ②保存処理終了後( PreSaveAction()実行後 )に、処理をするJavaScript → Function2()
     *
     * 保存ボタン押下後の処理
     *
     *
     */
}

試した事

$.when(
    PreSaveAction(),
    Function2()
);


「$.when()」を使用してみましたが、上手く行きませんでした。
よろしくお願い致します。

補足情報(言語/FW/ツール等のVersion)

Browser → IE,Google Chrome.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2017/06/02 17:03 編集

    HTMLもご提示ください。そこからうまくいっていない可能性があります。「保存ボタンを押したらPreSaveAction()を実行」は出来ていますか?PreSaveAction()の冒頭でalert("1");とか入れると確かめられます。

    キャンセル

  • mie.8

    2017/06/02 17:19

    アラート表示は既に試してみました。表示はされます。

    キャンセル

回答 8

checkベストアンサー

+3

ユーザーはPreSaveActionに任意なJavaScriptを記述することができますが、
それ以降はサーバー処理になるため、保存後にJavaScriptを実行することはできません。

前提としてSharePointのページはAsp.netとなっています。

保存ボタンのJavaScript処理としては

  1. PreSaveAction
  2. 保存処理の呼び出し

となっています。ここで「保存処理の呼び出し」と書いてあるのは、実際に保存処理を実行してるのがサーバーサイドだからです。

サーバーの保存処理後に何かしら処理を実行するためには、サーバーサイドに処理を追加する必要がありますが、
クラウド製品のSharePoint Onlineではそれも不可能です。
※方法がないわけではありませんが、実現コストは非常に高いです。

ですので、「保存後に何か処理を行う」というのは諦めたほうがいいかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/23 14:43

    ご回答ありがとうございます。
    詳しくご説明して頂き、ありがとうございます。

    キャンセル

+3

これってホントに非同期の問題なのでしょうか
一応Promiseの例を挙げておきます

全体としてa→b→cと非同期をまって実行します
その際aはa1、a2、a3は並行して実行し全部の戻りをまってbに移ります

<script src="https://www.promisejs.org/polyfills/promise-6.1.0.min.js"></script>
<script>
var prm=[];
prm[0]=function(x){
  new Promise(function(resolver){
    Promise.all([
      new Promise(function(resolver){setTimeout(function(){console.log("a1");return resolver(this)},1000);}),
      new Promise(function(resolver){setTimeout(function(){console.log("a2");return resolver(this)},2000);}),
      new Promise(function(resolver){setTimeout(function(){console.log("a3");return resolver(this)},3000);})
      ]).then(function(){return resolver(this);});
  }).then(function(){
    if(x<prm.length){
      prm[x](x+1);
    }else{
      console.log("end");
    }
  });
}
prm[1]=function(x){
  new Promise(function(resolver){
    setTimeout(function(){console.log("b");return resolver(this)},2000);
  }).then(function(){
    if(x<prm.length){
      prm[x](x+1);
    }else{
      console.log("end");
    }
  });
}
prm[2]=function(x){
  new Promise(function(resolver){
    setTimeout(function(){console.log("c");return resolver(this)},2000);
  }).then(function(){
    if(x<prm.length){
      prm[x](x+1);
    }else{
      console.log("end");
    }
  });
}
prm[0](1)
</script>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/02 18:26

    ご回答ありがとうございます。

    キャンセル

+2

PreSaveAction関数の中で、Function2呼び出せばいいのでは。

function PreSaveAction() {

    /**
     * ①既存の「保存ボタン」を押されたら処理するJavaScript → PreSaveAction()
     *
     * 既存の、「保存ボタン」が押されたら行う処理~
     *
     *
     */

    /*---------------------------------------------------------------------------*/
    // 「保存ボタン」押下時のアクション
    /*---------------------------------------------------------------------------*/

    Function2();


    if (true) {
        return true;
    } else {
        return false;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/02 17:00

    ご回答ありがとうございます。
    試してみましたが、「Function2()」の処理が実行されませんでした。

    キャンセル

+2

ボタンクリック時にPreSaveAction()が呼び出されている前提であれば、
保存処理を書いたあとに
Function2(); と書けば良いです。

「保存処理が終わるのを待って」というのなら$.whenの出番で、以下のように書くと良いです。

function PreSaveAction() {
  $.when(
    //保存処理
  ).done(function() {
    Function2();
  });

}

jQuery.when( )
※jQuery必須

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/02 17:17

    ご回答ありがとうございます。
    試した所、保存が出来なかったです。

    キャンセル

  • 2017/06/02 17:23

    保存処理はどのような処理を行っていますか?
    その辺りもコードが必要ですね。

    キャンセル

  • 2017/06/02 17:31

    保存処理追記しました。
    ただ、自分自身がネット上の物をコピペしてまして、全部の処理1文1文全て理解はしていないので・・・

    キャンセル

  • 2017/06/02 18:33

    これを機会にきちんと理解して思うとおりに使えるようになりましょう。
    他の人がサンプルコードを書いてくれていますが、それもひとつひとつ調べて流れと共に理解できるようになると後々役に立ちますよ。

    キャンセル

+1

この処理( 対象PreSaveAction() )が "実行された場合のみ"

というのは、処理がうまくいった場合ではなく、"実行されたら必ず"という意味ですよね?

function PreSaveAction() {//保存ボタンを押したときに自動で呼び出される
   /*
   色々な処理
  */

   return Function2(); 
}

function Function2 (){//PreSaveActionの終わりに呼び出される
   /*
   色々な処理
  */

  return true ;
//return false ; //何かしらの条件で保存処理をキャンセルしたいならreturn false

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/02 17:32

    ご回答ありがとうございます。
    保存処理はされましたが、Function2が実行されませんでした。

    キャンセル

+1

Promise を使えばいいのでは?

以下、Promise はIE11では使えないので、jQuery.Deferred()の例

var d = $.Deferred();

function PreSaveAction() {

  /**
   * 保存処理
   */

  // 保存処理が完了したところで
  d.resolve();
  // 保存処理が失敗した場合
  d.reject();
}

d.promise.done(function() {
  // 正常保存時の処理
  Function2();
})
.fail(function() {
  // 保存エラー時の処理
});


ES6のPromiseも大体似たような書き方なので、一応参考に。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/02 17:49

    一応
    <script src="https://www.promisejs.org/polyfills/promise-6.1.0.min.js"></script>
    を読み込めばIEでもPromiseが稼働するようですよ

    キャンセル

  • 2017/06/02 17:52

    そういえばpolyfillがありましたね・・すっかり忘れてました。。

    キャンセル

  • 2017/06/02 17:59

    ご回答ありがとうございます。
    Google Chromeでも試してみましたが、保存が出来なくなりました。

    キャンセル

0

保存ボタンでsubmitしていて、その保存ボタンのonclickの処理で「PreSaveAction()」を呼び出しているため、
return trueの時点でsubmit実行されてるのであとで並べても無理なわけですよね。・・・(やっと理解しました)

今のつくりだと下記のようにするしかなさそうです。

function PreSaveAction() {
  ~~省略~~
    if (true) {
        return Function2();
    }
}

function Function2 (){

 ~~省略~~~

 return true;
}

あとは保存ボタンのonlickにfalseを受けるように書いてあるかどうか。。

<input type="submit" name="保存" onclick="return PreSaveAction();" />

またPreSaveAction() にてif(true)と書いてあるのでreturn falseされることは絶対にないわけですが、保存処理に起きたエラーの捕捉はしといたほうがいいと思いますよ。
Function2()でも何かのエラーなどあった場合にfalseを返すようにご検討ください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/23 14:52

    すみません。SharePoint Online絡みで難しいのですね。この回答は無視してください。

    キャンセル

  • 2017/06/23 14:56

    ご回答ありがとうございます。

    キャンセル

-4

解決済から、未解決に戻します。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/20 17:23

    意味不明なので、解決方法を書いてください。
    https://teratail.com/help

    > 質問をした後に自己解決してしまった
    > 自分で投稿した質問にも回答する事が可能です。質問文の内容を編集したりせず、回答を付けベストアンサーをクリックし解決済みにしてください。
    > また後から読む人のためにも、具体的な解決手順を記載してください。
    > https://teratail.com/questions/3429 の質問などを参考にしてください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる