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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google Apps Script

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

Q&A

解決済

1回答

1889閲覧

ダイアログボックス表示のタイミングについて

donguriko

総合スコア30

Google Apps Script

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

0グッド

1クリップ

投稿2022/04/02 09:53

編集2022/04/02 09:56

前提

リンク先の質問の前工程処理です。→質問リンク

スプレッドシート内に下の2つのシートがあります。
①入力シート
②マージシート

GASで①→②への転記処理と①への「転記済」表示の追記をさせます。
転記処理のコードは全3ステップに分けてコード記載しました。

実現したいこと

3ステップの処理が完了したら、処理が完了した旨の
ダイアログボックスを画面表示させ、ツールユーザーに「OK」ボタンを
クリックしてもらい「作業完了」という動きを想定しています。

発生している問題・エラーメッセージ

記載したコードで全3ステップの転記処理は想定どおり動いていますが、
メッセージボックスが出てくるタイミングが自分の想定と違う出方を
しています。

(現)
下の状態でメッセージボックスが出てきます。
処理①のマージシートへの「依頼日」転記は済。
処理②のマージシートへの「識別番号(D列)」~「備考(G列)」転記は未。
処理③の入力シートへの「転記済」表示記載も未
→OKボタンをクリックすると、処理②、③が実行されます。

違和感はあるものの、現在のタイミングでも、処理的には「実害」はない
のですが、今後の知識のために処理③まで完了後のタイミングで
メッセージボックスが出て来ない原因が知りたく質問しました。

a) Browser.msgBox のコードを記載する位置に誤りがありますか?
もしかするとブロックについてまだ理解しきれていないのでは?
という気がしています。

b) 現コードをどのように修正すれば、「実現したいこと」欄に記載の
タイミングでメッセージボックスが表示されるようになりますか?

該当のソースコード

以下にコード全文を記載します。

GAS

1function copyToMerge() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const mySheet1 = ss.getSheetByName("入力シート"); 4 const mySheet2 = ss.getSheetByName("マージシート"); 5 6 //転記が必要な行数(targetRows)を取得 7 const InMaxRow = mySheet1.getRange(5, 4).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 8 const targetRows = InMaxRow - 5; 9 console.log("InMaxRow " + InMaxRow); //12が出れば正解 10 console.log("targetRows " + targetRows); //7が出れば正解 11 12 //▼①「依頼日」の転記 13 //入力シートの依頼日(c列)の値取得 14 const myDate = mySheet1.getRange("C6").getValue(); 15 console.log("myDate " + myDate); //2022/04/02が出れば正解 16 17 //マージシートのデータあり最終行(OutMaxRow)を取得 18 const OutMaxRow = mySheet2.getRange(mySheet2.getMaxRows(), 4).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); 19 console.log("OutMaxRow " + OutMaxRow); //19が出れば正解 20 21 //マージシートの依頼日(c列)にmyDateの内容を転記する。 22 for (let i = OutMaxRow +1; i <= OutMaxRow +targetRows ; i++) { 23 mySheet2.getRange(i, 3).setValue(myDate); 24 } 25 26 //▼②「識別番号(D列)」~「備考(G列)」を転記。 27 //getRange(行,列,●行分,●列分); 28 const myDeta = mySheet1.getRange(6, 4, targetRows, 4).getValues(); 29 console.log("myDeta " + myDeta); 30 const outRange1 = mySheet2.getRange(OutMaxRow +1, 4, targetRows, 4); 31 console.log(outRange1.getA1Notation()); //D20:G26が出れば正解 32 outRange1.setValues(myDeta); 33 34 //▼③入力シートに「転記済」表示を追記する。 35 const outRange2 = mySheet1.getRange(6, 2, targetRows, 1); 36 console.log(outRange2.getA1Notation()); //D20:G26が出れば正解 37 outRange2.setValue("転記済"); 38 39 //▼完了Msgの表示 40 Browser.msgBox("マージシートへの転記処理が完了しました。\\n転記済の表示があれば問題なく転記できています。", Browser.Buttons.OK); 41}

補足情報(FW/ツールのバージョンなど)

以前から、自分の書いたコードでのメッセージボックスの出てくる
タイミングにずっと違和感を感じており、今後の自分の知識のための
質問となりますので、回答は急ぎません。
回答はお時間がある時で大丈夫です。
本日、2度目の質問、連投となり申し訳ありません。
お忙しいところ申し訳ありませんが、解説をいただけないでしょうか?

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

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

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

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

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

penguin520

2022/04/02 12:06

どのブラウザでそのような現象が起きるか教えてください。
donguriko

2022/04/03 00:31

penguin520さま 確認が遅くなり申し訳ありません。 非エンジニアで、恥ずかしながらIT知識が乏しいのですが ブラウザはchromeとかのことでよろしいですか? であれば、Microsoft Edge です。
penguin520

2022/04/03 04:01

Microsoft Edge で スプレッドシートを操作するGASは一部正しく動作しません。 どうしても、動作がおかしいと思ったときは、一度 chrome で動作確認してみてください。
donguriko

2022/04/03 04:06

penguin520さま Microsoft Edge だと正しく動かないことがあるのですね。 教えていただきありがとうございます。 同様の事象にあたったらchrome で入り直し? てから、動作確認してみるようにします。 アドバイスありがとうございました。
guest

回答1

0

ベストアンサー

a) Browser.msgBox のコードを記載する位置に誤りがありますか?

→誤りはありません。

b) 現コードをどのように修正すれば、「実現したいこと」欄に記載のタイミングでメッセージボックスが表示されるようになりますか?

→メッセージボックスの表示前に、SpreadsheetApp.flush(); を追記します。

 

【原因】
GASでは、画面への反映にタイムラグが生じることがあります。
Range.getValue()を複数回呼び出す場合などの場面では、パフォーマンス向上のため、スプシの操作が内部的にまとめて行われる場合があります。

しかし、Browser.msgBox()関数が呼び出されると、まとめて行われる予定だった操作がストップしてしまうため、質問のような状態になります。
(OKを押すと、保留されていた操作が再開します)

【解決策】
メッセージボックスの表示前に、
SpreadsheetApp.flush()
という関数をコールして、保留中となっているスプレッドシートへの変更を、強制的に適用させます。

diff

1(略) 2 //▼③入力シートに「転記済」表示を追記する。 3 const outRange2 = mySheet1.getRange(6, 2, targetRows, 1); 4 console.log(outRange2.getA1Notation()); //D20:G26が出れば正解 5 outRange2.setValue("転記済"); 6 7+ SpreadsheetApp.flush(); 8 9 //▼完了Msgの表示 10 Browser.msgBox("マージシートへの転記処理が完了しました。\\n転記済の表示があれば問題なく転記できています。", Browser.Buttons.OK); 11}

投稿2022/04/02 13:28

編集2022/04/02 13:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

donguriko

2022/04/03 00:50 編集

qnoirさま お忙しい中、回答、解説ありがとうございます。 自分のコードにどこか誤りがあるのかと思っていたのですが、そうでは なかったのですね。(←ちょっと安心しました) スプシの操作を内部的にまとめて行おうと思っていたところに、 Browser.msgBox()の指示がきてしまったので止まっている状態なのですね。 システムなのでヒトとは違うのですが、後から急ぎの頼まれごとが来た時に 確かにこうなるよね、と納得できました。 メッセージボックスの表示前にSpreadsheetApp.flush()をいれると 回避可能なのですね。 勉強になりました、覚えたいと思います。 いつも丁寧な解説本当にありがとうございます。 難しいことを私のような素人でも理解できるようかみ砕いて 解説、レクチャーしてくださるqnoirさまのお人柄と知識、本当にすごいです。 尊敬しています!! qnoirさまに教えていただいたこと、しっかり吸収して、身につけて いたきたいと思います。 回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問