GASのgetDataRange()は便利だけど使用する際には注意が必要

getDataRangeとは

getDataRangeは値が存在するすべてのセル範囲を取得できるGoogle Apps Scriptのメソッド。

以下のように書けばシート内のすべてのセル範囲を取得できる。

function getData() {
  return SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheetByName('シート1')
    .getDataRange()
    .getValues()
}

Logger.log(getData())

見出しはslice(1)で除く

getDataRangeは見出しのセルの値も取得してしまうため、以下のようなセルになっている場合はid, nameの部分も取得してしまって都合が悪い。

idname
1sato
2yamada

見出しはslice(1)を付けておけば取得されるのは[[1.0, sato], [2.0, yamada]]となるので必ず付けておこう。

function getData() {
  return SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheetByName('シート1')
    .getDataRange()
    .getValues()
    .slice(1)
}

Logger.log(getData())
// => [[1.0, sato], [2.0, yamada]]

getDataRangeは列の追加に注意

getDataRangeはすべてのセル範囲を取得できるため、データの入力列がA列, B列だけだとしても例えばD列5行目に何か値が追加されたら入力されている最終行、最終列のすべての範囲を取得してしまう。

上図の場合は[[1.0, sato, , ], [2.0, yamada, , ], [, , , ], [, , , メモ: id9まで後日追記]]を取得してしまう。

そのため、複数人で編集していているシートでgetDataRangeを使用する場合はシートの保護で特定の範囲以外はセルを編集できないようにしたほうが良い。

特定の範囲の場合はgetRangeを検討する

前述の通りgetDataRangeはすべてのセル範囲を取得できるので便利だが、間違えて無駄に大量に取得してしまう可能性もある。

もし、取得する範囲が可変ではなくA列, B列の範囲のみと固定されている場合はgetRangeを使用するようにしたほうが良いだろう。

function getData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const lastRow = ss.getLastRow() - 1
  return ss
    .getSheetByName('シート1')
    .getRange(2, 1, lastRow, 2)
    .getValues()
}

Logger.log(getData())