🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

Q&A

解決済

1回答

1028閲覧

gsファイル内の関数が定義されるタイミングは呼び出される毎?

slimat

総合スコア57

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

0グッド

0クリップ

投稿2019/12/16 09:46

編集2019/12/19 04:35

こんにちは.

以下のプログラム①,②を実行すると, どちらもディスプレイに以下のように出力されます.

①↓

gs

1function doGet(){ 2 return HtmlService.createHtmlOutputFromFile("hello"); 3} 4 5var closerRe = function (){ 6 var b = 0; 7 return function(plusOr){ 8 Logger.log("plusor = " + plusOr); 9 if (plusOr == 1){ 10 ++b; 11 } 12 return b; 13 }; 14}(); 15 16function closer(x){ 17 var tmp = closerRe(x); 18 Logger.log("tmp = " + tmp); 19 return tmp; 20}

②↓

gs

1function doGet() { 2 return HtmlService.createTemplateFromFile("hello").evaluate(); // テンプレートオブジェクトの取得 3} 4 5var closer = function closer(){ 6 var b = 0; 7 return function(plusOr){ 8 Logger.log("plusor = " + plusOr); 9 if (plusOr == 1){ 10 ++b; 11 } 12 return b; 13 }; 14}();

①, ②に共通のhtmlファイル

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 </head> 6 <body> 7 <p id="wi"></p> 8 <script> 9 var count = 0; 10 11 function success(get){ 12 ++count; 13 document.getElementById("wi").insertAdjacentHTML("afterend","<p>get = " + get + ", count = " + count + "</p>"); 14 if (count < 4){ // aaを4回呼ぶ 15 aa(1); 16 } 17 } 18 19 aa(1); 20 21 function aa(vv){ 22 google.script.run.withSuccessHandler(success).closer(vv); // 同じ実引数でcloserを呼ぶ 23 } 24 </script> 25 </body> 26</html> 27 28 29

display

1get = 1, count = 4 2 3get = 1, count = 3 4 5get = 1, count = 2 6 7get = 1, count = 1

質問 : gsファイル内の関数はhtmlから呼び出される度に定義されているのでしょうか.(gsファイル内のクロージャをhtmlから利用することはできないのでしょうか)

宜しくお願い致します.


追記①

stackoverflowでも質問しました.
Definition of gs function is when you call the function from html code?


追記②

①の場合, クライアント側からcloser関数を呼び出した時を考えると, closer関数実行中にcloserRe関数の呼び出しに出会ったときに,closerRe関数が定義されるのでしょうか.

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問 : gsファイル内の関数はhtmlから呼び出される度に定義されているのでしょうか

HTMLに記述されている処理はクライント側、GASに記述されている処理はサーバ側で実行されるので、そういうことでしょう。

投稿2019/12/19 04:12

macaron_xxx

総合スコア3191

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

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

slimat

2019/12/19 04:18

ご回答ありがとうございます. なので, var b = 0; が毎回実行されてget = 1と表示されてしまうのですね.
macaron_xxx

2019/12/19 07:47

追記2に関して、厳密にどの実行順序なのかが知りたければ、ログを吐くようにすればわかると思いますよ。
slimat

2019/12/25 09:40 編集

お返事ありがとうございます. ログ出ししておくものですね. 追記②の順序で関数が定義されているに違いないと思っていたのですが, 結果はcloser関数が呼ばれた時に, closer関数内の処理前に, (closer関数内で使われれる予定の)closerRe関数(外側の関数)が定義されていました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問