スプレッドシートで複数のシートをまとめて処理したいとき、一つずつ操作するのはとても手間がかかります。たとえば、全シートのデータを一覧にまとめたり、すべてのシートに同じ書式を設定したりする作業は、シート数が多いほど効率が落ちます。そこで役立つのが、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エディタを開く
- スプレッドシートを開く
処理したいスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックします。新しいタブでスクリプトエディタが開きます。 - プロジェクト名を設定
エディタ左上の「無題のプロジェクト」をクリックし、わかりやすい名前(例:「全シート一括処理」)に変更します。
手順2: ループ処理のコードを記述する
- 関数を定義する
コードエリアに次のような関数を記述します。ここではシート名をログに出力する例を示します。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());
}
} - forEachを使った簡潔な記述
よりモダンなスタイルでは、forEachメソッドを利用します。function loopAllSheetsForEach() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
sheets.forEach(function(sheet) {
Logger.log(sheet.getName());
});
} - for…ofを使った記述
for…ofループも直感的でおすすめです。function loopAllSheetsForOf() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var sheet of sheets) {
Logger.log(sheet.getName());
}
}
手順3: スクリプトを実行する
- 関数を選択して実行
ツールバーの関数選択ドロップダウンから作成した関数(例:loopAllSheets)を選び、「実行」ボタンをクリックします。 - 承認を行う
初回実行時には権限の承認が必要です。「権限を確認」→「許可」と進み、スクリプトがスプレッドシートにアクセスすることを承認します。 - 実行ログを確認
メニューの「表示」→「ログ」をクリックすると、各シート名が出力されているのが確認できます。
実際の処理例: 全シートのデータを一つのシートに集約
ループを使って、すべてのシートから特定の範囲をコピーし、集約シートにまとめるコード例を紹介します。この例では、各シートの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
超解決 第一編集部
疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。
Googleスプレッドシートの人気記事ランキング
- 【Googleスプレッドシート】GOOGLEFINANCE関数で株価・為替を取得!リアルタイムデータの呼び出し
- 【Googleスプレッドシート】印刷範囲を指定して印刷!特定範囲だけPDFや紙に出す手順
- 【Googleスプレッドシート】複合グラフで棒と折れ線を同時表示!2軸グラフの作り方
- 【Googleスプレッドシート】FILTER関数で条件に合う行だけ抽出!数式1つで動的な絞り込み
- 【Googleスプレッドシート】フィルタ表示で他の人の表示を変えずに絞り込み!共有時の使い分け
- 【Googleスプレッドシート】重複データを抽出して表示!COUNTIFと条件付き書式の併用
- 【Googleスプレッドシート】新しいスプレッドシートを作成する3つの方法!ドライブ・URL・テンプレート
- 【Googleスプレッドシート】ARRAYFORMULAで列全体に数式を一括適用!セル分の入力を不要に
- 【Googleスプレッドシート】データ範囲を動的に伸縮させる!INDIRECTと参照範囲のコツ
- 【Googleスプレッドシート】共有解除と権限の取り消し!アクセスを完全に閉じる手順
