スコープ

スコープとは

宣言した変数はどこからでも参照できるわけではありません。
変数には参照できる範囲が定められており、その範囲をスコープといいます。

グローバル領域

早速ですが、下記のサンプルを実行してみましょう。
実行する関数内にはステートメントは1行もありませんが、実行するとどうなるでしょうか?

var msgHello = 'Hello!'
console.log(msgHello);
function outputScope_1() {
}
Hello!

関数を実行すると、ログに「Hello!」と表示されたと思います。
関数の外に記述した2つのステートメント、msg変数の初期化とログ出力が実行されました。
GASにはどの関数に属さない領域にステートメントを記述することができ、この領域を グローバル領域 といいます。
プロジェクトに含まれるいずれかの関数が呼び出されると、呼び出された関数よりも先に、グローバル領域に記述されたステートメントが実行されます。

次のサンプルを実行すると、まずグローバル領域に記述されたステートメントが上から順番に実行されていきます。
その後、呼び出された関数内のステートメントが実行されることが確認できるでしょう。

console.log('Good Morning!');
function outputScope_2() {
  console.log('Hello!');
}
console.log('Good Night!');
Good Morning!
Hello!
Good Night!

異なるgsファイルに記述されていたとしても、プロジェクト内の任意の関数の呼び出しにより、グローバル領域に記述される全てのステートメントが実行されます。
複数のgsファイルのグルーバル領域にステートメントを点在させることは、わかりやすさの観点からおすすめできません。

グローバルスコープとローカルスコープ

変数にはその変数を参照することができる範囲が定められています。
これを スコープ といいます。スコープには次の2種類があります。

  • グローバルスコープ:プロジェクト全体から参照できる
  • ローカルスコープ:宣言された関数の中からのみ参照できる

関数の中で宣言された変数のスコープは ローカルスコープ といい、その関数の中でのみ参照することができます。
このような変数を ローカル変数 といいます。
一方、グローバル領域で宣言された変数はプロジェクトのどこからでも参照することができ、
そのスコープは グローバルスコープ、またその変数を グローバル変数 といいます。

それでは、それぞれのスコープについてサンプルで確認していきましょう。
次のサンプルはローカル変数のスコープを確認するサンプルです。
localFunction_2関数を実行すると「localFunction_2が定義されていません」というエラーが発生します。
このようにローカル変数は外からはアクセスすることができないのです。

function localFunction_1() {
  var localMsg = 'ローカル';
}
function localFunction_2() {
  console.log(localMsg);
}

続いて、グローバル変数のスコープを確認するために、次のサンプルを実行してみましょう。

var globalMsg = 'グローバル';
function globalFunction_1() {
  console.log(globalMsg);
}
グローバル

このようにグローバル変数は全ての関数からアクセスすることができます。
それでは、次のサンプルの場合はどうなるでしょうか?
msg変数がグローバル領域でも、関数の中でも宣言されています。
このような場合にglobalFunction_2を実行するとローカル変数のmsgが表示されます。

var msg = 'グローバル';
function globalFunction_2() {
  var msg = 'ローカル';
  console.log(msg);
}
ローカル