複数のGASも1つのスクリプトでカスタムメニュー表示できる!統合設定の全手順

AI・ワークハック
目次

GASでファイルが分かれてもカスタムメニューは1つに統合 できる!Google Apps Script(GAS)でツールを開発していると、コードが長くなりすぎて「ファイルを分割して整理したい」と思う場面が増えてきますよね。 しかし、ファイルごとにメニュー設定を書く必要があるのか、それともバラバラにメニューが表示されてしまうのか、不安に感じる方も多いはずです。 結論から言うと、スクリプトファイルが複数に分かれていても、カスタムメニューは1つのスクリプト(onOpen関数)でまとめて設定可能です。 この記事を読めば、プロジェクトをスッキリ整理しながら、ユーザーにとって使い勝手の良い「プロ仕様のメニュー」を作る方法がマスターできます。保守性の高いコードを目指して、さっそく手順を見ていきましょう。

【基本】GASの「ファイル分割」と「スコープ」の仕組み

意外と知られていないのですが、GASのプロジェクト内にある複数の「.gs」ファイルは、実行時には「1つの大きなスクリプト」として扱われます。 ファイルAで定義した関数は、ファイルBから直接呼び出せる グローバル変数も全ファイルで共有される 一般的には「ファイルごとに独立している」と思われがちですが、実体験から言うと、この「グローバルな共有」を理解しておくことが、スマートなメニュー作成の第一歩となります。

複数ファイルの関数をメニューに登録する実装コード

具体的に、3つのファイルに分かれているケースを想定した実装例を紹介します。それぞれのファイルに書かれた関数を、1つのメニューに集約してみましょう。

ファイル1:Main.gs(メニュー設定用)

このファイルに、スプレッドシートを開いた時に実行される「onOpen」関数を集約させます。 
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('作成したカスタムメニュー')
.addItem('売上集計を実行', 'runSalesProcess') // FileA.gsの関数
.addItem('PDF出力を実行', 'runExportPdf') // FileB.gsの関数
.addSeparator()
.addItem('設定リセット', 'resetSettings') // Main.gs内の関数
.addToUi();
}
function resetSettings() {
Browser.msgBox('設定をリセットしました');
}


ファイル2:FileA.gs(売上処理用)


function runSalesProcess() {
// 複雑な集計処理などをここに記述
Browser.msgBox('売上集計が完了しました!');
}


ファイル3:FileB.gs(PDF出力用)


function runExportPdf() {
// PDF変換・保存処理などをここに記述
Browser.msgBox('PDFを出力しました!');
}


ファイル分割によるメニュー管理のメリット・デメリット

プロジェクトを整理する上で、メリットだけでなく注意点も把握しておきましょう。比較表にまとめました。 項目 メリット デメリット(注意点) コードの可読性 機能ごとにファイルが分かれ、目的のコードを探しやすい。 ファイル数が増えすぎると、全体像の把握が難しくなる。 保守・運用 修正時に影響範囲を特定しやすく、デバッグが容易。 関数名の重複があると、予期せぬ挙動が発生する。 ユーザー体験 メニューが1箇所にまとまるため、操作に迷わない。 特になし(設定を1ファイルに集約すれば解決)。

初心者が躓きやすいポイントと対策

実務でよく遭遇するトラブルを先回りして解説します。

1. 関数名の重複(バッティング)に注意

ファイルが別でも「同じ関数名」は使えません。例えば「FileA」と「FileB」の両方に function init() を作ると、後から読み込まれた方で上書きされてしまいます。 対策として、「ファイル名_関数名」のようにプレフィックスをつけるルール運用がおすすめです。

2. 権限(承認)のタイミング

カスタムメニューから初めて関数を実行する際、初回のみ承認ポップアップが出ます。ファイルが分かれていても「プロジェクト全体」としての承認になるため、一度承認すれば全ての機能が使えるようになります。

よくある質問(FAQ)

Q. サブメニュー(階層構造)を作ることはできますか?

はい、可能です。.addSubMenu() メソッドを使用することで、メニューの中にさらに深い階層を作成できます。機能が増えてきた場合は、カテゴリーごとにサブメニューへ分けると視認性が向上します。

Q. 実行する関数に引数を渡すことはできますか?

残念ながら、addItem() で指定する関数に直接引数を渡すことはできません。引数が必要な場合は、引数なしの「ラッパー関数」を定義し、その中から本来の関数を呼び出す形をとります。

Q. スクリプトの読み込み順序は関係ありますか?

GASのメニュー表示(onOpen)に関しては、読み込み順序を気にする必要はありません。どのファイルに関数が書かれていても、onOpen が実行されるタイミングでプロジェクト内の全ての関数がスキャンされているため、正しく動作します。

まとめ:整理されたコードで業務効率を最大化しよう

スクリプトファイルが複数になっても、「1つのonOpen関数に関数を集約する」だけで、美しく使いやすいカスタムメニューは簡単に実現できます。 コードを整理整頓することは、単なる自己満足ではありません。「将来の自分が修正しやすくなる」「チームメンバーが迷わず使える」という、実務において最も価値のある資産になります。 まずは、肥大化した「コード.gs」を機能ごとに切り出し、この記事のテンプレートを使ってメニューを統合してみてください。驚くほど開発と運用のストレスが減るはずですよ!

タイトルとURLをコピーしました