※本記事はプロモーションを含みます
目次
過去の締め作業などで不要なシートを隠していくと、ファイル内にたくさんの非表示シートがたまります。ただし隠れているシートを1枚ずつ選んで表示させるのは、作業の手間がかかります。なのでGoogle Apps Script(GAS)を使って、隠れているシートをまとめて出す仕組みを準備します。というのはGASでツールを作っておけば、シート管理の手間を小さくできるからです。本稿は隠れているシートを一括で出す方法を解説します。
isSheetHiddenとshowSheetの挙動差で混乱する理由
GASでシートの表示状態を直すとき、まずは判定と操作の関数で迷いやすいです。シートクラスには可視性の機能がありますが、使い慣れていないと関数名で混乱します。
シートが隠れているかを調べる機能は isSheetHidden() です。この機能は対象のシートが隠れている場合に true を返します。ただしシートを表示に戻す機能は showSheet() なので、unhide() などの名前ではありません。他のツールに慣れていると探してしまいますが、GASは表示と非表示で呼ぶ機能が分かれています。
判定をしないで全部のシートに sheet.showSheet() を実行しても、表示中のシートでエラーは起きません。ただし表示中のシートに無駄な処理を行うと、全体の処理時間を伸ばす原因になります。スプレッドシートの操作は1回の処理ごとに待ち時間が発生するので、isSheetHidden() で隠れているシートだけに絞って showSheet() を呼び出しましょう。
また行や列の折りたたみと、シート全体の非表示は別の仕組みです。見えなくなっているセルと、シートのタブ自体が隠れている状態はデータの場所が異なります。なのでシートをまとめて出すときは、シート単位の isSheetHidden() と showSheet() を使いましょう。
非表示シートを一括再表示するスクリプトとループ処理の組み立て
スプレッドシートの中にある全シートを取り出し、隠れているシートだけを出します。まずは開いているスプレッドシートを取得して、全シートの配列を順番に確認します。
以下のコードは、スプレッドシートの全シートを調べて、隠れているシートだけを順番に出す仕組みです。
function unhideAllSheets() { // eslint-disable-line no-unused-vars
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheets = ss.getSheets();
sheets.forEach(sheet => {
if (sheet.isSheetHidden()) {
sheet.showSheet();
}
});
}
このツールは定期的なファイルの点検で使います。なので不要な作業用シートが残っていないか調べる時に役立ちます。
ただしコードを動かすときは画面の動きに注意しましょう。というのは showSheet() を実行しても、出たシートが画面の先頭に開くわけではないからです。裏側で非表示が解除されるだけなので、見ている画面の位置は変わりません。なので特定のシートを開きたいときは、別に sheet.activate() を使いましょう。
シートが100枚近くある大きなファイルでは、ss.getSheets() のデータ取得に数秒かかります。なので隠れているシートが多いと sheet.showSheet() が連続で動き、画面への反映が遅れます。処理ログが完了になっていても、画面のタブが出るまで時間がかかるので確認しましょう。
非常に重いブックで全シートを可視化するときに起きる実行ラグ
小さいファイルならループ処理はすぐ終わります。ただし毎日ログを別シートに溜めて隠しているファイルでは、処理が重くなります。
シートを出すと、中の計算式が再計算されて画面の描画処理が増えます。スプレッドシートはシートが隠れていても計算式を保持しますが、表示された瞬間に処理のリソースを使います。なので IMPORTRANGE などの計算式が入ったシートを一度にたくさん出すと、処理時間が上限に達してエラーになります。
この問題を避けるために、処理したシートの名前をログに残して進捗を確認しましょう。以下のように出したいシート名を記録して、最後にログへ出す形にします。
function unhideAllSheetsWithLogging() { // eslint-disable-line no-unused-vars
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheets = ss.getSheets();
const unhiddenSheetNames = [];
sheets.forEach(sheet => {
if (sheet.isSheetHidden()) {
const name = sheet.getName();
sheet.showSheet();
unhiddenSheetNames.push(name);
}
});
if (unhiddenSheetNames.length > 0) {
Logger.log('再表示したシート数: ' + unhiddenSheetNames.length);
Logger.log('対象シート一覧: ' + unhiddenSheetNames.join(', '));
} else {
Logger.log('非表示のシートは見つかりませんでした。');
}
}
ログを見れば、処理が途中で止まった場合でもどのシートまで出せたかが分かります。なので大量のシートを扱うなら、特定の文字がついたシートだけを出す工夫をしましょう。
勝手に出したくないシートまで可視化される副作用と防御策
隠れているシートをまとめて出すと、隠しておきたかった管理用シートまで出ることがあります。
みんなで使うファイルでは、設定データやAPIのキーが書かれたシートを隠すことがあります。ただし条件をつけずに isSheetHidden() で showSheet() を実行すると、大事なシートまで画面に出てしまいます。なので誤ってデータを消される危険が発生します。
この問題を避けるために、シート名を使った除外ルールを作りましょう。たとえばシステム用のシート名に「SYS_」という文字をつけておき、ツール側でそのシートを無視するように書きます。
function unhideWorkSheetsOnly() { // eslint-disable-line no-unused-vars
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheets = ss.getSheets();
// 除外したい接頭辞やシート名を定義
const systemPrefix = 'SYS_';
const exactIgnoreNames = ['マスター設定', '管理用'];
sheets.forEach(sheet => {
const sheetName = sheet.getName();
// 除外条件の判定
const isSystemSheet = sheetName.startsWith(systemPrefix) || exactIgnoreNames.includes(sheetName);
if (sheet.isSheetHidden() && !isSystemSheet) {
sheet.showSheet();
Logger.log('表示しました: ' + sheetName);
} else if (sheet.isSheetHidden() && isSystemSheet) {
Logger.log('非表示を維持しました: ' + sheetName);
}
});
}
この設定を行えば、作業用のシートだけを安全に出せます。なので一括処理を作るときは、大事なシートを隠したままにする条件を入れましょう。
共同編集環境で一括再表示を日常の運用に組み込む際の留意点
スプレッドシートは他の人も同時に使います。なので誰かが作業しているときに突然たくさんのシートが出ると、操作の邪魔になります。
またシートの権限にも注意が必要です。隠れているシートにアクセス制限がある場合、動かす人の権限によってはエラー(Exception: You do not have permission to perform that action.)が出て処理が止まります。なので編集権限を持つアカウントで実行するか、try...catch を使って権限がないシートを無視できるようにしましょう。
メニューにこの機能を追加して配るときは、実行前に確認メッセージを出す工夫をしましょう。というのは一度に全部のシートを出すと、元々どのシートが隠れていたか分からなくなるからです。隠れているシートを出す処理は便利ですが元に戻す手間もかかるので、安全なルールを作って使いましょう。

