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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SharePoint

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

8回答

4852閲覧

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

mie.8

総合スコア28

SharePoint

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/06/02 07:40

編集2017/06/02 09:25

前提・実現したい事

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

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

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

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

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

発生している問題・Error Message

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

実際のソースコード

JavaScript

1function PreSaveAction() { 2 3 /** 4 * ①既存の「保存ボタン」を押されたら処理するJavaScript → PreSaveAction() 5 * 6 * 既存の、「保存ボタン」が押されたら行う処理~ 7 * 8 * 9 */ 10 11 // 保存処理 開始 12 13 var cliCtx = new SP.ClientContext("サイトのURL"); 14 var registList = cliCtx.get_web().get_lists().getByTitle("リスト名"); 15 var itemCreateInfo = new SP.ListItemCreationInformation(); 16 this.registeredListItem = registList.addItem(itemCreateInfo); 17 18 /*---------------------------------------------------------------------------*/ 19 // アイテム追加処理 20 /*---------------------------------------------------------------------------*/ 21 registeredListItem.set_item("カラム名", "登録する値"); 22 registeredListItem.update(); 23 cliCtx.load(registeredListItem); 24 cliCtx.executeQueryAsync(Function.createDelegate(this)); 25 26 /*---------------------------------------------------------------------------*/ 27 // 「保存ボタン」押下時のアクション 28 /*---------------------------------------------------------------------------*/ 29 if (true) { 30 return true; 31 } else { 32 return false; 33 } 34 35 // 保存処理 終了 36} 37 38/*****************************************************************************/ 39// 保存ボタン押下後の処理 40/*****************************************************************************/ 41function Function2() { 42 43 /** 44 * ②保存処理終了後( PreSaveAction()実行後 )に、処理をするJavaScript → Function2() 45 * 46 * 保存ボタン押下後の処理 47 * 48 * 49 */ 50}

試した事

jquery

1$.when( 2 PreSaveAction(), 3 Function2() 4);

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

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

Browser → IE,Google Chrome.

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/06/02 08:08 編集

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

2017/06/02 08:19

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

回答8

0

ベストアンサー

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

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

保存ボタンのJavaScript処理としては
0. PreSaveAction
0. 保存処理の呼び出し

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

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

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

投稿2017/06/23 05:36

編集2017/06/26 07:15
tears

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mie.8

2017/06/23 05:43

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

0

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

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

javascript

1<script src="https://www.promisejs.org/polyfills/promise-6.1.0.min.js"></script> 2<script> 3var prm=[]; 4prm[0]=function(x){ 5 new Promise(function(resolver){ 6 Promise.all([ 7 new Promise(function(resolver){setTimeout(function(){console.log("a1");return resolver(this)},1000);}), 8 new Promise(function(resolver){setTimeout(function(){console.log("a2");return resolver(this)},2000);}), 9 new Promise(function(resolver){setTimeout(function(){console.log("a3");return resolver(this)},3000);}) 10 ]).then(function(){return resolver(this);}); 11 }).then(function(){ 12 if(x<prm.length){ 13 prm[x](x+1); 14 }else{ 15 console.log("end"); 16 } 17 }); 18} 19prm[1]=function(x){ 20 new Promise(function(resolver){ 21 setTimeout(function(){console.log("b");return resolver(this)},2000); 22 }).then(function(){ 23 if(x<prm.length){ 24 prm[x](x+1); 25 }else{ 26 console.log("end"); 27 } 28 }); 29} 30prm[2]=function(x){ 31 new Promise(function(resolver){ 32 setTimeout(function(){console.log("c");return resolver(this)},2000); 33 }).then(function(){ 34 if(x<prm.length){ 35 prm[x](x+1); 36 }else{ 37 console.log("end"); 38 } 39 }); 40} 41prm[0](1) 42</script> 43

投稿2017/06/02 08:48

yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mie.8

2017/06/02 09:26

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

0

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

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

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

jQuery.when( )
※jQuery必須

投稿2017/06/02 08:00

編集2017/06/02 08:02
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mie.8

2017/06/02 08:17

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

2017/06/02 08:23

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

2017/06/02 08:31

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

2017/06/02 09:33

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

0

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

js

1function PreSaveAction() { 2 3 /** 4 * ①既存の「保存ボタン」を押されたら処理するJavaScript → PreSaveAction() 5 * 6 * 既存の、「保存ボタン」が押されたら行う処理~ 7 * 8 * 9 */ 10 11 /*---------------------------------------------------------------------------*/ 12 // 「保存ボタン」押下時のアクション 13 /*---------------------------------------------------------------------------*/ 14 15 Function2(); 16 17 18 if (true) { 19 return true; 20 } else { 21 return false; 22 } 23}

投稿2017/06/02 07:53

kanimaru

総合スコア1013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mie.8

2017/06/02 08:00

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

0

Promise を使えばいいのでは?

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

javascript

1 2var d = $.Deferred(); 3 4function PreSaveAction() { 5 6 /** 7 * 保存処理 8 */ 9 10 // 保存処理が完了したところで 11 d.resolve(); 12 // 保存処理が失敗した場合 13 d.reject(); 14} 15 16d.promise.done(function() { 17 // 正常保存時の処理 18 Function2(); 19}) 20.fail(function() { 21 // 保存エラー時の処理 22}); 23

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

投稿2017/06/02 08:41

rok6

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rok6

2017/06/02 08:52

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

2017/06/02 08:59

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

0

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

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

javascript

1 2function PreSaveAction() {//保存ボタンを押したときに自動で呼び出される 3 /* 4 色々な処理 5 */ 6 7 return Function2(); 8} 9 10function Function2 (){//PreSaveActionの終わりに呼び出される 11 /* 12 色々な処理 13 */ 14 15 return true ; 16//return false ; //何かしらの条件で保存処理をキャンセルしたいならreturn false 17 18}

投稿2017/06/02 08:11

namimon

総合スコア726

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mie.8

2017/06/02 08:32

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

0

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

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

javascript

1function PreSaveAction() { 2 ~~省略~~ 3 if (true) { 4 return Function2(); 5 } 6} 7 8function Function2 (){ 9 10 ~~省略~~~ 11 12 return true; 13}

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

HTML

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

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

投稿2017/06/23 05:46

編集2017/06/23 05:49
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/06/23 05:52

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

2017/06/23 05:56

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

0

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

投稿2017/06/20 07:07

編集2017/06/20 08:40
mie.8

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2017/06/20 08:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問