こんにちは!
Yuki (@yukibnb) です。
Google Apps Script (GAS) でスプレッドシートのセル範囲や値を取得する方法をまとめました。
GASやJavascriptを勉強し始めた方でもわかりやすいように例や図を用いて紹介します。
【2020/9/21公開】
初心者の方向けにgetRangeメソッドの考え方を図入り解説した記事を公開しました。getRangeメソッドについて本記事だけではわかりにくい場合、こちらの記事もご覧ください。
「セル範囲の取得」と「値の取得」の違い
セルに入力されている値を取得するためには、ふたつの操作を行う必要があります。
- セル範囲を取得する
- 取得した範囲内の値を取得する
例えば以下のような消耗品のリストで考えましょう。
全ての品名と単価を取得したい場合、
- B2~C11までの範囲を取得する (getRange)
- その範囲に入力されている値を取得する (getValues)
という流れになります。
範囲の取得はgetRange、値の取得はgetValuesというメソッドを使用します。
getRangeはあくまで範囲を取得しただけです。範囲を取得した後に「値を取得して」と命令しなければいけません。
//アクティブなスプレッドシートを取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); //アクティブなシートを取得 var sh = ss.getActiveSheet(); //getRangeで範囲を指定し、getValuesで値を取得 var 変数名 = sh.getRange('{範囲}').getValues();
なお単一のセル(例: A1セル)の値を取得する場合はgetValuesではなくgetValueとなります。単一のセルなので複数形(Values)ではなく単数形(Value)となるわけです。
ではgetRangeとgetValue (getValues) について詳しく見ていきましょう。
セル範囲を取得する - getRange -
getRangeを使ったセル範囲の指定方法はいろいろあります。順番に見ていきましょう。
セル番地で取得する
セル番地とはB3、N46、B2:C11というようなものです。以下のようなコードになります。
//単一セルを取得する場合 var 変数名 = sh.getRange('N46'); //複数セルを取得する場合 var 変数名 = sh.getRange('B2:C11');
スプレッドシートやExcelの関数でセル範囲を指定するのと同じ方法なのでわかりやすいですね。
行番号と列番号で取得する
セル番地ではなく行番号と列番号を用いてセル範囲を取得する方法があります。
セル番地で取得したふたつのセル範囲「N46」と「B2:C11」を書き換えると以下のようになります。
//N46セルを取得 var 変数名 = sh.getRange(46,14); //B2:C11を取得 var 変数名 = sh.getRange(2,2,10,2);
なんだか急にわかりにくくなりましたね。はじめは覚えにくいかもしれませんが慣れると迷わず使用できるようになりますので安心してください!
使い方は以下の通りです。
//単一セルを取得する場合 var 変数名 = sh.getRange({行番号},{列番号}); //複数セルを取得する場合 var 変数名 = sh.getRange({行番号},{列番号},{行数},{列数});
N46セルの行番号は46、列番号は14なので、getRange(46,14)となります。単一セルの場合はわかりやすいですね。
次にB2:C11のセル範囲を取得する場合、起点となるセルはB2です。B2の行番号は2、列番号は2です。
2行目から11行目までの行数は10、B列からC列までの列数は2です。
そのためgetRange(2,2,10,2)となります。
範囲指定になると数字が4つあり急にややこしくなりました。図にすると以下のようなイメージです。
何回か使っていくうちにすぐ慣れるので、セル番地よりも行番号と列番号を使用した取得方法をおすすめします。
補足: 列番号の簡単な確認方法
ちなみに行番号はスプレッドシートに数字が書かれているのですぐわかりますが、列番号はアルファベットを数字に変換するのは面倒ですよね。
「AQ列の列番号は?」と考えても頭ですぐ計算できないと思います。
そんな時はセルに 「=column()」という関数を入力するとそのセルの列番号が表示されます。
もしくは「=column(セル番地)」と入力すると指定したセル番地の列番号が表示されます。
セル範囲の値を取得する - getValue & getValues -
無事セル範囲を取得できましたので、いよいよセル範囲に入力されている値を取得しましょう。
単一セルの値を取得する - getValue -
A1やN46などの単一セルの値を取得する場合、getValueメソッドを使用します。Valueが単数形ですね。
N46セルの値を取得する場合、以下のようなコードになります。どちらのコードでもN46セルに入力されている値を取得できます。
//N46セルの値を取得 (セル番地指定で) var 変数名 = sh.getRange('N46').getValue(); //N46セルの値を取得 (行番号と列番号指定で) var 変数名 = sh.getRange(46,14).getValue();
ちなみに上記の例ではひとつの変数内にgetRangeとgetValueの両方を含めましたが、分割することも可能です。
//N46のセル範囲を取得 (セル番地指定で) var range = sh.getRange('N46'); //N46セルの値を取得 var 変数名 = range.getValue(); //N46のセル範囲を取得 (行番号と列番号指定で) var range = sh.getRange(46,14); //N46セルの値を取得 var 変数名 = range.getValue();
複数セルの値を取得する - getValues -
B2:C11などの複数セルの値を取得する場合、getValuesメソッドを使用します。Valueが複数形ですね。
B2:C11セルの値を取得する場合、以下のようなコードになります。どちらのコードでもB2:C11セルに入力されている値を取得できます。
//B2:C11セルの値を取得 (セル番地指定で) var 変数名 = sh.getRange('B2:C11').getValues(); //B2:C11セルの値を取得 (行番号と列番号指定で) var 変数名 = sh.getRange(2,2,10,2).getValues();
単一セルの時と同じくgetRangeとgetValueを二つの変数に分割することも可能です。
//B2:C11のセル範囲を取得 (セル番地指定で) var range = sh.getRange('B2:C11'); //B2:C11セルの値を取得 var 変数名 = range.getValues(); //B2:C11のセル範囲を取得 (行番号と列番号指定で) var 変数名 = sh.getRange(2,2,10,2); //B2:C11セルの値を取得 var 変数名 = range.getValues();
getRangeでセル範囲さえ取得できれば、その中にある値を取り出すのはgetValueかgetValuesを使用するだけなので簡単ですね。
補足: getValuesは二次元配列で値を取得
getValuesで取得した値は二次元配列で変数に格納されます。
例えばB2~C11のセル範囲をgetValuesで取得すると以下のような二次元配列で変数に格納されます。
[[シャンプー, 500.0], [コンディショナー, 500.0], [ボディソープ, 500.0], [ハンドソープ, 300.0], [ティッシュ, 300.0], [トイレットペーパー, 300.0], [ゴミ袋, 200.0], [食器洗剤, 200.0], [洗濯洗剤, 300.0], [柔軟剤, 300.0]]
赤色の配列の中に青色の配列が入っていますね。このような形式を二次元配列と言います。
GASでスプレッドシートを操作する上で二次元配列を理解することはとても重要です。
二次元配列以前にそもそも配列って何?という方もいらっしゃると思います。配列や二次元配列については別記事で詳しく解説しますのでお楽しみに!
【2019/8/30追記】
二次元配列について詳しく紹介する記事を投稿しました。よければご覧ください!
www.yukibnb.com
まとめ
今回の記事ではセル範囲や値を取得する方法を紹介しました。少しでも参考になればうれしいです。
- セル範囲を取得 《getRangeメソッド》
- セル番地で指定
- 行番号と列番号で指定
- セル範囲内の値を取得 《getValue / getValuesメソッド》
【2020/9/21公開】
初心者の方向けにgetRangeメソッドの考え方を図入り解説した記事を公開しました。getRangeメソッドについて本記事だけではわかりにくい場合、こちらの記事もご覧ください。