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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

1回答

780閲覧

for if文内の処理について

Yoshi0576

総合スコア3

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2021/06/28 04:38

前提・実現したいこと

スプレッドシートにある"見積発行"シートで更新した情報を"DB"シートの同じ見積番号がある行に上書き、見積番号が無ければ"DB"シートの最終行に追加するスクリプトを書いています。

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

コードを実行すると見積番号が一致した場合、情報の上書きと最終行への追加動作の両方が行われます。
if文内にログを入れて実行すると3行目で見積番号が一致する前にelse内の動作が実行されてしまいます。

実行ログ
13:08:02 お知らせ 実行開始
13:08:40 情報 Message inside Eles
13:08:40 情報 Message inside Eles
13:08:40 情報 Matched quote
13:08:04 お知らせ 実行完了

該当のソースコード

function uploadQuote() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheetPrint = ss.getSheetByName("見積発行"); const sheetDB = ss.getSheetByName("DB"); const uploadData = sheetPrint.getRange(6,13,1,218).getValues()[0]; const quoteNumber = uploadData[0]; const lastRowDB = sheetDB.getLastRow();// DBシートの最終行を取得 const dbRange = sheetDB.getRange(1,1,lastRowDB).getValues();// DBシートのA列 for (var i = 0; i < lastRowDB; i++) { if (dbRange[i].toString() === quoteNumber) { console.log("Matched quote number");// 見積番号が一致したら上書き break; } else { console.log("Message inside Eles");// 見積番号が一致しなければ、最終行に追加 } } }

試したこと

サンプルで別のコードを書くと、if分が終了する前にelse分へ飛んでしまう事は無かったのですが、作成中のコードでどうしてこの様な動作になってしまうのかが分かりません。
すみませんがお力添えをお願いします。

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

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

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

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

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

neconekocat

2021/06/28 04:50

やりたいことはdbRangeのなかに1つもquoteNumberが存在していなければ最終行に追加、であってますか?
Yoshi0576

2021/06/28 04:59

そういった動作になるようにしたいと考えています。
itagagaki

2021/06/28 06:12

console.logでdbRange[i].toString()やquoteNumberの値も表示させてみれば何かわかるのでは?
Yoshi0576

2021/06/28 06:48

console.logでdbRange[i].toString()とquoteNumberの値が同一である事は確認出来たのですが、その後の動作が制御出来ませんでした。
guest

回答1

0

ベストアンサー

ループのたびにif文が実行されるから表記のような現象が起こります。
フラグ等を利用して上手く処理してください。

GAS

1var flag = false; 2for (var i = 0; i < lastRowDB; i++) { 3 if (dbRange[i].toString() === quoteNumber) { 4 flag = true; 5 // 上書き 6 break; 7 } 8} 9 10if (flag == false) { 11 // 追加 12} 13

投稿2021/06/28 06:31

neconekocat

総合スコア443

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

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

Yoshi0576

2021/06/28 06:50

ありがとうございます。 アドバイス頂いた様に修正した所、意図した動作になりました。この様な書き方があると勉強になりました。
neconekocat

2021/06/28 08:19

一応補足しておくと非常に古いやり方になります。 GAS(JavaScript)に慣れてきたらArray.prototypeのメソッド群を使い倒すことになると思われるので、あまりこのやり方に固執しないようにしたほうがいいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問