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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3701閲覧

GASの配列格納後のセル指定。for以下に記述すると[列]部が「undefined」となる

rsmt

総合スコア5

Google Apps Script

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/03/23 06:47

前提・実現したいこと

gasにてガントチャートに類似したタスク進捗管理表を作成中。
高速化のため配列処理への書き換えを試みていますが、
下記問題でつまづいています。
やりたいこととしては、作業開始日/完了日の入力有無により未着手、仕掛中、完了を表示したいです。
下記問題はつまづいているところまで記載しています。
(ifの作成はこれから)

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

配列格納後、セルを指定しようとしたところ、for以下に記述すると[列]部が「undefined」となる。forが無い場合、同じ記述内容でも指定セルの値は正しく取得できる。

■for以下に記述 ※「undefined」になる
function hairetu_test() {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var lastRow = sheet.getLastRow();

//二次元配列として取得
var values = sheet.getRange(1,1,lastRow,39).getValues();
//for用の変数
var count = values.length;

var c1 = 11;
var c2 = 12;

for(var r_test = 4 ; r_test <= count; r_test++){
var array_jissekistart = values[r_test][c1]//ここの「c1」11が取得できず「undefined」になる
var array_jissekiend = values[r_test][c2]

Logger.log(array_jissekistart);
}
}

■forが無い場合 ※正しく取得
function hairetu_test() {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var lastRow = sheet.getLastRow();

//二次元配列として取得
var values = sheet.getRange(1,1,lastRow,39).getValues();
//for用の変数
var count = values.length;

var c1 = 11;
var c2 = 12;
var r_test = 4
var array_jissekistart = values[r_test][c1]
var array_jissekiend = values[r_test][c2]

Logger.log(array_jissekistart);
}

試したこと

変数では無く数値で入力した場合も同様に「undefined」とfor無しは正しく取得できる。
Logger.logで確認済み。Webで調べても記述内容の誤りが見つけきれず。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

典型的コードミスであります。

for(var r_test = 4 ; r_test <= values.length; r_test++){ var array_jissekistart = values[r_test][c1] var array_jissekiend = values[r_test][c2] Logger.log(array_jissekistart); }

原因は配列の仕様に対する勘違いかと思います。
配列は「0」から数えますが、lengthメソッドは要素数を1から数えます。
そのため、要素が1つ多いと判断され、参照エラーを起こしていると思われます。

for(var r_test = 4 ; r_test < values.length; r_test++){ var array_jissekistart = values[r_test][c1] var array_jissekiend = values[r_test][c2] Logger.log(array_jissekistart); }

また、要素数を1つずつ行うのでしたら、for~of構文またはforeachメソッドを用いるのが現在のトレンドであります。前者は対応しておりませんでしたが、現在では実装されたので問題なく使うことができます。

投稿2020/03/23 07:47

zigutabi

総合スコア57

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

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

rsmt

2020/03/23 09:33

ありがとうございます!!! forでも正しく取得できました。 初歩的なミスすいません!!for~of試してみます。
guest

0

理由は簡単です。

forループで回した最後のcountの場所に値が入っていないからではないかと。r_test<=countではなくr_test < countにすれば。forは0からカウントしますので、ラストが10行目ならr_test < 10とします(が10は11行目になります)。なので、countを使うならばcount - 1としたら最後まで取れるのではないかと。。

javascript

1function hairetu_test() { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var sheet = ss.getActiveSheet(); 4 var lastRow = sheet.getLastRow(); 5 6 //二次元配列として取得 7 var values = sheet.getRange(1,1,lastRow,11).getValues(); 8 //for用の変数 9 var count = values.length; 10 var c1 = 11; 11 12 for(var r_test = 4 ; r_test < count; r_test++){ 13 var array = values[r_test][c1]; 14 15 Logger.log(r_test); 16 } 17}

サンプルファイル

投稿2020/03/23 07:27

officeforest

総合スコア412

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

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

rsmt

2020/03/23 09:37

<=から<に変えると正しく取得できました。 ありがとうございます!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問