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

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

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

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

Q&A

解決済

2回答

1338閲覧

GAS:for文の繰り返し処理がされない(Google Apps Script)

381

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2023/01/05 04:03

編集2023/01/05 04:04

前提

スプレッドシートでGASを書いています。(初心者です。)

for文を定義しているのですが、繰り返し処理がされない事象が発生。
別の実行コードでは同じ書き方で処理されていたのに、それをコピペしたこちらでは繰り返し処理がされず色々と調べたのですが、logを吐き出して見ていても理由が分からず質問するに至りました。

大きなコードの一部を取り出して原因究明をしています。
こちらに貼り付けるコードは自分で究明して問題になっている部分のみとしています。

どなたかご解明よろしくお願い申し上げます。

実現したいこと

以下のコード例で言うと、

①36行目15列にある「7」という数値を利用して
②36行目から42行目までの7行分の値(値も7列分)を
③二次元配列として吐き出して
④最終的には指定した範囲(getvaluesの範囲と行列数の一致が必要、は理解済み)に③をsetvalues
※以下では④のコードは省いています。

したい、という内容です。

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

このコードは大きなコードの一部ですが、
大きいコード側でgetRange時に行数がうまく取得できず、

Exception: The number of rows in the range must be at least 1.

が出て、以下コードで言う var mb11ves = [ ]
に配列が入っておらず空欄で行数が返されてない、というところから掘って原因究明を進めているところです。

以下のコードでは現時点で1行7列だけはpushして希望の行が配列取れていますが、処理が終わってしまい7回繰り返してくれません。

コードを分解してデバッグしていましたがどうやらfor文がうまく機能していないのではというところまで突きつめたのですが、その理由が分からず詰んでいます。

該当のソースコード

function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('案件管理表'); var row = 36;//セルの行数を取得 var mb11v = sheet.getRange(row, 15).getValue();//件数(36行:15列のvalueは7という数値) for (var i = mb11v; i > 0; i--) { //以下の値(7列)を繰り返し回数分取得して配列に格納したいmb11v回数から1づつ減算することで繰り返し処理を設定 var mb11ves = [] mb11ves.push ( sheet.getRange(row - 1 + i , 30).getValue() ,sheet.getRange(row - 1 + i , 32).getValue() ,sheet.getRange(row - 1 + i , 31).getValue() ,sheet.getRange(row - 1 + i , 33).getValue(),sheet.getRange(row - 1 + i , 34).getValue(),sheet.getRange(row - 1 + i , 35).getValue(),sheet.getRange(row - 1 + i , 37).getValue() ); } console.log(sheet.getRange(row -1 + i , 30).getValue() );//なぜかこれがiが0で35行目のデータ(14)を拾ってくる。42行目が欲しいのに。 console.log(i);//0と出る console.log(row);//これは36と出る(当たり前) console.log(mb11v);//これも7と出る console.log([sheet.getRange(row - 1 + i , 30).getValue() ,sheet.getRange(row - 1 + i , 32).getValue()]) //試しに2列分のログを出力。42行30列(32列)のvalueにならず、35行30列のvalueを返してしまう、、、iが0扱いで、繰り返し処理もしない、、、) console.log(mb11ves);//ここは欲しいデータの頭の36行目の配列が吐き出されるが、1行分しか返さず繰り返し処理がされない、mb11vが7の設定なので、7行分繰り返したい }

試したこと

該当部分だけ抜き出して、変数を実数にしてテストしていました。
以下ログです。
[ 14, 17710 ]は35行目で欲しくない値です。
[ 21, 20189, 13, 11536, 8653, 5500, 3153 ]は36行目で欲しい情報ですが、そこから7回、42行目までが繰り返されません。

【当方環境での実行ログ】
12:50:04 お知らせ 実行開始
12:50:05 情報 14
12:50:05 情報 0
12:50:05 情報 36
12:50:05 情報 7
12:50:05 情報 [ 14, 17710 ]
12:50:05 情報 [ 21, 20189, 13, 11536, 8653, 5500, 3153 ]
12:50:05 お知らせ 実行完了

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

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

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

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

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

guest

回答2

0

for の中で配列を毎回初期化しているからじゃないでしょうか

投稿2023/01/05 04:08

yuma.inaura

総合スコア1453

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

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

381

2023/01/05 05:30

有り難うございます。最初にご回答いただきまhした方と同じ点でのご指摘でした。 有り難うございます!
guest

0

ベストアンサー

不具合の原因

  • 毎回forの中で配列を初期化(配列を空に)しているので、forの最後の繰り返し処理の値しかpushされていません。
  • そしてpushで作る配列が2次元配列になってないのではないでしょうか?
🚫 質問者様のコードの完成配列例:

javascript

1mb11ves = [ 1行目の30列目の値, 1行目の32列目の値, 1行目の31列目の値, 以下略 ]
✅ 必要な完成配列例:

javascript

1mb11ves = [ 2 [7行目の30列目の値, 7行目の32列目の値, 7行目の31列目の値, 以下略], 3 [6行目の30列目の値, 6行目の32列目の値, 6行目の31列目の値, 以下略], 4 (中略) 5 [1行目の30列目の値, 1行目の32列目の値, 1行目の31列目の値, 以下略], 6]

修正コード

動作確認をしていませんが、これでどうでしょう?

javascript

1function myFunction() { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var sheet = ss.getSheetByName('案件管理表'); 4 5 var row = 36; 6 var mb11v = sheet.getRange(row, 15).getValue(); 7 var mb11ves = []; // ここで配列を宣言 8 9 for (var i = mb11v; i > 0; i--) { 10 // var mb11ves = [] // 削除 11 mb11ves.push([ // 2次元配列にするために [ をつける 12 sheet.getRange(row - 1 + i, 30).getValue(), sheet.getRange(row - 1 + i, 32).getValue(), sheet.getRange(row - 1 + i, 31).getValue(), sheet.getRange(row - 1 + i, 33).getValue(), sheet.getRange(row - 1 + i, 34).getValue(), sheet.getRange(row - 1 + i, 35).getValue(), sheet.getRange(row - 1 + i, 37).getValue() 13 ]); // 2次元配列にするために ] をつける 14 } 15}

投稿2023/01/05 04:31

編集2023/01/05 04:55
Cocode

総合スコア2314

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

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

381

2023/01/05 05:30

お世話になります。ご丁寧に解説有り難うございました! 大変分かりやすく問題解決できました。 for文の{ }中で配列宣言しているので繰り返しの度に空になっていたのですね、、、 お恥ずかしいErrorでした。。。 これで前へ進めます!有り難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問