GASでスプレッドシートのシートを
追加・複製・削除する方法
シート(画面下のタブ)を手作業で増やさず、insertSheetやcopyToでコードから自動管理する方法を解説します。月次シートの自動作成まで動くコードで紹介します。
Table of Contents
シート操作をコードで自動化するメリット
シートとは、スプレッドシート下部に並ぶタブ1枚1枚のことです。毎月の帳票や月次データを手作業でコピー&リネームしていると、 作り忘れや命名ミスが起きます。GAS(Google Apps Script、Googleサービスを自動化するプログラム)でシートの追加・複製・削除をコード化すると、 次のような作業をボタン1つ、あるいは自動で実行できます。
月次シートの自動作成
毎月1日にテンプレートを複製し、当月用のシートを自動で用意する
帳票の量産
取引先ごとに同じフォーマットのシートをまとめて複製する
作業用シートの後片付け
一時的に作った計算用シートを処理の最後にまとめて削除する
命名・並び順の統一
決めたルールでシート名やタブの並び順を自動でそろえる
シートを追加する(insertSheet)
シートの追加はinsertSheet()(新しいシートを作るメソッド)で行います。引数にシート名を渡すとその名前で作成され、作成したシートのオブジェクトが戻り値として返るので、 そのまま続けて見出しを書き込めます。第2引数に数値を渡すと、挿入する位置(左から何番目か)も指定できます。
function addSheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 追加したシートは戻り値として受け取れる
const sheet = ss.insertSheet("2026年7月_売上");
// 位置を指定して追加(左から2番目)
// ss.insertSheet("集計", 1);
// 見出し行を書き込む
sheet.getRange(1, 1, 1, 3)
.setValues([["日付", "商品名", "金額"]]);
return sheet;
}同名シートのエラーを防ぐ安全な追加
同じ名前のシートをinsertSheet()しようとすると、GASはエラーを出して止まります。追加前にgetSheetByName()で存在を確認し、あれば使い回し、無ければ作る「取得または作成」のパターンにしておくと、何度実行しても安全です。
function getOrCreateSheet(name) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
// すでに存在すればそれを返す(二重作成を防ぐ)
const existing = ss.getSheetByName(name);
if (existing) return existing;
// 無ければ新規作成
const sheet = ss.insertSheet(name);
sheet.getRange(1, 1, 1, 3)
.setValues([["日付", "商品名", "金額"]]);
return sheet;
}getSheetByName()は該当シートが無いときnullを返します。このnull判定が、二重作成やエラー停止を防ぐ基本になります。
テンプレートシートを複製する(copyTo)
フォーマットが決まった帳票を量産するなら、複製が便利です。複製元シートのcopyTo(コピー先のスプレッドシート)を呼ぶと、罫線や背景色などの書式、数式、入力規則まで丸ごとコピーされます。コピー直後の名前は「〇〇のコピー」になるため、setName()で目的の名前に変更します。
function createSheetFromTemplate(newName) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const template = ss.getSheetByName("テンプレート");
if (!template) throw new Error("テンプレートシートが見つかりません");
// 書式・数式・入力規則ごと複製される
const copied = template.copyTo(ss);
// コピー直後は「テンプレートのコピー」という名前になる
copied.setName(newName);
// いちばん右に移動させる
ss.setActiveSheet(copied);
ss.moveActiveSheet(ss.getSheets().length);
return copied;
}moveActiveSheet(位置)は、現在アクティブなシートを指定位置へ動かすメソッドです。ここではgetSheets().length(シートの総数)を渡して、複製したシートをいちばん右に移動しています。
シートを安全に削除する(deleteSheet)
削除はdeleteSheet(シート)で行います。ただしこの操作は取り消せません。存在チェックと「最後の1枚は消せない」制約(スプレッドシートはシートを0枚にできません)への配慮を、 関数の中にあらかじめ組み込んでおくのが安全です。
function deleteSheetByName(name) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(name);
// 存在しなければ何もしない
if (!sheet) {
Logger.log(name + " は存在しないためスキップ");
return;
}
// スプレッドシートには最低1枚シートが必要
if (ss.getSheets().length <= 1) {
throw new Error("最後の1枚は削除できません");
}
ss.deleteSheet(sheet); // ← 取り消し不可
}名前変更・並べ替え・表示/非表示
追加・削除以外にも、シートまわりでよく使う操作をまとめておきます。getSheets()で全シートを配列として取得でき、名前変更・非表示・タブ色の変更もコードから行えます。作業用の中間シートはhideSheet()で隠しておくと、利用者に触られずに済みます。
function manageSheets() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
// すべてのシート名を一覧化
const names = ss.getSheets().map((s) => s.getName());
Logger.log(names.join(", "));
// 名前を変更する
const sheet = ss.getSheetByName("Sheet1");
if (sheet) sheet.setName("受付データ");
// 作業用シートを非表示にする
const work = ss.getSheetByName("計算用");
if (work) work.hideSheet();
// もう一度表示する場合は showSheet()
// work.showSheet();
// タブの色を付けて目立たせる
if (sheet) sheet.setTabColor("#ff0000");
}月初に当月シートを自動作成する
ここまでの部品を組み合わせると、「毎月1日にテンプレートを複製して当月シートを作る」自動化ができます。 時間主導トリガー(決まった日時に関数を自動実行する仕組み)をonMonthDay(1)で月次設定し、Utilities.formatDateで当月名を作ってシートを用意します。
// 毎月1日の朝に実行するトリガーを1回だけ登録
function createMonthlyTrigger() {
ScriptApp.newTrigger("createCurrentMonthSheet")
.timeBased()
.onMonthDay(1)
.atHour(6)
.create();
}
// 当月名(例: 2026-07)のシートを用意する
function createCurrentMonthSheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const name = Utilities.formatDate(
new Date(), "Asia/Tokyo", "yyyy-MM"
);
// すでにあればスキップ(二重作成を防ぐ)
if (ss.getSheetByName(name)) return;
const template = ss.getSheetByName("テンプレート");
const sheet = template
? template.copyTo(ss).setName(name)
: ss.insertSheet(name);
ss.setActiveSheet(sheet);
ss.moveActiveSheet(1); // いちばん左へ
}createMonthlyTrigger()は最初に一度だけ手で実行してトリガーを登録します。以降は毎月1日の朝6時台にcreateCurrentMonthSheet()が自動で動きます。すでに当月シートがある場合はスキップするので、二重に作られる心配はありません。
実務での注意点
1. 削除は取り消せない
deleteSheet()で消したシートは元に戻せません。重要なデータを含むシートは、削除前にcopyToで控えを取るか、削除対象の名前をログに出して確認してから実行しましょう。
2. 名前は一意にする
シート名は同じスプレッドシート内で重複できません。追加や複製の前にgetSheetByName()で存在を確認する習慣をつけると、エラーで処理が止まるのを防げます。
3. 大量のシートは1ファイルの上限に注意
スプレッドシートは1ファイルあたりのセル数に上限(1,000万セル)があります。シートを無制限に増やし続ける設計は避け、 古いシートは別ファイルへ退避するか、削除する運用を合わせて検討しましょう。
まとめ
GASでのシート操作は、insertSheetでの追加、copyToでの複製、deleteSheetでの削除が基本の3点セットです。いずれもgetSheetByName()による存在チェックを添えると安全に運用できます。月次トリガーと組み合わせれば、毎月の帳票シート作成も手放しで回せます。
よくある質問
SpreadsheetApp.getActiveSpreadsheet().insertSheet("シート名") で追加できます。引数にシート名を渡すと、その名前で新しいシートが作成され、追加したシートのオブジェクトが返ります。名前を省略すると「シート2」のような連番の名前で作成されます。
「そのシート名はすでに使用されています」というエラーになり、処理が止まります。insertSheetする前にgetSheetByName(name)でnullかどうかを確認し、すでに存在する場合は追加しない、または既存シートを使い回す作りにすると安全です。
できます。複製元シートのcopyTo(spreadsheet)を呼ぶと、書式・数式・入力規則ごとコピーされます。コピー直後の名前は「〇〇のコピー」になるため、setName()で目的の名前に変更します。毎月の帳票シートをテンプレートから量産する用途に向いています。
deleteSheet()は元に戻せません。削除前にgetSheetByName()で存在を確認し、スプレッドシートに最低1枚はシートを残す必要がある点に注意します(全シートは削除できません)。重要なデータを含むシートは、削除前にcopyToでバックアップを取ると安全です。
できます。時間主導トリガー(ScriptApp.newTrigger)を月次で設定し、Utilities.formatDateで「2026-07」のような当月名を作ってinsertSheetする関数を実行します。すでに同名シートがある場合はスキップする判定を入れておくと、二重作成を防げます。
GAS開発・業務Webシステムを
相談する。
シートの自動作成以外にも、帳票出力・フォーム連携・Gmail自動化など、日々の業務を自動化するGAS開発をご相談いただけます。