GASでスプレッドシートのシートを
追加・複製・削除する方法

シート(画面下のタブ)を手作業で増やさず、insertSheetcopyToでコードから自動管理する方法を解説します。月次シートの自動作成まで動くコードで紹介します。

|対象: GAS / スプレッドシート / シート操作

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開発をご相談いただけます。

GAS Webシステム開発を見る