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

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

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

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

Q&A

解決済

3回答

6565閲覧

次の処理が終わるまで、待機させるコードの書き方?

yoichiyy

総合スコア55

Google Apps Script

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

0グッド

0クリップ

投稿2022/03/22 22:34

編集2022/03/22 23:05

1.スプレッドシートの、上の行に入っているSUM関数を、
google Formの回答を新たに追加する下の行にコピーします。

2.その上で、回答行をfirebaseにアップします。

コードを実行すると、1のコピー処理がまだ反映されていないのに、2が実行されてしまいます。
1の処理を待ってから、
2の処理を実行してもらいたいと考え、

1と2の間に、下記コードを、どこかのWEBサイトから拾ってきて(注1)挿入しました。
・・・が、まったく挙動は変わりませんでした。

googleAppScript

1 // Get a script lock, because we're about to modify a shared resource. 2 var lock = LockService.getScriptLock(); 3 // Wait for up to 30 seconds for other processes to finish. 4 lock.waitLock(30000); 5 6 if (!lock.hasLock()) { 7 Logger.log('Could not obtain lock after 10 seconds.'); 8 }

ご質問したいことは2つです。
1.上記のコードでは、30000ミリ秒待機するように読めます。
ですが実際に処理にかかった時間は1−2秒でした。
30秒待機するというものでないのだとしたら、このコードの役割をどのように解釈するのが正しいのでしょうか?

2.async → await 的な「この値を得るまで、次の処理は待って下さい」・・・というコードを書くための、google app scriptにおける「正しい方法」があれば、お教え下さい。

どうぞ、よろしくお願いします。

function up_to_firestore() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet1 = ss.getSheetByName('kaitou1'); //《タイトル行取得部分》 var firstRange = sheet1.getRange(2, 5, 1,7); var firstRowValues = firstRange.getValues(); var titleColumns = firstRowValues[0]; //回答データ取得 var sheetData = sheet1.getSheetValues(3, 5, sheet1.getLastRow(), 7); //ループ開始 sheetData.forEach(function(value, index) { // 済による分岐 if (value[0] !="" && value[6] !="済") { sheet1.getRange(3+index, 11).setValue("済"); sheet1.getRange(2+index,9,1,2).copyTo(sheet1.getRange(3+index,9,1,2)); // コピー処理終わるまで待機させる・・・つもりが、 var lock = LockService.getScriptLock(); // Wait for up to 30 seconds for other processes to finish. lock.waitLock(30000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); } //その行データをrowValuesに入れる var rowValues = sheetData[index]; //JSONArrayつくる var jsonArray = []; var json = new Object(); for(var j=0; j<titleColumns.length; j++) { json[titleColumns[j]] = rowValues[j]; } jsonArray.push(json); // CloudFirestoreの認証とUP var firestore = firestoreData(); try{ firestore.createDocument(●●●, jsonArray); }catch(e){ Logger.log("エラー:" + e.message)//同じドキュメント名が合った場合は、新しい方にデータを更新 firestore.updateDocument(●●●, jsonArray); } } }); }

注1:1年以上前に、ネットで探して拾ったコードなので、URL情報をご提供できません…。

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

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

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

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

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

int32_t

2022/03/22 22:43

> 1.スプレッドシートの、上の行に入っているSUM関数を、 > google Formの回答を新たに追加する下の行にコピーします。 この具体的なコードがわからないと回答は難しいです。
yoichiyy

2022/03/22 23:06

コメントをどうもありがとうございます。 只今、修正、追記致しました。 ご検討を、宜しくお願い致します。
penguin520

2022/03/29 15:27

昔おなじようなところに陥ったのですが、HTMLやCSSと違いjs系は、コピペで貼り付けて実装というわけにいかないので、遠回りすると思います。
yoichiyy

2022/03/30 01:21

penguin520様、ご丁寧にどうもありがとうございます。gasでawaitにあたるような機能が、少し複雑な様子でしたが、見つかりましたので、こちらで試してみようと思っています。
penguin520

2022/03/30 01:48

そうですか!よかったです。どういう方法か、機会があれば教えて下さい!
guest

回答3

0

自己解決

「次の処理が終わるまで、待機させるコードの書き方?」は、まだわかっていないが、おそらくこれがあたりだろうというページを見つけたので、まずはこのページを理解し、自分のパターンに当てはめようと思います。

https://www.330k.info/essay/gas_google_script_run_convert_promise/

投稿2022/03/30 01:26

yoichiyy

総合スコア55

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

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

int32_t

2022/04/01 04:32

google.script.run はこの質問には無関係に見えます。
guest

0

1のコピー処理がまだ反映されていないのに、

copyTo() が非同期に動作するという情報は見つけられませんでした。
変数 sheetData に入っているデータは sheet1.getSheetValues() を呼んだ時点のコピーであって、たとえ時間を置いても copyTo() の結果が反映されることはありません。そこを勘違いしているのではないでしょうか。

LockService はそのコードのコメントに書いてある通りロックを制御するためのものであって、一定時間待つためには使えません。

投稿2022/03/23 01:10

int32_t

総合スコア20884

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

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

yoichiyy

2022/03/30 01:24

int32_t様、ご回答をどうもありがとうございました。 >copyTo() が非同期に動作するという情報は見つけられませんでした。 こうしたことをお教え頂くだけでも、大変助かります。 async await的な実装ができるようだというページを見つけましたので、こちらで試しに実装してみようと思っております。
guest

0

1.上記のコードでは、30000ミリ秒待機するように読めます。

ロックが解除されるまでブロックされると言う命令です。
ロックが解除されない場合、30000msでタイムアウトになってブロックが解除されます

投稿2022/03/22 22:41

y_waiwai

総合スコア87774

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

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

yoichiyy

2022/03/22 23:06

早速のご回答をどうもありがとうございます。 どうやら、このコードが まったく動いていないようでして・・・ 可能であれば、コードのどこか、書き方に誤りがあれば、お教え頂けますとありがたく思います。
penguin520

2022/03/29 15:24

トリガーを設定してください。
yoichiyy

2022/03/30 01:22

トリガーが設定されていなかったのですね…。 ものすごく基本的な情報だと思いつつ、こうしたところも気がついておりませんでしたので、大変助かります。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問