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

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

詳細はこちら
Google Apps Script

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

JavaScript

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

Q&A

解決済

2回答

1605閲覧

関数式の不思議 と async/awaitの使用方法

slimat

総合スコア57

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2019/12/16 08:00

編集2019/12/18 07:03

こんにちは.

google.script.runの公式ページには, google.script.runを使用して, "any server-side function"を呼び出し可能と書かれています.
下記gsファイルでは, function式を用いて関数hogeを定義しています(問題の行). ー①
この状態で実行すると, ランダムな順番でディスプレイに1から4の数字が表示されます.

そして, ここから関数式を用いた3つのパターンで関数hogeを定義してみました.(全て"hoge(vv)"として呼び出しています)

  1. var hoge = fucntion hoge(x){return x;}; (両辺に"hoge") → ①と同一の動作 ー②
  2. var hoge = fucntion (x){return x;}; (左辺に"hoge") → 動作しない ー③
  3. var hogeNot = fucntion hoge(x){return x;}; (右辺に"hoge") → 動作しない ー④

質問1 : なぜ, ②は動作し, ③の条件では動作しないのでしょうか.
質問2 : async/awaitを使用しているのですが, 画面に表示される数字がランダムな順番になってしまいます. どうしたら良いのでしょうか.

宜しくお願い致します.

gs

1var x; 2 3function doGet() { 4 return HtmlService.createTemplateFromFile("hello").evaluate(); // テンプレートオブジェクトの取得 5} 6 7function hoge(x){ // 問題の行 8 return x; 9}

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 </head> 6 <body> 7 <p id="wi">hello</p> 8 <script> 9 function success(get){ 10 document.getElementById("wi").insertAdjacentHTML("afterend","<p>" + get + "</p>"); 11 } 12 13 for (var v=1; v <= 4; ++v){ // aaを4回呼ぶ 14 aa(v); 15 } 16 17 async function aa(vv){ 18 await google.script.run.withSuccessHandler(success).hoge(vv); 19 } 20 </script> 21 </body> 22</html>

追記①

同じサイトを見るとgoole.script.runの戻り値はvoidのようです.
なのでawaitは使用不可でしょうか.


追記②

scriptタグ内を以下のようにしたところ順番に表示されました.

javascript

1 function success(get){ 2 document.getElementById("wi").insertAdjacentHTML("afterend","<p>" + get + "</p>"); 3 if (get > 0 && (get + 1) < 5){ 4 aa(get + 1); 5 } 6 } 7 8 aa(1); 9 10 function aa(vv){ 11 google.script.run.withSuccessHandler(success).withFailureHandler(failed).closer(vv); 12 }

追記③

stackoverflowでも質問してみました.
Different output in 3 anonymous function in GAS

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

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

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

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

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

guest

回答2

0

ベストアンサー

google.script.run

Return

void — this method is asynchronous and does not return directly; however, the server-side function can can return a value to the client as a parameter passed to a success handler; also, return types are subject to the same restrictions as parameter types, except that a form element is not a legal return type

await

Promise を返さなければ、「PromiseインスタンスがFulfilledまたはRejectedになるまで非同期処理を待つ処理」も有効に働かないでしょう。

Re: slimat さん

投稿2019/12/16 11:45

think49

総合スコア18189

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

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

slimat

2019/12/25 01:41

ご回答ありがとうございます。 promiseを発行させることで解決しました。
guest

0

gasはよくわかりませんが、awaitが待ってくれないなら
ちゃんとpromiseを発行してresolveしてみてはどうでしょうか?

投稿2019/12/16 08:07

yambejp

総合スコア116688

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

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

slimat

2019/12/25 01:41

ご回答ありがとうございます。 promiseを発行させることで解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問