エラーについて
スプレッドシートを開くと、数式のセルが赤くハイライトされています:
Named range 'MyRange' does not exist
代わりに #REF! と表示されることもあり、ホバーすると名前付き範囲に関するエラーメッセージが表示されます。いずれの場合も原因は同じです:=SUM(MyRange) や =VLOOKUP(A1, MyRange, 2, FALSE) のような数式が、Sheetsで見つからない名前付き範囲を参照しているのです。その範囲が削除・名称変更されたか、このスプレッドシートで一度も定義されていないためです。
原因
Google Sheetsの名前付き範囲は、数式の中ではなくスプレッドシートレベルで保存されます。数式が実行されるたびに、Sheetsはその名前を検索してセル範囲に解決しようとします。名前が見つからない場合、このエラーが発生します。よくある原因は以下の通りです:
- データ → 名前付き範囲から、誰かが名前付き範囲を削除した
- 範囲の名前が変更されたが、数式は古い名前のままになっている
- 別のスプレッドシートから数式をコピーした(名前付き範囲はコピーされない)
- Apps Scriptが範囲を削除または別の名前で再作成した
- テンプレートをインポートしたが、名前付き範囲が含まれていなかった
簡単な修正方法:名前付き範囲を再作成する
対象のセルがわかっている場合、約30秒で作業が完了します。
- スプレッドシートを開く
- データ → 名前付き範囲(新しいバージョンではデータ → 名前付き範囲と保護された範囲)に移動する
- 範囲を追加をクリックする
- 数式が参照している正確な名前を入力する(ここでは
MyRange) - 範囲を設定する(例:
Sheet1!A2:A100) - 完了をクリックする
数式はすぐに解決されます。数式自体を編集する必要はありません。
範囲が何を指すべきかわからない場合
バージョン履歴を確認するのが最善策です。ファイル → バージョン履歴 → バージョン履歴を表示に移動し、範囲が削除される前の状態までさかのぼります。その古いバージョンで名前付き範囲パネルを開き、セル参照を確認してから、現在のバージョンに戻って手動で再作成します。
注意点として、名前付き範囲の削除は履歴上に「名前付き範囲が削除されました」とは表示されません。代わりに数式エラーとして現れます。見逃しやすいので注意が必要です。スプレッドシートが共有されている場合は、最後に編集した人に確認してみてください。下流の数式が壊れると気づかずに範囲名を変更していた可能性があります。
恒久的な対策:名前付き範囲を誤削除から保護する
Sheetsには名前付き範囲をロックする組み込み機能がありません。ただし、問題の再発を防ぐための実用的なアプローチが2つあります。
方法1:ソース範囲を保護する
名前付き範囲が指すセルをロックしても、名前自体が削除されるのを防ぐことはできません。しかし、これらのセルが重要であることを示すシグナルになり、基になるデータへの誤った編集を防ぐことができます。データ → シートと範囲を保護に移動し、範囲(例:Sheet1!A2:A100)を追加して、編集を自分または特定のユーザーに制限します。
方法2:ファイルを開いたときにApps Scriptで確認する
ファイルを開くたびに必要な名前付き範囲を確認するスクリプトを追加します。不足している範囲がある場合は、誰かが壊れた数式に遭遇する前にアラートが表示されます。
// ツール → Apps Script → 貼り付け → 保存 → 認証のためonOpenを一度実行
function onOpen() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const required = ['MyRange', 'TaxRate', 'ProductList']; // 名前付き範囲
const existing = ss.getNamedRanges().map(nr => nr.getName());
const missing = required.filter(name => !existing.includes(name));
if (missing.length > 0) {
SpreadsheetApp.getUi().alert(
'Missing Named Ranges',
'These named ranges are missing and may break formulas:\n\n' + missing.join('\n'),
SpreadsheetApp.getUi().ButtonSet.OK
);
}
}
ファイルを開いたすべての編集者に警告が表示されます。壊れた数式が何日も気づかれないままになることはなくなります。
方法3:Apps Scriptで不足している範囲を自動再作成する
完全な自動復旧が必要な場合は、スクリプトに期待する範囲の定義を保存しておきます。ファイルを開いたときに範囲が見つからない場合、自動的に再作成されます。
function ensureNamedRanges() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const definitions = [
{ name: 'MyRange', a1: 'Sheet1!A2:A100' },
{ name: 'TaxRate', a1: 'Sheet1!B1' },
];
const existing = ss.getNamedRanges().map(nr => nr.getName());
definitions.forEach(def => {
if (!existing.includes(def.name)) {
const range = ss.getRange(def.a1);
ss.setNamedRange(def.name, range);
console.log(`Recreated named range: ${def.name}`);
}
});
}
これを onOpen に連携させれば、削除されても範囲が自動的に復元されます。
別のスプレッドシートから数式をコピーした場合
名前付き範囲のスコープは、単一のスプレッドシートに限定されます。それだけです。スプレッドシートAからスプレッドシートBに数式をコピーすると、数式には引き続き MyRange と書かれていますが、スプレッドシートBはその名前を知りません。
修正方法:元のスプレッドシートを開いてデータ → 名前付き範囲に移動し、セル参照(例:A2:A100)を確認してから、コピー先のスプレッドシートで同じ名前付き範囲を定義します。
修正の確認
- エラーが表示されていたセルをクリックして、
#REF!ではなく値が表示されていることを確認する - データ → 名前付き範囲を開いて、
MyRangeがリストに表示されていることを確認する - 名前付き範囲のエントリをクリックする(Sheetsがソースセルをハイライト表示するので、正しいデータを指しているか確認できる)
- Apps Scriptを使用している場合は、エディターから
ensureNamedRanges()を手動で実行し、実行ログで再作成された範囲がないか確認する
クイックリファレンス
- エラーの原因:数式で参照している名前付き範囲が削除または名称変更された
- 即時の修正:データ → 名前付き範囲 → 正確な名前で範囲を追加する
- 予防策:ファイルを開いたときにApps Scriptで確認するか、ソースセルを保護する
- スプレッドシート間のコピー:名前付き範囲は転送されないため、コピー先で再定義が必要

