【GAS GoogleAppsScript | スプレッドシート】セルの範囲を配列で取得する!

スポンサーリンク

セルの範囲を配列で取得する

スプレッドシートでセル範囲を操作するとき、配列で取得してメモリ上で処理をするとスプレッドシートへのアクセス回数を減らすことができ、プログラムの実行時間を短くすることが出来ます。

更には配列で処理することにより、複雑な処理もできるようになるので必須の知識と言えます。

今回は、スプレッドシートのセル範囲を配列で取得する方法を紹介します!

次のサンプルでやっていきましょう!

サンプル

配列で取得する方法

セル範囲を配列で取得するには、RangeクラスのgetValuesメソッドを使います。

構文

Rangeオブジェクト.getValues()

次のコードをご覧ください。

function test(){
  
  // セルの範囲を取得する
  var range = SpreadsheetApp.getActiveSheet().getRange("A1:C7")

 // セル範囲の値を2次元配列で取得する
 var values = range.getValues()
  
  // ログに書き出す
  Logger.log(values)
}

見出し込みの、A1:C7の範囲を2次元配列で取得して、取得した2次元配列をログに書き出すコードです。

実行すると、ログには次のような2次元配列が表示されます。(見やすいように改行しています。)

配列で取得するのはこれだけです。簡単ですね(^^)

データをいじる場合は、このまま配列で処理をしていきます。

取得したデータに1行追加する

1行データを追加してみましょう!追加するには、Arrayオブジェクトのpushメソッドを使います。

構文

Arrayオブジェクト.push(追加したいデータ)

[ひらちん、1組, 500]のデータを追加しましょう。

function test(){
  
  // セルの範囲を取得する
  var range = SpreadsheetApp.getActiveSheet().getRange("A1:C7")

 // セル範囲の値を2次元配列で取得する
 var values = range.getValues()
  
 // 1行追加する
  values.push(["ひらちん", "1組", 500])

  // ログに書き出す
  Logger.log(values)
}

実行してログを確認すると、次のようにデータが追加されていることがわかります。

データを差し替える

指定したインデックスのデータを差し替えることが出来ます。

構文

Arrayオブジェクト.splice(インデックス番号, 変更する行数,変更したいデータ)

ちょっと分かりにくいかもしれませんが、第1引数には、変更したいインデックス番号を入れます。見出しのデータを変更しようと思うと、インデックス番号は「0番」なので「0」を入れます。

次の第2引数、変更する行数はそこから何行変更するかです。今回は見出しだけなので「1」を入れます。

最後に変更後のデータです。同じデータ形式で["name", "class", "point"]としましょう。

function test(){
  
  // セルの範囲を取得する
  var range = SpreadsheetApp.getActiveSheet().getRange("A1:C7")

 // セル範囲の値を2次元配列で取得する
 var values = range.getValues()
  
 // 指定したインデックスの行データを引数で指定したデータに差し替える
  values.splice(0, 1,["name", "class", "point"])

  // ログに書き出す
  Logger.log(values)
}

実行すると、ログには次の2次元配列が表示されます。

指定したとおり、見出しのデータが替わりましたね(^^)

先頭のデータを抜き出す

先頭のデータを抜き出すには、Arrayオブジェクトのshiftメソッドを使います。

構文

Arrayオブジェクト.shift()

やってみましょう。

function test(){
  
  // セルの範囲を取得する
  var range = SpreadsheetApp.getActiveSheet().getRange("A1:C7")

 // セル範囲の値を2次元配列で取得する
 var values = range.getValues()
  
 // 先頭の行を抜き出す
  var firstRow = values.shift()

  // ログに書き出す
  Logger.log(firstRow)
  Logger.log(values)
}

事項すると、firstRowにはインデックスの["名前", "クラス", "得点"]が抜き出されています。

valuesの方は、抜き出されてしまっているので、見出し以外のデータが表示されます。

処理したデータをシートに戻す

処理したデータをスプレッドシートに戻すには、RangeオブジェクトのsetValuesメソッドを使います。

構文

Rangeオブジェクト.setValues(配列)

見出しをアルファベットに修正して、スプレッドシートにデータを戻しましょう。

function test(){
  
  // セルの範囲を取得する
  var range = SpreadsheetApp.getActiveSheet().getRange("A1:C7")

 // セル範囲の値を2次元配列で取得する
 var values = range.getValues()
  
 // 指定したインデックスの行データを引数で指定したデータに差し替える
  values.splice(0, 1,["name", "class", "point"])

  // スプレッドシートに戻す
  range.setValues(values)
}

実行すると次の図のように、見出しが変わったデータが書き込まれます。

行数が変わる場合などは、書き込む前に、シートのデータをclearContentsメソッドで消しておくなど工夫をしておいた方が予期せミスを減らせると思います(^^)

まとめ

セルの範囲を配列で取得して操作する方法を紹介しました!