GASでスプレッドシートに名前付き範囲を
設定して参照する方法

GASのコードにgetRange("Sheet1!B2")のような座標を直書きすると、行を1つ挿入しただけで参照がずれて壊れます。名前付き範囲(Named Range=セル範囲に付けたわかりやすい名前)を使えば、getRangeByName("税率")のように名前で読み書きでき、範囲がずれても壊れないコードになります。設定管理にも便利な使い方を解説します。

|対象: GAS / スプレッドシート / 名前付き範囲

Table of Contents

名前付き範囲とは(座標の直書きをやめる)

名前付き範囲(Named Range)とは、スプレッドシートの特定のセル範囲に「税率」「集計対象」のようなわかりやすい名前を付ける機能です。 GASからはgetRangeByName("名前")でその範囲を直接取得でき、コードにB2のような座標を書かずに済みます。

一番の利点は「ずれに強い」ことです。名前付き範囲は、上に行を挿入して範囲が下にずれても自動で追従します。座標を直書きしたコードは行を1つ足すだけで壊れますが、名前で参照していれば壊れません。

設定値の一元管理

税率・送料・通知先などを設定シートに置き、名前で読み込む

行挿入に強いコード

範囲がずれても名前が追従するので参照が壊れない

読みやすい数式

シート上の数式でも =集計対象金額 のように書けて意味が伝わる

座標のハードコード削減

Sheet1!B2 のような呪文をコードから追い出せる

名前を付ける(setNamedRange)

名前を付けるのはsetNamedRange(名前, 範囲)です。ポイントは、シートではなくスプレッドシート本体(SpreadsheetApp.getActive())のメソッドである点です。1セルにも複数セルの範囲にも付けられます。

function createNamedRange() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("設定");

  // B2セルに税率、B3セルに送料などが入っている想定
  // B2の1セルに「税率」という名前を付ける
  ss.setNamedRange("税率", sheet.getRange("B2"));

  // 範囲(複数セル)にも名前を付けられる
  // 集計対象の金額列 C2:C1000 に「集計対象金額」と名付ける
  ss.setNamedRange("集計対象金額", sheet.getRange("C2:C1000"));
}

名前はスプレッドシート内で一意です。同じ名前でもう一度setNamedRangeを呼ぶと、その名前が指す範囲が新しい範囲に更新されます。

名前で読み取る(getRangeByName)

付けた名前で範囲を取り出すのがgetRangeByName(名前)です。戻り値はふつうのRangeなので、あとはgetValue()getValues()でいつも通り扱えます。

function readByName() {
  const ss = SpreadsheetApp.getActive();

  // 名前で範囲を取得(存在しなければ null が返る)
  const taxRange = ss.getRangeByName("税率");
  if (taxRange === null) {
    throw new Error("名前付き範囲「税率」が見つかりません");
  }

  // 1セルなら getValue で値を読む
  const taxRate = taxRange.getValue(); // 例: 0.1
  Logger.log("税率: " + taxRate);

  // 複数セルの範囲は getValues で二次元配列として読む
  const amounts = ss.getRangeByName("集計対象金額").getValues();
  const total = amounts.flat().reduce((sum, v) => sum + (Number(v) || 0), 0);
  Logger.log("合計: " + total);
}

注意点は、名前が存在しないとnullが返ることです。いきなり.getValue()を呼ぶとエラーになるため、上のように存在チェックを入れると安全です。

名前付き範囲に書き込む

名前付き範囲は読み取り専用ではありません。取得したRangesetValue()で書き込めます。「最終更新日時」のような1セルに、処理のたびに現在時刻を書き込む用途と好相性です。

function writeByName() {
  const ss = SpreadsheetApp.getActive();

  // 名前付き範囲は読み取りだけでなく書き込みにも使える
  // 「税率」の値を10%に更新
  ss.getRangeByName("税率").setValue(0.1);

  // 「最終更新日時」という名前のセルに現在時刻を書き込む
  const updated = ss.getRangeByName("最終更新日時");
  if (updated) {
    updated.setValue(new Date());
  }
}

座標を書かずに「意味のある名前」で読み書きできるため、あとからシートのレイアウトを変えても、名前さえ維持すればコードを直す必要がありません。

一覧を取得する(getNamedRanges)

いま何という名前がどこを指しているのかを確認するにはgetNamedRanges()を使います。戻り値はNamedRangeの配列で、それぞれgetName()getRange()を持ちます。

function listNamedRanges() {
  const ss = SpreadsheetApp.getActive();

  // スプレッドシート内のすべての名前付き範囲を取得
  const namedRanges = ss.getNamedRanges();

  namedRanges.forEach((nr) => {
    const name = nr.getName();                 // 名前
    const a1 = nr.getRange().getA1Notation();  // 実際に指している範囲
    const sheetName = nr.getRange().getSheet().getName();
    Logger.log(name + " -> " + sheetName + "!" + a1);
  });
}

名前付き範囲が重複していないか、意図しない範囲を指していないかの点検に使えます。定期処理の冒頭でログに出しておくと、トラブル時の調査が楽になります。

名前の変更・削除(rename / remove)

名前を変えたいときはNamedRange.setName(新しい名前)、削除したいときはNamedRange.remove()を使います。目的の名前はgetNamedRanges()から探します。

function manageNamedRanges() {
  const ss = SpreadsheetApp.getActive();

  // 名前を変更する(NamedRange オブジェクト経由)
  const target = ss.getNamedRanges().find((nr) => nr.getName() === "税率");
  if (target) {
    target.setName("消費税率"); // リネーム
  }

  // 特定の名前付き範囲を削除する
  const toRemove = ss.getNamedRanges().find((nr) => nr.getName() === "旧・集計対象");
  if (toRemove) {
    toRemove.remove(); // 名前だけ消える。セルの中身は残る
  }

  // ss.removeNamedRange("名前") でも削除できる
  // ss.removeNamedRange("集計対象金額");
}

大事な点は、remove()で消えるのは「名前の割り当て」だけで、セルの値そのものは消えないことです。名前を外しても表のデータは残ります。スプレッドシート本体のremoveNamedRange(名前)でも削除できます。

設定管理への応用と注意点

名前付き範囲は設定管理と相性が良い機能です。設定シートの各セルに名前を付けておき、まとめて読み込んで設定オブジェクトにするパターンが便利です。非エンジニアの担当者は設定シートの値を書き換えるだけでよく、GASコードを触る必要がありません。

// 設定シートの名前付き範囲を一括で読み、設定オブジェクトにまとめる
function loadConfig() {
  const ss = SpreadsheetApp.getActive();

  const names = ["税率", "送料", "無料配送の閾値", "通知先メール"];
  const config = {};

  names.forEach((name) => {
    const range = ss.getRangeByName(name);
    // 未設定でも落ちないよう、なければ null を入れておく
    config[name] = range ? range.getValue() : null;
  });

  // config.税率 のように、座標を意識せず設定値を使える
  Logger.log(JSON.stringify(config));
  return config;
}

1. 名前は英数字とアンダースコアが基本

名前の先頭は文字かアンダースコアにします。スペースや記号は使えず、A1B2のようなセル参照と紛らわしい名前も避けます。日本語も設定できますが、シート上の数式で使うときに扱いづらいため、英数字を推奨します。

2. 名前が指す範囲は固定サイズ

C2:C1000 のように付けた名前は、その範囲サイズのままです。データが1001行目まで増えても自動では広がりません。行が可変で増えるデータは、名前付き範囲よりgetDataRange()を使うか、列全体(C:C)に名前を付けると取りこぼしを防げます。

3. シート上の数式でもそのまま使える

GASで付けた名前は、シートのセルに=SUM(集計対象金額)のように直接書けます。コードとシートの数式で同じ名前を共有できるので、両方が読みやすくなります。

まとめ

名前付き範囲は、setNamedRangeで名前を付け、getRangeByNameで読み書きするのが基本です。座標を直書きしないので行挿入でずれても壊れず、コードもシートの数式も読みやすくなります。getNamedRangesで一覧を確認し、setName/removeで管理します。税率や通知先などの設定値を設定シートに集約して名前で読み込めば、コードを触らずに運用担当者が値を更新できる、保守しやすい仕組みになります。

よくある質問

スプレッドシートの特定のセル範囲に、A1やSheet1!B2:B10のような座標の代わりに「税率」「集計対象」といったわかりやすい名前を付ける機能です。GASからは getRangeByName("名前") でその範囲を直接取得でき、コード中に座標を直書きしなくて済みます。

行や列を挿入して範囲がずれても、名前付き範囲は自動で追従します。コードは範囲名で書いておけば座標のズレに強くなります。またSheet1!B2のような呪文のような参照が減り、コードとシートの数式の両方が読みやすくなります。

指定した名前の名前付き範囲が存在しない場合、getRangeByName は null を返します。名前のタイプミス、まだ setNamedRange で作成していない、別のスプレッドシートを見ている、のいずれかが原因です。使う前に if (range === null) でチェックすると安全です。

半角英数字とアンダースコア(_)が基本です。先頭は文字かアンダースコアにします。スペースや記号は使えず、A1やB2のようなセル参照と紛らわしい名前も避けます。日本語も設定できますが、シート上の数式で使うときに扱いづらいため、英数字を推奨します。

同じ名前で setNamedRange を呼ぶと、既存の名前付き範囲の指す範囲が上書き(更新)されます。名前はスプレッドシート内で一意です。作り直したいときは remove() で消してから作るか、同じ名前で setNamedRange を呼び直して範囲を更新します。

GAS開発・業務Webシステムを
相談する。

名前付き範囲を使った設定管理だけでなく、帳票の自動生成・PDF出力・Gmail通知など、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る