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

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

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

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

Q&A

解決済

2回答

393閲覧

データのある最終行まで値を取得したいです。

kamaboco3

総合スコア2

Google Apps Script

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

0グッド

1クリップ

投稿2023/03/17 12:21

実現したいこと

プログラミング初心者ですがGASを初めて使って、
特定の値がある列を含む行を削除するコードを作成しています。
その作成途中でつまづいた点があるので、まずはそこを解決したいです。
ご助力のほどおねがいします。

前提

A列に任意の値
C~D列に「1」がある行を削除
※最終行は変動あり

列1列2列3
りんご00
みかん01
たまねぎ10

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

getRange内にlastRowを挿入して値を取得すると、
値はあるのにログ上で後半数行が空白になってしまい、
for文で「undefined」になる箇所が発生してしまいます。

※lastRowで取得した最終行は正しいです。

該当のソースコード

function myFunction() {
let ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let lastRow = ss.getLastRow();
let range = ss.getRange(4,3,lastRow,2).getValues().flat();
console.log(range);
for(let i = 4; i <= range.length; i++){
console.log(range[i]);
}
}

試したこと

getRange内の行指定をlastRowではなく、具体的に指定すると空白になる現象が軽減されます。

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

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

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

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

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

YellowGreen

2023/03/17 14:12

getRangeで4行目から値を取得しているのに for (let i = 0; i < range.length; i++) { とせずに i = 4としているの理由をお教えください。
YellowGreen

2023/03/17 14:14

理由がわからなければ、 for のところは ↑のようにしてみてはいかがですか。 rangeは、配列なので最初の要素のインデックスは 0 です。 なので i の上限は i < range.length で全ての要素が参照されます。
guest

回答2

0

ベストアンサー

リファレンスを確認して戻り値が何なのか、引数として指定するのは何なのかを確認しましょう

getLastRow() はコンテンツが含まれている最後の行の位置を返します。

質問にある情報ですと、提示されているデータはA4から3行分データがあるのだと思います。
その時にgetLastRowは6が返ってくることになります。

そしてgetRange(row, column, numRows, numColumns)の引数は
row Integer 範囲の開始行インデックス。行のインデックス登録は 1 から始まります。
column Integer 範囲の開始列のインデックス。列のインデックスは 1 から始まります。
numRows Integer 返される行数。
numColumns Integer 返される列の数。
となっています。

なのでnumRowsの部分にgetLastRowで得たものを指定すると6となり開始から6行しゅとくすることになります。

またgetValuesで得られる配列は4行目からデータを取得したからといって添え字が4から始まるわけではありません。
どのような配列が返ってくるかデバッガで確認しましょう。

投稿2023/03/17 13:58

YAmaGNZ

総合スコア10222

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

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

kamaboco3

2023/03/19 03:38

ご回答大変ありがとうございます! >numRows Integer 返される行数 こちらが今まで認識違いをしていたようです(取得したい行数だと思っていました)。 ログを見直してみると、4行目からlastRow(6行)取得なので3行空白ができることが理解できました! === [ [ 0, 1 ], [ 0, 0 ], [ 1, 0 ], [ '', '' ], [ '', '' ], [ '', '' ] ] ※flat()を一旦解除 === 丁寧な説明、大変ありがとうございます。 実用したいスプレッドシートには1~5行までヘッダーがあり、 値を取得したいのは6行目以降のデータになります。 6行目からデータがある最終行をgetRangeしたいこの場合はlastRowは向いていないということで合ってますか?
guest

0

getRange内のlastRowをヘッダー分マイナスに指定することで空白が出なくなりました。

ご助力いただき大変ありがとうございました!
次のステップへ進みたいと思います。

投稿2023/03/20 01:55

kamaboco3

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問