
INDIRECT関数で別シートを参照する方法|シート名をセルから切り替える
「INDIRECTで別シートを参照したい」
という場合、まず結論からです。
たとえばB4セルに「東京支店」と入力されていて、そのシートのB5を参照したい場合は、以下でOKです。
=INDIRECT("'"&B4&"'!B5")B4が「大阪支店」なら大阪支店のB5、B4が「福岡支店」なら福岡支店のB5を参照します。
普通に別シートを参照するだけなら、
='東京支店'!B5でも問題ありません。
INDIRECTを使うメリットは、参照するシート名をセルの値によって切り替えられることです。
INDIRECT関数で別シートを参照する基本形
まず、参照するシートが最初から決まっている場合はこう書けます。
=INDIRECT("'東京支店'!B5")ただし、これだけなら通常の、
='東京支店'!B5で十分です。
INDIRECTが便利なのは、シート名をセルから指定するときです。
B4に「東京支店」と入力されている場合、
=INDIRECT("'"&B4&"'!B5")とします。
この数式では、
'東京支店'!B5という文字列を作り、それをINDIRECT関数が「実際のセル参照」として読み取っています。
B4を書き換えるだけで、参照するシートも変わります。
普通の別シート参照との違い
通常の別シート参照は、
='東京支店'!B5です。
一方、INDIRECTを使う場合は、
=INDIRECT("'"&B4&"'!B5")となります。
違いはシンプルです。
参照先が固定なら通常の参照、参照するシートを切り替えたいならINDIRECT。
たとえば、
東京支店
大阪支店
福岡支店
2026年7月
2026年8月
2026年9月
のように、同じ形式のシートが複数ある場合に便利です。
実際に動かしてみる
分かりやすいように、簡単な参考シートも作りました。
「東京支店」「大阪支店」「福岡支店」の3つのシートがあり、集計画面のプルダウンから支店名を選択できます。
東京支店から大阪支店へ変更すると、INDIRECTで参照している売上データも一緒に切り替わります。
数式だけ見るより、一度プルダウンを触ってみた方が仕組みは分かりやすいと思います。
実務ではどう使える?
INDIRECTは、支店を切り替えるだけでなく、月別管理との相性もいいです。
たとえば営業データを、
「2026年7月」
「2026年8月」
「2026年9月」
というシートに分けて管理しているとします。
通常なら、確認したい月のタブを毎回開く必要があります。
そこで別に「営業レポート」というシートを作り、
対象月:2026年9月という選択欄を用意します。
このセルをINDIRECTで参照すれば、対象月を変えるだけで、
売上見込合計
案件数
受注件数
担当者別売上
案件一覧
などを選択した月から取得できます。
管理職が毎月複数のタブを開かなくても、1つの営業レポートから確認できるイメージです。
SUMやCOUNTIFとも組み合わせられる
INDIRECTは他の関数とも組み合わせられます。
たとえばB4に参照したいシート名が入っている場合、D5を合計するなら、
=SUM(INDIRECT("'"&B4&"'!D5:D20"))受注になっている案件数を数えるなら、
=COUNTIF(INDIRECT("'"&B4&"'!E5:E20"),"受注")のように使えます。
すべての関数を覚える必要はありません。
まずは、
「INDIRECTを使えば、セルに書かれたシート名を参照先として使える」
と理解しておけば十分です。
GASでサンプルシートを一発作成する
今回紹介している簡易参考シートと営業レポートは、どちらもGASで作成しています。
Googleスプレッドシートを開いて、
「拡張機能」→「Apps Script」を開く
コードを貼り付ける
createExampleSpreadsheet を実行する
基本的にはこれだけです。
👇「CASE-001-A」のスプレッドシートを作成したGASのコード👇
function createExampleSpreadsheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const names = ['INDIRECT練習', '東京支店', '大阪支店', '福岡支店'];
names.forEach(name => resetSheet_(ss, name));
createBranchSheet_(ss.getSheetByName('東京支店'), '東京支店', [
['商品A', 320000],
['商品B', 480000],
['商品C', 210000],
['商品D', 530000],
['商品E', 390000]
]);
createBranchSheet_(ss.getSheetByName('大阪支店'), '大阪支店', [
['商品A', 410000],
['商品B', 350000],
['商品C', 580000],
['商品D', 260000],
['商品E', 440000]
]);
createBranchSheet_(ss.getSheetByName('福岡支店'), '福岡支店', [
['商品A', 290000],
['商品B', 460000],
['商品C', 370000],
['商品D', 510000],
['商品E', 330000]
]);
createPracticeSheet_(ss.getSheetByName('INDIRECT練習'));
ss.setActiveSheet(ss.getSheetByName('INDIRECT練習'));
}
function resetSheet_(ss, name) {
let sheet = ss.getSheetByName(name);
if (!sheet) {
sheet = ss.insertSheet(name);
} else {
const filter = sheet.getFilter();
if (filter) filter.remove();
sheet.getMergedRanges().forEach(r => r.breakApart());
sheet.clear();
sheet.clearConditionalFormatRules();
}
sheet.setHiddenGridlines(true);
return sheet;
}
function createBranchSheet_(sheet, name, data) {
sheet.getRange('A1:B1').merge()
.setValue(name + '|売上データ')
.setBackground('#1F4E78')
.setFontColor('#FFFFFF')
.setFontWeight('bold')
.setFontSize(16);
sheet.getRange('A2:B2').merge()
.setValue('INDIRECT練習シートから参照される元データです。')
.setBackground('#D9EAF7');
sheet.getRange('A4:B4')
.setValues([['商品名', '売上金額']])
.setBackground('#4472C4')
.setFontColor('#FFFFFF')
.setFontWeight('bold');
sheet.getRange(5, 1, data.length, 2).setValues(data);
sheet.getRange('B5:B9').setNumberFormat('¥#,##0');
sheet.getRange('A4:B9')
.setBorder(true, true, true, true, true, true);
sheet.setColumnWidth(1, 180);
sheet.setColumnWidth(2, 140);
sheet.setFrozenRows(4);
}
function createPracticeSheet_(sheet) {
sheet.getRange('A1:F1').merge()
.setValue('INDIRECT関数|別シート参照')
.setBackground('#1F4E78')
.setFontColor('#FFFFFF')
.setFontWeight('bold')
.setFontSize(18);
sheet.getRange('A2:F2').merge()
.setValue('B4のシート名を変えるだけで、参照する別シートが切り替わります。')
.setBackground('#D9EAF7');
sheet.getRange('A4')
.setValue('参照シート')
.setBackground('#D9E2F3')
.setFontWeight('bold');
sheet.getRange('B4')
.setValue('東京支店')
.setBackground('#FFF2CC')
.setFontWeight('bold');
const rule = SpreadsheetApp.newDataValidation()
.requireValueInList(['東京支店', '大阪支店', '福岡支店'], true)
.setAllowInvalid(false)
.build();
sheet.getRange('B4').setDataValidation(rule);
// 基本形
sheet.getRange('A6:F6').merge()
.setValue('① 別シートの1セルを参照')
.setBackground('#4472C4')
.setFontColor('#FFFFFF')
.setFontWeight('bold');
sheet.getRange('A7').setValue('数式');
sheet.getRange('B7:D7').merge()
.setValue(`=INDIRECT("'"&B4&"'!B5")`)
.setBackground('#F3F3F3');
sheet.getRange('E7').setValue('結果');
sheet.getRange('F7')
.setFormula(`=INDIRECT("'"&B4&"'!B5")`)
.setNumberFormat('¥#,##0')
.setBackground('#E2F0D9')
.setFontWeight('bold');
// 範囲
sheet.getRange('A10:F10').merge()
.setValue('② 別シートの範囲を参照')
.setBackground('#4472C4')
.setFontColor('#FFFFFF')
.setFontWeight('bold');
sheet.getRange('A11:B11')
.setValues([['商品名', '売上金額']])
.setBackground('#D9E2F3')
.setFontWeight('bold');
sheet.getRange('A12')
.setFormula(`=INDIRECT("'"&$B$4&"'!A5:A9")`);
sheet.getRange('B12')
.setFormula(`=INDIRECT("'"&$B$4&"'!B5:B9")`);
sheet.getRange('B12:B16').setNumberFormat('¥#,##0');
// SUMとの組み合わせ
sheet.getRange('A19:F19').merge()
.setValue('③ 選択したシートの売上を合計')
.setBackground('#4472C4')
.setFontColor('#FFFFFF')
.setFontWeight('bold');
sheet.getRange('A20').setValue('SUM+INDIRECT');
sheet.getRange('B20:D20').merge()
.setValue(`=SUM(INDIRECT("'"&B4&"'!B5:B9"))`)
.setBackground('#F3F3F3');
sheet.getRange('E20').setValue('合計');
sheet.getRange('F20')
.setFormula(`=SUM(INDIRECT("'"&B4&"'!B5:B9"))`)
.setNumberFormat('¥#,##0')
.setBackground('#E2F0D9')
.setFontWeight('bold')
.setFontSize(15);
// 通常参照との違い
sheet.getRange('A23:F23').merge()
.setValue('通常参照との違い')
.setBackground('#4472C4')
.setFontColor('#FFFFFF')
.setFontWeight('bold');
sheet.getRange('A24:C26').setValues([
['方法', '数式', '特徴'],
['通常参照', "='東京支店'!B5", '東京支店に固定'],
['INDIRECT', `=INDIRECT("'"&B4&"'!B5")`, 'B4から参照先を変更']
]);
sheet.getRange('A24:C24')
.setBackground('#D9E2F3')
.setFontWeight('bold');
sheet.getRange('A24:C26')
.setBorder(true, true, true, true, true, true)
.setWrap(true);
sheet.setColumnWidth(1, 150);
sheet.setColumnWidth(2, 190);
sheet.setColumnWidth(3, 170);
sheet.setColumnWidth(4, 100);
sheet.setColumnWidth(5, 90);
sheet.setColumnWidth(6, 140);
sheet.setFrozenRows(2);
}👇「CASE-001-B」のスプレッドシートを作成したGASのコード👇
/**
* =========================================================
* INDIRECT関数 実務サンプル
* 月別営業シート → 営業レポート
*
* 実行関数:
* createExampleSpreadsheet
* =========================================================
*/
function createExampleSpreadsheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const names = [
'営業レポート',
'2026年7月',
'2026年8月',
'2026年9月'
];
names.forEach(function(name) {
resetSheet_(ss, name);
});
// ==============================
// 2026年7月
// ==============================
createMonthlySheet_(
ss.getSheetByName('2026年7月'),
'2026年7月',
[
['佐藤', '株式会社青空商事', 'システム導入', 850000, '受注'],
['鈴木', '東都産業', '業務改善', 620000, '商談中'],
['田中', '中央企画', 'データ分析', 480000, '受注'],
['佐藤', '未来物流', '営業支援', 730000, '商談中'],
['高橋', '西日本商事', '管理ツール', 560000, '失注'],
['鈴木', 'サンライト', '集計自動化', 910000, '受注']
]
);
// ==============================
// 2026年8月
// ==============================
createMonthlySheet_(
ss.getSheetByName('2026年8月'),
'2026年8月',
[
['佐藤', '東海販売', '営業管理', 920000, '受注'],
['鈴木', 'グリーン物流', '集計改善', 540000, '受注'],
['田中', '北斗産業', '顧客管理', 680000, '商談中'],
['高橋', '大阪テクノ', 'データ統合', 780000, '商談中'],
['佐藤', '未来教育', 'レポート自動化', 430000, '失注'],
['田中', 'ネクスト企画', '案件管理', 1020000, '受注']
]
);
// ==============================
// 2026年9月
// ==============================
createMonthlySheet_(
ss.getSheetByName('2026年9月'),
'2026年9月',
[
['佐藤', '関西商事', '販売管理', 1100000, '受注'],
['鈴木', '西部サービス', '営業支援', 760000, '商談中'],
['田中', 'オリオン企画', 'データ整理', 630000, '受注'],
['高橋', '中央食品', '集計自動化', 890000, '商談中'],
['佐藤', '光栄産業', '業務管理', 720000, '商談中'],
['鈴木', '未来住宅', '顧客管理', 980000, '受注']
]
);
// ==============================
// 営業レポート
// ==============================
createReportSheet_(
ss.getSheetByName('営業レポート')
);
ss.setActiveSheet(
ss.getSheetByName('営業レポート')
);
}
/**
* =========================================================
* シート初期化
* =========================================================
*/
function resetSheet_(ss, name) {
let sheet = ss.getSheetByName(name);
if (!sheet) {
sheet = ss.insertSheet(name);
} else {
// フィルタ削除
const filter = sheet.getFilter();
if (filter) {
filter.remove();
}
// グラフ削除
const charts = sheet.getCharts();
charts.forEach(function(chart) {
sheet.removeChart(chart);
});
// 結合セル解除
const mergedRanges =
sheet.getDataRange().getMergedRanges();
mergedRanges.forEach(function(range) {
range.breakApart();
});
// 内容・書式初期化
sheet.clear();
sheet.clearConditionalFormatRules();
}
sheet.setHiddenGridlines(true);
return sheet;
}
/**
* =========================================================
* 月別営業シート作成
* =========================================================
*/
function createMonthlySheet_(
sheet,
month,
data
) {
// ==============================
// タイトル
// ==============================
sheet.getRange('A1:E1').merge();
sheet.getRange('A1')
.setValue(month + '|営業案件')
.setBackground('#1F4E78')
.setFontColor('#FFFFFF')
.setFontWeight('bold')
.setFontSize(16)
.setVerticalAlignment('middle');
sheet.setRowHeight(1, 36);
// ==============================
// 説明
// ==============================
sheet.getRange('A2:E2').merge();
sheet.getRange('A2')
.setValue(
'この月の営業案件を管理するシートです。営業レポートからINDIRECT関数で参照します。'
)
.setBackground('#D9EAF7')
.setWrap(true);
sheet.setRowHeight(2, 36);
// ==============================
// ヘッダー
// ==============================
sheet.getRange('A4:E4').setValues([
[
'担当者',
'顧客名',
'案件内容',
'売上見込',
'状況'
]
]);
sheet.getRange('A4:E4')
.setBackground('#4472C4')
.setFontColor('#FFFFFF')
.setFontWeight('bold')
.setHorizontalAlignment('center')
.setVerticalAlignment('middle');
// ==============================
// データ
// ==============================
sheet.getRange(
5,
1,
data.length,
5
).setValues(data);
// 金額表示
sheet.getRange('D5:D20')
.setNumberFormat('¥#,##0');
// 罫線
sheet.getRange(
4,
1,
data.length + 1,
5
).setBorder(
true,
true,
true,
true,
true,
true
);
// 折り返し
sheet.getRange('A5:E20')
.setWrap(true);
// ==============================
// 列幅
// ==============================
sheet.setColumnWidth(1, 110);
sheet.setColumnWidth(2, 190);
sheet.setColumnWidth(3, 190);
sheet.setColumnWidth(4, 130);
sheet.setColumnWidth(5, 100);
sheet.setFrozenRows(4);
}
/**
* =========================================================
* 営業レポート作成
* =========================================================
*/
function createReportSheet_(sheet) {
// ==============================
// タイトル
// ==============================
sheet.getRange('A1:H1').merge();
sheet.getRange('A1')
.setValue('営業月次レポート')
.setBackground('#1F4E78')
.setFontColor('#FFFFFF')
.setFontWeight('bold')
.setFontSize(18)
.setVerticalAlignment('middle');
sheet.setRowHeight(1, 38);
// ==============================
// 説明
// ==============================
sheet.getRange('A2:H2').merge();
sheet.getRange('A2')
.setValue(
'対象月を変更すると、INDIRECT関数で参照する月別シートが自動的に切り替わります。'
)
.setBackground('#D9EAF7')
.setWrap(true);
sheet.setRowHeight(2, 36);
// ==============================
// 月選択
// ==============================
sheet.getRange('A4')
.setValue('対象月(2026年)')
.setBackground('#D9E2F3')
.setFontWeight('bold');
sheet.getRange('B4')
.setValue('8月')
.setBackground('#FFF2CC')
.setFontWeight('bold')
.setHorizontalAlignment('center');
const monthRule = SpreadsheetApp
.newDataValidation()
.requireValueInList(
[
'7月',
'8月',
'9月'
],
true
)
.setAllowInvalid(false)
.build();
sheet.getRange('B4')
.setDataValidation(monthRule);
// ==============================
// 実際に参照するシート名
// ==============================
sheet.getRange('D4')
.setValue('参照シート')
.setBackground('#D9E2F3')
.setFontWeight('bold');
sheet.getRange('E4')
.setFormula(
'="2026年"&B4'
)
.setBackground('#F3F3F3')
.setFontWeight('bold');
// ==============================
// KPI:売上見込合計
// ==============================
createKpi_(
sheet,
'A6:B6',
'A7:B8',
'売上見込合計',
'=SUM(INDIRECT("\'2026年"&$B$4&"\'!D5:D20"))',
'¥#,##0'
);
// ==============================
// KPI:案件数
// ==============================
createKpi_(
sheet,
'D6:E6',
'D7:E8',
'案件数',
'=COUNTA(INDIRECT("\'2026年"&$B$4&"\'!B5:B20"))',
'0'
);
// ==============================
// KPI:受注件数
// ==============================
createKpi_(
sheet,
'G6:H6',
'G7:H8',
'受注件数',
'=COUNTIF(INDIRECT("\'2026年"&$B$4&"\'!E5:E20"),"受注")',
'0'
);
// ==============================
// 案件一覧タイトル
// ==============================
sheet.getRange('A11:H11').merge();
sheet.getRange('A11')
.setValue('選択した月の案件一覧')
.setBackground('#4472C4')
.setFontColor('#FFFFFF')
.setFontWeight('bold');
// ==============================
// 案件一覧ヘッダー
// ==============================
sheet.getRange('A12:E12').setValues([
[
'担当者',
'顧客名',
'案件内容',
'売上見込',
'状況'
]
]);
sheet.getRange('A12:E12')
.setBackground('#D9E2F3')
.setFontWeight('bold')
.setHorizontalAlignment('center');
// ==============================
// INDIRECTで月別シート参照
// ==============================
sheet.getRange('A13')
.setFormula(
'=INDIRECT("\'2026年"&$B$4&"\'!A5:A10")'
);
sheet.getRange('B13')
.setFormula(
'=INDIRECT("\'2026年"&$B$4&"\'!B5:B10")'
);
sheet.getRange('C13')
.setFormula(
'=INDIRECT("\'2026年"&$B$4&"\'!C5:C10")'
);
sheet.getRange('D13')
.setFormula(
'=INDIRECT("\'2026年"&$B$4&"\'!D5:D10")'
);
sheet.getRange('E13')
.setFormula(
'=INDIRECT("\'2026年"&$B$4&"\'!E5:E10")'
);
sheet.getRange('D13:D18')
.setNumberFormat('¥#,##0');
sheet.getRange('A12:E18')
.setBorder(
true,
true,
true,
true,
true,
true
);
// ==============================
// 担当者別売上
// ==============================
sheet.getRange('A21:H21').merge();
sheet.getRange('A21')
.setValue('担当者別 売上見込')
.setBackground('#4472C4')
.setFontColor('#FFFFFF')
.setFontWeight('bold');
sheet.getRange('A22:B22')
.setValues([
[
'担当者',
'売上見込'
]
])
.setBackground('#D9E2F3')
.setFontWeight('bold');
sheet.getRange('A23:A26')
.setValues([
['佐藤'],
['鈴木'],
['田中'],
['高橋']
]);
// ==============================
// 担当者別 SUMIF + INDIRECT
// ==============================
for (let row = 23; row <= 26; row++) {
const formula =
'=SUMIF(' +
'INDIRECT("\'2026年"&$B$4&"\'!A5:A20"),' +
'A' + row + ',' +
'INDIRECT("\'2026年"&$B$4&"\'!D5:D20")' +
')';
sheet.getRange(row, 2)
.setFormula(formula);
}
sheet.getRange('B23:B26')
.setNumberFormat('¥#,##0');
sheet.getRange('A22:B26')
.setBorder(
true,
true,
true,
true,
true,
true
);
// ==============================
// メリット説明
// ==============================
sheet.getRange('D22:H22').merge();
sheet.getRange('D22')
.setValue('この仕組みのメリット')
.setBackground('#D9E2F3')
.setFontWeight('bold');
sheet.getRange('D23:H26').merge();
sheet.getRange('D23')
.setValue(
'毎月「7月」「8月」「9月」と別タブで管理していても、管理職は営業レポートだけを見ればOK。\n\n' +
'対象月を変更するだけで、売上・案件数・案件一覧・担当者別実績がまとめて切り替わります。'
)
.setBackground('#FFF2CC')
.setWrap(true)
.setVerticalAlignment('top');
// ==============================
// 列幅
// ==============================
sheet.setColumnWidth(1, 140);
sheet.setColumnWidth(2, 150);
sheet.setColumnWidth(3, 180);
sheet.setColumnWidth(4, 130);
sheet.setColumnWidth(5, 130);
sheet.setColumnWidth(6, 30);
sheet.setColumnWidth(7, 130);
sheet.setColumnWidth(8, 130);
sheet.setFrozenRows(2);
}
/**
* =========================================================
* KPIカード
* =========================================================
*/
function createKpi_(
sheet,
titleRange,
valueRange,
title,
formula,
format
) {
// タイトル
sheet.getRange(titleRange).merge();
sheet.getRange(titleRange)
.setValue(title)
.setBackground('#D9E2F3')
.setFontWeight('bold')
.setHorizontalAlignment('center')
.setVerticalAlignment('middle');
// 値
sheet.getRange(valueRange).merge();
sheet.getRange(valueRange)
.setFormula(formula)
.setNumberFormat(format)
.setBackground('#FFFFFF')
.setFontWeight('bold')
.setFontSize(18)
.setFontColor('#1F4E78')
.setHorizontalAlignment('center')
.setVerticalAlignment('middle')
.setBorder(
true,
true,
true,
true,
false,
false
);
}GASの文法を全部理解してから始める必要はありません。
今回も先に、
「月を選ぶだけで別シートのデータを切り替えたい」
という目的があり、そのためにINDIRECTやGASを使っています。
関数を覚えること自体よりも、何を楽にしたいのかを先に考える方が実務では使いやすいと思います。
今回はINDIRECT関数を紹介しましたが、実は今回掲載している練習用シートや営業レポート自体も、GASを使ってほぼ自動で作れます。
以前なら、関数を調べて1つずつ組み合わせながら表を作る必要がありました。
今は、
やりたいことをAIに伝える → 必要な関数やGASを考えてもらう → 自分の業務に合わせて修正する
という作り方もできます。
「これ、事務職いらなくなるのでは?」と思った人へ
今回のような集計やシート作成は、AIやGASを使えばかなり効率化できます。
だからといって、すぐに事務職そのものが不要になるという話ではありません。
ただ、これからは「決められた作業をする側」だけではなく、AIを使って仕事を改善する側に回れる人の価値は高くなっていくと思っています。
自分も関数やGASを触っていて、大事だと感じるのは「コードを全部覚えること」ではありません。
それよりも、
「AIを使えば、こういうことまでできる」
という引き出しを増やすことです。
できることを知らなければ、「この仕事も自動化できるかも」という発想自体が出てきません。
「AIは気になるけど、何から始めればいいか分からない」という人なら、無料セミナーなどで実際の活用例をまとめて見てみるのもありだと思います。
まずはAIで何ができるのかを知る。
そのうえで、普段やっているExcelやスプレッドシートの作業を1つだけ改善してみる。
そのくらいから始めても十分だと思います。
まとめ
INDIRECTで別シートを参照するときは、
=INDIRECT("'"&B4&"'!B5")の形を覚えておけばOKです。
固定されたシートを参照するだけなら、
='東京支店'!B5で十分です。
シート名をセルやプルダウンから切り替えたいときにINDIRECTを使う。
これが一番分かりやすい使い分けです。
支店別・月別・部署別など、同じ形式のシートを複数使っているなら、かなり使いやすい関数です。