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

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

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

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

Q&A

解決済

3回答

5266閲覧

GASのfor文がうまく動いてくれない

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

0グッド

0クリップ

投稿2019/07/05 23:08

編集2019/07/08 23:48

前提・実現したいこと

for (var flg = 0; flg < 3; flg=flg+1) {

flgが3よりも小さい間、繰り返しを行いたいのですが、
i=1の場合までの処理は結果として戻ってくるのですが、
その後の結果が出てくれません。

下記の条件を通過させる為にはどうしたら良いでしょうか?

else if (i = 2) {
var valueColumn = 12 ;
}

else if (i = 2) {
var setRow = 4 ;
}

該当のソースコード

function mainMessage(event) { //スプレッドのURLを指定 var ss = SpreadsheetApp.openById("スプレッドシートのID"); // 一覧を連想配列化 var sheet1 = ss.getSheetByName('シート2'); var sheet2 = ss.getSheetByName('シート1'); var kvRow = 2; // 開始する行数を定義(ヘッダは省く) var lastRow = sheet1.getLastRow(); //****************************************************** var i=0 Logger.log(i); for (var flg = 0; flg < 3; flg=flg+1) {       var keyColumn = 1; // キーの列を定義 if (i == 0) { var valueColumn = 2 ; } else if (i == 1) { var valueColumn = 11 ; } else if (i == 2) { var valueColumn = 12 ; } else { } var kvData = sheet1.getRange(kvRow, keyColumn, sheet1.getLastRow(), valueColumn).getValues(); Logger.log(kvData); var kvDic = {}; for each(var kv in kvData) { kvDic[kv[keyColumn - 1]] = kv[valueColumn - 1]; } // 値をセットする var sheet2 = ss.getSheetByName('シート1'); var startRow = 2; // 開始する行数を定義(ヘッダは省く) var targetColumn = 1; // キーになるコードの列を指定 var targetData = sheet2.getRange(startRow, targetColumn, sheet2.getLastRow(), 1).getValues(); Logger.log(targetData); var setData = []; for each(var targetRow in targetData) { setData.push([kvDic[targetRow[0]]]); } if (i == 0) { var setRow = 2 ; } else if (i == 1) { var setRow = 3 ; } else if (i == 2) { var setRow = 4 ; } else { } var setColumn = 2; // 挿入したい列数 sheet2.getRange(setRow, setColumn, sheet2.getLastRow(), 1).setValues(setData); i=flg; Logger.log(flg); Logger.log(i); }

ログ
イメージ説明

試したこと

GAS初心者、プログラム未経験のため、対策がわかりません。
はじめは条件式の誤りかと思いましたが、何度やってもうまくいきません。
どこかの設定が抜けているのではと思いますが、それすらもわかりません。

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

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

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

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

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

papinianus

2019/07/11 15:06

で==にしたらどうなったのですか。図が改まってませんよ。
guest

回答3

0

ifで代入をしないでください。最低でも=は2つ==です。話はそれからです。

できればまともな開発環境を使ってください。webstormをすすめときます。

javascript

1function mainMessage(event) { 2 3//スプレッドのURLを指定 4 var ss = SpreadsheetApp.openById("スプレッドシートのID"); 5// 一覧を連想配列化 6 var sheet1 = ss.getSheetByName('シート2'); 7 var sheet2 = ss.getSheetByName('シート1'); 8 var kvRow = 2; // 開始する行数を定義(ヘッダは省く) 9 var lastRow = sheet1.getLastRow(); 10 11//****************************************************** 12 var i = 0 13 Logger.log(i); 14 for (var flg = 0; flg < 3; flg = flg + 1) { 15 16 var keyColumn = 1; // キーの列を定義 17 18 if (i = 0) { 19 var valueColumn = 2; 20 } else if (i = 1) { 21 var valueColumn = 11; 22 } else if (i = 2) { 23 var valueColumn = 12; 24 } else { 25 26 } 27 28 var kvData = sheet1.getRange(kvRow, keyColumn, sheet1.getLastRow(), valueColumn).getValues(); 29 Logger.log(kvData); 30 var kvDic = {}; 31 for each(var kv 32 in 33 kvData 34 ) 35 { 36 kvDic[kv[keyColumn - 1]] = kv[valueColumn - 1]; 37 } 38 39// 値をセットする 40 var sheet2 = ss.getSheetByName('シート1'); 41 var startRow = 2; // 開始する行数を定義(ヘッダは省く) 42 var targetColumn = 1; // キーになるコードの列を指定 43 var targetData = sheet2.getRange(startRow, targetColumn, sheet2.getLastRow(), 1).getValues(); 44 45 Logger.log(targetData); 46 var setData = []; 47 48 for each(var targetRow 49 in 50 targetData 51 ) 52 { 53 setData.push([kvDic[targetRow[0]]]); 54 } 55 56 if (i = 0) { 57 var setRow = 2; 58 } else if (i = 1) { 59 var setRow = 3; 60 } else if (i = 2) { 61 var setRow = 4; 62 } else { 63 64 } 65 66 var setColumn = 2; // 挿入したい列数 67 sheet2.getRange(setRow, setColumn, sheet2.getLastRow(), 1).setValues(setData); 68 i = flg; 69 Logger.log(flg); 70 Logger.log(i); 71 } 72} 73

投稿2019/07/06 08:56

papinianus

総合スコア12705

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

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

0

最後のi=flgが変数宣言の頭varが無いので、グローバルになっているのでは?

投稿2019/07/06 08:15

hiroshi0240

総合スコア640

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

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

papinianus

2019/07/06 09:02

おなじコードをみているとしたら12行目のvar i = 0ではだめでしょうか? またグローバルだとして、意図通り動作しない理由がわかりませんので補足してくださると助かります。
hiroshi0240

2019/07/06 11:10

確かに。 よく読めていませんでした。 ただIf文で=になっているので、最終的にiが2に代入されている状態かとは思うのですが、その後flgで代入されているとしたらログ上は0,1が残るかと思ったのですが、そうで無い理由は?と思いまして。変数宣言して再定義してしまえばとりあえずは変わるかなと
papinianus

2019/07/06 15:31

その疑問への答えはおそらくログを出したときと掲示のコードが違うから、だと思います。 13行目でログ出力を試みているのに、1が出力されたことになっている時点で、確実に違います。 また、現時点でのコードではi = i + 1もありません。 またこのif / else if ブロックを実行すると必ずiは1になります。なので2が繰り返しログ記録されているのは、図にあるとおり、i = i + 1がログに出されているのだと想像できます。 最終的に、冒頭に書いたようにログ時点とはコードが違う、と考えます。
macaron_xxx

2019/07/08 01:08 編集

>if / else if ブロックを実行すると必ずiは1になります。 0では? あ、i = 0 でfalseとみなされるのか…。
hiroshi0240

2019/07/08 04:53

ま、いずれにせよpapinianusさんの言う通り、「ifで代入をしないでください。」ってことですね。小生の回答で皆様を混乱させお騒がせいたしました。
退会済みユーザー

退会済みユーザー

2019/07/08 08:09

意図通り動作しない理由についてですが、 私はfor文が3回実行を条件としているのですが、2回目の実行結果がスプレッドで 吐き出されたら、なぜか3回目を通らず処理が終わってしまうのを困っています。
hiroshi0240

2019/07/08 09:03

ログを見る限りは3回実行されてますよね。そういう問題では無く、if文の中でiが0の時と表現したいのであれば、i==0と書かないと表現出来ないと言うことです。i=0のままでは、iは0ですと言い切っていることになるんです。
退会済みユーザー

退会済みユーザー

2019/07/14 22:43

for文で3回実行でログでは動いているはずなのに、3回目の結果がスプレッドに書き出されないので、 ものは試しにfor文を外してみた処、『データの行数が範囲の行数と一致してません』というエラーで ひっかっており、これを治した処正常に結果が出るようになりました。
guest

0

ベストアンサー

for (var flg = 1; flg < 3; flg+1) {

flgの値が0のまま変更されないので、これでは無限ループになってしまいますね
ああ、flgの内容は1のまま変わらない、ですね

投稿2019/07/05 23:29

編集2019/07/05 23:54
y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2019/07/05 23:47

すみません、flg = 1で、flgに1の値が代入されているわけではないのでしょうか? 何が足りないのでしょうか?
y_waiwai

2019/07/05 23:53 編集

flg+1 では、flgの内容に1が足されますが、その結果はどこにも代入されてません。 これを実行しても flg は1のままです やるなら、 flg=flg+1 とか、 flg++ とかやらないと、flgの内容は増えません
退会済みユーザー

退会済みユーザー

2019/07/06 00:09

書き方に間違いがあったことは、わかりましたが、 『flg=flg+1』と『flg++』のどちらも試しても、変化がなく、 1万行のマスタを参照している為、マスタ件数が多いのが原因かと思って、 わざとデータを1件にしてみても、問題が改善されませんでした。
y_waiwai

2019/07/06 00:12

そもそも、mainMessage関数が実行されているのか、をチェックしてみれば。
退会済みユーザー

退会済みユーザー

2019/07/06 00:55

チェックをかけてみますと、 for文の条件とその中でうごくif文を同じflgを変数に見ていたで、 for文は、変数flgを if文は、変数iを それぞれ見るようにして、 for文を実行する前にvar i = 1; を代入し、ログでflgとiの 動きを確認した処、for文は1づつ増えていることを確認することができました。 これでfor文はうまく回っていると思います。 しかし、iという変数については if文を抜けたら、i = i + 1; と 書いているのですが、ずっとiには1が入ったままになってしまいます。
papinianus

2019/07/06 01:44

最新の状態に質問を修正してください
退会済みユーザー

退会済みユーザー

2019/07/06 02:19

papinianusさん、最新の状態で質問を修正しました。 ご確認いただけますか?よろしくお願いします。
y_waiwai

2019/07/06 08:19

> if文を抜けたら、i = i + 1; と そういう箇所は見当たりませんが このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問