GASでスプレッドシートに名前付き範囲を
設定して参照する方法
GASのコードにgetRange("Sheet1!B2")のような座標を直書きすると、行を1つ挿入しただけで参照がずれて壊れます。名前付き範囲(Named Range=セル範囲に付けたわかりやすい名前)を使えば、getRangeByName("税率")のように名前で読み書きでき、範囲がずれても壊れないコードになります。設定管理にも便利な使い方を解説します。
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()を呼ぶとエラーになるため、上のように存在チェックを入れると安全です。
名前付き範囲に書き込む
名前付き範囲は読み取り専用ではありません。取得したRangeにsetValue()で書き込めます。「最終更新日時」のような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. 名前は英数字とアンダースコアが基本
名前の先頭は文字かアンダースコアにします。スペースや記号は使えず、A1やB2のようなセル参照と紛らわしい名前も避けます。日本語も設定できますが、シート上の数式で使うときに扱いづらいため、英数字を推奨します。
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開発をご相談いただけます。