【Googleスプレッドシート】Apps Scriptで全シートを一括処理!getSheetsのループ

【Googleスプレッドシート】Apps Scriptで全シートを一括処理!getSheetsのループ
🛡️ 超解決

スプレッドシートで複数のシートをまとめて処理したいとき、一つずつ操作するのはとても手間がかかります。たとえば、全シートのデータを一覧にまとめたり、すべてのシートに同じ書式を設定したりする作業は、シート数が多いほど効率が落ちます。そこで役立つのが、Apps Scriptの「getSheets」メソッドです。この記事では、getSheetsを使って全シートをループ処理する方法を、実際のコード例とともに詳しく解説します。

【要点】getSheetsで全シートを一括ループする方法

  • getSheets() で全シートの配列を取得: スプレッドシート内のすべてのシートオブジェクトが含まれた配列を取得します。
  • for文でシート数だけ繰り返し処理: 配列の長さを取得してループ回数を制御し、各シートにアクセスします。
  • forEach や for…of も使用可能: より簡潔な記述ができるforEachやfor…ofでも同様のループが書けます。

ADVERTISEMENT

getSheetsで全シートをループする基本

getSheetsメソッドは、アクティブなスプレッドシートに含まれるすべてのシートを、配列として返します。この配列の要素はそれぞれSheetオブジェクトで、シート名の取得やデータの読み書きに利用できます。ループ処理の基本は、この配列の長さを取得し、インデックスを0から順に増やしながら各シートにアクセスする方法です。また、JavaScriptの配列メソッドであるforEachやfor…ofを用いると、より直感的なコードを書けます。

全シートをループする具体的な手順

手順1: Apps Scriptエディタを開く

  1. スプレッドシートを開く
    処理したいスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックします。新しいタブでスクリプトエディタが開きます。
  2. プロジェクト名を設定
    エディタ左上の「無題のプロジェクト」をクリックし、わかりやすい名前(例:「全シート一括処理」)に変更します。

手順2: ループ処理のコードを記述する

  1. 関数を定義する
    コードエリアに次のような関数を記述します。ここではシート名をログに出力する例を示します。
    function loopAllSheets() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheets = ss.getSheets();
    for (var i = 0; i < sheets.length; i++) {
    var sheet = sheets[i];
    Logger.log(sheet.getName());
    }
    }
  2. forEachを使った簡潔な記述
    よりモダンなスタイルでは、forEachメソッドを利用します。
    function loopAllSheetsForEach() {
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
    sheets.forEach(function(sheet) {
    Logger.log(sheet.getName());
    });
    }
  3. for…ofを使った記述
    for…ofループも直感的でおすすめです。
    function loopAllSheetsForOf() {
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
    for (var sheet of sheets) {
    Logger.log(sheet.getName());
    }
    }

手順3: スクリプトを実行する

  1. 関数を選択して実行
    ツールバーの関数選択ドロップダウンから作成した関数(例:loopAllSheets)を選び、「実行」ボタンをクリックします。
  2. 承認を行う
    初回実行時には権限の承認が必要です。「権限を確認」→「許可」と進み、スクリプトがスプレッドシートにアクセスすることを承認します。
  3. 実行ログを確認
    メニューの「表示」→「ログ」をクリックすると、各シート名が出力されているのが確認できます。

実際の処理例: 全シートのデータを一つのシートに集約

ループを使って、すべてのシートから特定の範囲をコピーし、集約シートにまとめるコード例を紹介します。この例では、各シートのA1:C10のデータを「集約」シートに順に追記します。

function consolidateSheets() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var targetSheet = ss.getSheetByName('集約');
if (!targetSheet) {
targetSheet = ss.insertSheet('集約');
}
var targetRow = 1;
sheets.forEach(function(sheet) {
var data = sheet.getRange('A1:C10').getValues();
targetSheet.getRange(targetRow, 1, data.length, data[0].length).setValues(data);
targetRow += data.length;
});
}

ADVERTISEMENT

getSheetsループの注意点とよくあるエラー

スクリプトの実行時間制限を超える

シート数が非常に多い場合や、各シートの処理が重い場合、Apps Scriptの1回の実行時間制限(6分)を超えることがあります。その場合は処理を分割するか、トリガーを使って複数回に分けて実行する必要があります。

getSheetsの返す配列の順序

getSheetsが返す配列の順序は、タブバーに表示されているシートの並び順と同じです。非表示のシートも含まれます。特定の順序で処理したい場合は、事前にシートを並べ替えるか、シート名でソートしてください。

シート名の変更によるエラー

ループ内でシート名を変更する処理を行うと、現在のイテレーション以降のシート順に影響を与える可能性があります。シート名を変更する場合は、ループの最初にすべてのシートオブジェクトを取得しておくなど、工夫が必要です。

for文・forEach・for…ofの比較

ループ方法 記述の簡潔さ インデックスアクセス break/continue
for文 やや長い 可能 可能
forEach 簡潔 不可能(但しindex引数あり) 不可能
for…of 簡潔 不可能(但しentries()で可能) 可能

まとめ

この記事では、Apps ScriptのgetSheetsメソッドを使って全シートをループ処理する方法を解説しました。for文、forEach、for…ofの3つの書き方を紹介し、それぞれの特徴も確認しました。ループ内でシート名の取得やデータの読み書きを行うことで、手作業では時間のかかる一括操作を自動化できます。次は、取得したデータを別のスプレッドシートに出力する、条件に合ったシートだけを処理するなど、応用にも挑戦してみてください。getSheetsとループの組み合わせは、スプレッドシート作業の効率化に強力な武器になります。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。