GASでなくてはならないgetRange
ですが、構造は理解していますか?
getRange
は範囲を決めるメソッドです。あくまで範囲を定めているだけなので範囲内のデータは取得されていません。
きちんと理解しておかないと期待通りの動作をしないことがあります、そのため今回ここでgetRangeについて改めておさらいしましょう。

取得したいデータが取得できていない!

getRangeの()内の範囲は合っているかな?ちゃんとgetValueとgetValuesを使い分けているかな?
getRangeの書き方
getRangeの書き方は次の4つの方法があります。
メソッド | 概要 |
getRange(row, column) | 指定された座標にある左上のセルの範囲を返します。 |
getRange(row, column, numRows) | 指定された座標にある左上のセルと、指定された行数を持つ範囲を返します。 |
getRange(row, column, numRows, numColumns) | 指定された行数と列数で、指定された座標にある左上のセルの範囲を返します。 |
getRange(a1Notation) | A1 表記または R1C1 表記で指定した範囲を返します。 |

なぜ英語なんだ、日本語でいいじゃないか…。

rowが行、columnが列、numがナンバーの略で数を表しているよ。よく使われる英語だから覚えておいて損はないよ。だけど今回はわかりやすく日本語にして説明してあげよう!
getRange(行, 列)

getRange(行,列)は一つのセルを修得する方法です。getRange(2,3)であれば、C2の一つのセルを取得しています。
getRange(行, 列, 行数)

行と列で指定した場所から下へ、記述した数の行を取得する方法です。getRange(2,3,4)であればC2からC5の範囲を取得しています。
getRange(行, 列, 行数, 列数)

行と列で指定した場所から下へ記述した数の行を取得し、さらに右方向へ記述した数の列を取得する方法です。getRange(2,3,4,2)であればC2からC5の範囲とD2からD5、つまりC2からD5の範囲を取得しています。
getRange(a1Notation)

A1形式とは、文字列を引数に範囲を指定する方法です。列をアルファベット、行を数字で表します。例えば、A列の1行目のセルはA1、B列の2行目のセルはB2です。文字を引数に渡す場合は””で閉じます。A1からC3までを取得するにはgetRange("A1:C3")
です。

数字が一つでも違うと取得するデータの範囲が大きく変わっちゃうんだね

そうだよ、だからスプレッドシートでは行と列は大切なんだ!内容が一緒のくせに、行と列の位置関係が違うデータとか本当に本当に処理が手間だからテンプレート化しておくことは大切だね

(なんだか私怨があったような…)
getRangeを使った応用
場合によっては離れた場所の範囲を取得したいことや、範囲が不確定なデータを取得したいことがあります。次にご紹介します。
離れたセル(複数範囲を指定)を取得する
残念ながらgetRangeでは離れたセルを取得はできません。getRangeメソッドは1度に一つの範囲しか取得できないためです。もし離れたセルを取得したい場合は、新たにgetRangeを使った変数を準備する必要があります。
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var a = ss.getRange("A1:B4").getValues();
var b = ss.getRange("D1:E6").getValues();
}

上記のように記述することで、A1からB4の8セル、D1からE6の12セルの合計20セルを選択しています。
最終行を取得
データの最終行まで取得したい場合は、getRangeにgetLastRowを組み合わせます。getLastRowは最終行の行数を返すメソッドです。最終行が10行目であれば10を返します。これはデータが追加されていくようなスプレッドシートによく使われます。
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow = ss.getLastRow();
//A列のみ最終行まで取得
var a = ss.getRange(1,1,lastRow).getValues();
}
上記のコードは、A列のみの最終行を取得しています。複数列取得したい場合は、(1,1,lastRow,取得したい列数)を書いてください。取得開始場所を変更したい場合は、1,1の箇所を変更します。変数が入っていますが、この書き方はgetRange(行, 列
と同じです。, 行数
), 列数
最終列を取得
最終列を取得する方法は、getLastColumnを使用します。getLastColumnは最終列を取得するメソッドです。最終列がE列の場合は5を返します。
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastColumn = ss.getLastColumn();
//A1から最終列までを取得
var a = ss.getRange(1,1,1,lastColumn).getValues();
}
上記のコードは、A1から最終列までの1行を取得しています。複数行取得したい場合は、(1,1,取得したい行数,lastColumn)と書いてください。
取得開始場所を変更したい場合は、1,1の箇所を変更します。変数が入っていますが、この書き方はgetRange(行, 列
と同じです。, 行数
), 列数
最終行かつ最終列の範囲を取得
getRangeにgetLastRowとgetLastColumnを組み合わせて、データの範囲を全て取得します。
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow = ss.getLastRow();
var lastColumn = ss.getLastColumn();
var a = ss.getRange(1,1,lastRow,lastColumn).getValues();
}
A1から最終行、最終列までのデータを取得しています。取得開始場所を変更したい場合は、1,1の箇所を変更します。例えば1番上がヘッダー(タイトル)の場合はgetRange(2,1,lastRow,lastColumn)とすることで2行目から取得できます。

最終行や最終列が不明な場合はgetDataRangeも役立つよ

getDataRange?
【番外編】全てのデータ範囲を取得するgetDataRange
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var a = ss.getDataRange().getValues();
}
getDataRangeはスプレッドシート上にある全てのデータ範囲を選択するメソッドです。先ほどのgetLastRowとgetLastColumn使った最終行と最終列を取得するコードと同じ動作をしますが、getDataRangeの方がコードが簡潔です。
ただし、getDataRangeはスプレッドシート内のすべてのセルの値が取得するため、データが膨大であったり、コードが複雑であったりすると処理速度が遅くなることがあります。
データ量や要件によってgetRangeとgetDataRangeを使い分けることが大切です。では、最後にgetRangeとよく合わせて使用されるgetValueについてご紹介して終わりにします。

もう頭がいっぱいだよう

getValueが落とし穴になるケースもあるからね!きちんと覚えておきましょう

…はあい
getValueとgetValues

冒頭でも説明しましたが、getRangeはデータ範囲を取得するだけですので、範囲内のデータを取得したい場合は他のメソッドを使用します。範囲内のデータを取得するメソッドには、getValueとgetValuesの2種類があります。
getValue
は、特定のセルからひとつのデータを取得します。getRangeで複数のセルを選択していても返すのは左上の一つのセルだけです。
getValues
は、getRangeが指定した範囲のセルにある全てのデータを取得します。取得したデータは1行を1配列として配列の中に配列を持つ二次元配列として取得されています。
このようにgetValueとgetValuesとでは取得できる範囲や取得したデータに違いがあるのです。とはいえ、(左上の)ひとつのセルを使いたい場合はgetValue、複数のセルを使いたい場合はgetValuesと考えておけば間違いないでしょう。

ひとつのセルはgetValue、複数のセルはgetValuesだね!

よくできました!
まとめ
スプレッドシートにGASを組み込むにあたり、必ず目にするgetRangeについて今回ご紹介させていただきました。きちんと理解しておくと、思った通り動作する簡潔なプログラムを書くことができます。ぜひ、getRangeを使いこなして、作業効率化してみてくださいね!
コメント