スプレッドシートで、データが入ってる範囲だけ取る

GAS

※本記事はプロモーションを含みます

目次

Google Apps Script (GAS) は、スプレッドシートの作業を自動化するツールです。業務の自動化ツールを作成する際に、作業の基本となるのがシート内のデータを取得する処理です。実際の仕事では、日々に増減するデータへ対応する必要があるので、データが存在する全範囲をまとめて取得したい場面がよくあります。

GASを用いてシート内のデータが存在する全範囲を取得する目的を達成するために、具体的なコード例とその仕組みを解説します。なので、実際の作業でつまづきやすい注意点までをしっかり確認しましょう。

行数が毎日変わるシート向け

スプレッドシートのデータをGASで扱う場合、特定のセル範囲を固定で指定することもできます。ただし、実際の業務データは常に追加や削除が行われるので、行数や列数が変動するのが普通です。固定の範囲を指定すると、追加されたデータが処理から漏れてしまいます。なので、データが減った際に空白の部分まで処理してエラーの原因になります。

データが増減しても自動で対応して、シートにあるデータ全範囲を一度で取得することは大事です。というのは、データ全範囲の取得が、崩れにくく管理しやすいプログラムを作る第一歩になるからです。

今ある範囲をまとめて取る

以下に示すコードは、開いているシートのデータ全範囲を取得する標準的なプログラムです。なので、そのままコピーして利用しましょう。

const sheet = SpreadsheetApp.getActiveSheet();
const data = sheet.getDataRange().getValues();
Logger.log(data);

範囲の枠と値は別

コードを1行ずつ確認しましょう。

  • 1行目:const sheet = SpreadsheetApp.getActiveSheet();
    1行目の処理では、SpreadsheetAppが現在開かれているスプレッドシートからアクティブなシートを取得します。取得したシートの情報は、変数sheetに保存されます。
  • 2行目:const data = sheet.getDataRange().getValues();
    2行目の処理は、このプログラムの中で最も重要です。sheet.getDataRange()がデータが存在する範囲を特定するので、直後のgetValues()が範囲内の値を一括で取得します。取得したデータは、変数dataに保存されます。
  • 3行目:Logger.log(data);
    3行目の処理は、変数dataの中身をログに出力します。なので、正しいデータが取れているかを画面で確認しましょう。

端と端で四角を取る

上記のコードが便利な理由について、GASの仕組みから解説します。

getDataRangeの仕様:矩形範囲を自動特定

getDataRange()というメソッドは、シート内でデータが入っている四角形の範囲を自動で特定します。

例えば、A1セルからD100セルまでデータが入っている場合、GASは自動でA1:D100という範囲を特定します。この機能がデータの量を自動で判断するので、最終行や最終列を自分で計算する手間が省けます。

配列取得:getValues()で2次元配列として一括取得

getDataRange()が取得する対象は、どこからどこまでという範囲の枠組みだけです。なので、枠組みの中に入っている文字や数字を取るために getValues() を使います。

getValues()を実行すると、取得したデータは2次元配列という形式でまとめて読み込まれます。2次元配列というのは、配列の中にさらに配列が入っているデータ構造のことです。スプレッドシートの行と列の形が、そのままプログラムに読み込まれます。

スプレッドシート上のイメージ 2次元配列の構造イメージ(変数dataの中身)
1行目: [A1の値, B1の値] [ [“A1の値”, “B1の値”],
2行目: [A2の値, B2の値] [“A2の値”, “B2の値”] ]

GASにおいては、セルへ何度もアクセスして書き換える処理を行うと、処理の速度が遅くなります。なので、getValues()を使ってデータを2次元配列として一括取得する書き方が使われます。

取った配列を1行ずつ見る起点

取得した2次元配列のデータは、すべてのデータを順番に処理するときの起点になります。というのは、実際の業務において、以下のような自動化で使われるからです。

  • 一斉メール送信システム: 顧客リストの全データを取得し、ループ処理で一行ずつメールアドレスや氏名を読み込みながら、パーソナライズされた内容でメールを自動送信する。
  • データの条件抽出と転記: 売上台帳の全データを取得し、「売上金額が5万円以上」や「特定の担当者」といった条件に合致するデータのみを抽出し、別のシートや外部システムに一括転記する。
  • 外部APIとの連携: スプレッドシートにある商品リストの全データを取得し、ループ処理で一つずつ在庫管理APIにリクエストを送って最新の在庫数を取得・更新する。

A1 と E50 だけ埋まっていても四角になる

getDataRange()は便利な機能です。ただし、実務で安全に使うためには、事前に知っておくべき注意点があります。というのは、取得した範囲の中に空の行や列が含まれる場合があるので、データの空判定が必要になるからです。

getDataRange()は、データが存在する一番端のセルを基準にして四角形の範囲を取得します。例えば、A1セルとE50セルだけにデータがあり、間のセルが空欄でも、取得される範囲はA1:E50になります。なので、間に存在する空白のセルは、2次元配列の中に空文字として読み込まれます。

空文字が入る現象を無視して処理を進めると、宛先が無いメールが送信されてエラーになります。なので、空のデータが登録されるといった不具合が起きやすくなります。

空判定の実装例

不具合を防ぐために、取得した2次元配列を繰り返し処理する際は、条件分岐のif文を使ってデータが空でないかを毎回確認しましょう。

const sheet = SpreadsheetApp.getActiveSheet();
const data = sheet.getDataRange().getValues();

// データを1行ずつループ処理
data.forEach(function(row) {
  // 【空判定】例えば1列目(A列)が空欄の場合は処理をスキップする
  if (row[0] === "") {
    return; // forEach内のreturnはcontinue(スキップ)と同義
  }
  
  // 空でない場合のみ、後続の処理を実行
  Logger.log(row[0] + "の処理を実行します");
});

GASでデータ範囲を取得する際は、プログラムをコピーするだけでは足りません。なので、仕組みを理解したうえで、空白のデータを除外する空判定の処理も一緒に作成しましょう。

タイトルとURLをコピーしました