Google Apps Scriptでは、1つのプロジェクト内に複数のスクリプトファイルを配置することができます。
その際問題となるのが、各ファイルの実行順序です。
実行順序によっては、未定義の変数を参照したり、定義済みの変数を再宣言したりしてしまう恐れがあります。
そこで、実際に複数のスクリプトファイルを配置したプロジェクトを作成し、実行順序がどうなるのか検証してみました。
検証方法
以下のスクリプトファイルを同一プロジェクト内に配置し、main2.gs
のexec
関数を実行しました。
var COMMON_VALUE = 1
var MAIN_1_VALUE = 'defined'
Logger.log('main1: COMMON_VALUE=' + COMMON_VALUE)
Logger.log('main1: MAIN_1_VALUE=' + MAIN_1_VALUE)
Logger.log('main1: MAIN_2_VALUE=' + MAIN_2_VALUE)
Logger.log('main1: MAIN_3_VALUE=' + MAIN_3_VALUE)
var COMMON_VALUE = 2
var MAIN_2_VALUE = 'defined'
Logger.log('main2: COMMON_VALUE=' + COMMON_VALUE)
Logger.log('main2: MAIN_1_VALUE=' + MAIN_1_VALUE)
Logger.log('main2: MAIN_2_VALUE=' + MAIN_2_VALUE)
Logger.log('main2: MAIN_3_VALUE=' + MAIN_3_VALUE)
function exec () {
Logger.log('main2#exec: COMMON_VALUE=' + COMMON_VALUE)
}
var COMMON_VALUE = 3
var MAIN_3_VALUE = 'defined'
Logger.log('main3: COMMON_VALUE=' + COMMON_VALUE)
Logger.log('main3: MAIN_1_VALUE=' + MAIN_1_VALUE)
Logger.log('main3: MAIN_2_VALUE=' + MAIN_2_VALUE)
Logger.log('main3: MAIN_3_VALUE=' + MAIN_3_VALUE)
すべてのファイルで同じ名前の変数COMMON_VALUE
をそれぞれ異なる値で定義し、各ファイル固有の変数も定義しています。
検証結果
main2.gs
のexec
関数を実行したところ、ログは以下のようになりました。
main1: COMMON_VALUE=1
main1: MAIN_1_VALUE=defined
main1: MAIN_2_VALUE=undefined
main1: MAIN_3_VALUE=undefined
main2: COMMON_VALUE=2
main2: MAIN_1_VALUE=defined
main2: MAIN_2_VALUE=defined
main2: MAIN_3_VALUE=undefined
main3: COMMON_VALUE=3
main3: MAIN_1_VALUE=defined
main3: MAIN_2_VALUE=defined
main3: MAIN_3_VALUE=defined
main2#exec: COMMON_VALUE=3
ログを見ると、以下のような順序で処理が行なわれていることが分かります。
-
main1.gs
のトップレベルの処理 -
main2.gs
のトップレベルの処理 -
main3.gs
のトップレベルの処理 -
main2.gs
のexec
関数内の処理
すなわち、すべてのファイルのトップレベルの処理がファイル名順に実行された後、指定した関数の処理が実行されています。
まとめ
おそらく、サーバー側ではファイル名順にすべてのスクリプトファイルを結合してから、指定した関数を実行しているものと思われます。
とはいえ順序の保証があるわけではないので、予期せぬ挙動を防ぐためにも、実行順序に依存しないコードを書いたほうがよさそうです。