15
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Google Apps Script(GAS)のプロジェクト内に複数のスクリプトファイルがある場合の実行順序

Last updated at Posted at 2018-06-21

Google Apps Scriptでは、1つのプロジェクト内に複数のスクリプトファイルを配置することができます。
その際問題となるのが、各ファイルの実行順序です。
実行順序によっては、未定義の変数を参照したり、定義済みの変数を再宣言したりしてしまう恐れがあります。
そこで、実際に複数のスクリプトファイルを配置したプロジェクトを作成し、実行順序がどうなるのか検証してみました。

検証方法

以下のスクリプトファイルを同一プロジェクト内に配置し、main2.gsexec関数を実行しました。

main1.gs
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)
main2.gs
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)
}
main3.gs
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.gsexec関数を実行したところ、ログは以下のようになりました。

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

ログを見ると、以下のような順序で処理が行なわれていることが分かります。

  1. main1.gsのトップレベルの処理
  2. main2.gsのトップレベルの処理
  3. main3.gsのトップレベルの処理
  4. main2.gsexec関数内の処理

すなわち、すべてのファイルのトップレベルの処理がファイル名順に実行された後、指定した関数の処理が実行されています。

まとめ

おそらく、サーバー側ではファイル名順にすべてのスクリプトファイルを結合してから、指定した関数を実行しているものと思われます。
とはいえ順序の保証があるわけではないので、予期せぬ挙動を防ぐためにも、実行順序に依存しないコードを書いたほうがよさそうです。

15
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?