今回はGASの入門編第4弾ということで、正直今まで何にも考えていなかったし気に留めていなかった変数・定数を宣言するvar/const/letの違いについて解説します!
これで明日からは皆さんもある程度は知ったかができるはず!笑
それでは見ていきましょう。
【GAS入門】変数と定数とは
まずはそもそも変数とか定数ってなんだっけ?何それ?って思ってる方向けに、それぞれ簡単に説明しますと、変数や定数はよく「何も入っていない箱のようなもの」と言われますが、ざっくり言うと中学時代に習った「x」とか「π(パイ)」みたいなものだと思って頂ければ大丈夫です。
どういうことかと言うと、円周率を使うたびに毎回「3.141592……」とか書いてると面倒だしミスる可能性高いじゃないですか。それを「π」って書くだけで解消できてしまうと。変数とか定数というのはそのくらいライフハックな解決策なんですね。
ただ、急に「π」とか書き始めると、それが何を意味してるかわからないので、それを宣言(定義)する必要があります。その宣言時に使われるのが、JSをベースとするGASの場合はvarとかconstとかletなわけですね。
ちなみにその定義するタイミングで「π = 3.141592….」と書くわけですが、「π」のようなそれ自体が特に何を意味しているかわからないような文字ではなく(実際は「π」と言われたら円周率のことだなとわかりますけども笑)、それが何を意味しているかがはっきりとわかるような単語で定義してあげることが大事です。そうすると、他の人が見ても何をしているかわかりますしね◎
なお、変数は宣言した後に値を上書きすることが可能ですが、定数はその中身を変えることはできません。GASはJSがベースになっていますので、変数はvarやletを、定数はconstを使用します。
【GAS入門】var,let,constの違い
さて、それでは上記でご説明した3つについて、どのような違いがあるのかをご説明します。
宣言文 var,let,constの比較
今までのGASでは「var」を使うのが主流でしたが、2020年2月にV8ランタイムがリリースされて「let」が使えるようになり、同時期にconstの機能変更もあったため、最近では「let」と「const」を使うことが主流になりつつあります。とはいえ、まだネット上に転がっているコードは「var」を使っているV8ランタイム以前のソースコードが多いですね。
ではそれぞれどのような特徴があるのか。それをまずは表にまとめてみました。
せ | 定数/変数 | 再代入 | 再宣言 | スコープ |
var | 変数を宣言 | 可能 | 可能 | ローカル |
let | 変数を宣言 | 可能 | 不可能 | ブロック |
const | 定数を宣言 | 不可能 | 不可能 | ブロック |
すごくざっくり言うと、「var」が一番広い範囲で使うことができます。
これは一見いいことのように思えますが、プログラミングの場合、長いソースコード上のどこかで間違って上書きしてしまったり、同じ変数名で宣言してしまったりという、いわゆるケアレスミスが発生してしまうので、使用可能な範囲はできる限り狭い方が良いです。
そのため前述のとおり、変数を宣言する場合は「var」よりも「let」を使うようになってきているんですね。表の通り、再代入する可能性がない場合(定数の場合)は「const」を使用して、それ以外は「let」を使用するようにしましょう。
【GAS入門】スコープ
さて、宣言文について理解したところで、次は変数について説明します。
変数にも使用可能範囲(スコープ)というものが設定されています。
スコープとは、参照できる範囲を決めるもの、つまりその変数が使える範囲のことです。仕事でも「スコープ=契約上の対応範囲、である/ない」などの使い方をしますが、スコープの中で定義された変数はスコープの内側でのみ参照でき、スコープの外側からは参照できません。
そうすることで、有効な範囲が限られて範囲の外へ影響することを防ぐことができます。
例えば、収納で考えてみましょう。
そのまま小物をバラバラと棚に置くよりも、収納棚を用意して枠を区切ることでその中だけで整理することができますよね。結果として、どこに何があるかがわかりやすく(可読性が高く)、下の小物を引っ張ったら上のものが一緒にずり落ちてくることがなく(安全性が高く)なりますよね。
続いて、スコープの種類について説明します。スコープには大きく分けて3つあります。
<例>
//グローバル変数を宣言
var global = 10;
//関数testの中でローカル変数を宣言
function test() {
var local = 100;
Logger.log(global); //10を出力
Logger.log(local); //100を出力
}
//スコープ外で呼び出し
Logger.log(local); //エラーする
上記の例で言うと「var global = 10;」の部分がグローバルスコープですね。
{と}で囲われておらず、全ての関数からアクセスすることができます。
そのため、関数testの{}内で呼び出してもきっちり「10」を返してくれます。
ただし、前述のとおり、意図しない挙動だったりエラーを引き起こす原因になりますので極力使用は避けるようにしましょう。
関数内で定義された変数のことです。上記の例では「var local = 100;」が該当します。
{と}で囲われている範囲内で宣言をするので、その範囲外から呼び出そうとするとエラーしてしまいます。
ブロック({})ごとに作られるスコープのことです。ローカルスコープの中の1つと思って頂ければ大丈夫です。
ブロックスコープ内でletやconstを使用して宣言した変数は、ブロックの内側からのみアクセス可能なローカル変数になります。つまり、一番参照できる範囲が限定されているスコープということですね。
【GAS入門】書き方・表記ルール
最後に、変数や定数の名前をつける際の注意事項についてまとめたいと思います。
<注意事項>
- 大文字と小文字は区別される
- 数字、「_(アンダースコア)」「ドル記号」などを除く記号は使用不可
- 予約語は使用できない
※宣言文などのすでに定義されている文字列のことを予約語と言う
<より良い書き方を目指して>
自分一人で書く際であっても、他の人がみたときにわかりやすい書き方をするのが理想です。(いわゆる可読性が高いということ)。そのために以下について、注意して書くようにしましょう!
- 誰でもどんな値が入っているかわかるように機能とリンクした意味の通じる英単語を使用する
- 関数名・変数名は、単語を連結する際に2単語目以降の頭文字を大文字にするキャメル記法を使用する
- 定数名は、単語を「アンダースコア」でつなぐスネーク記法を使用する
まとめ
いかがでしたか。
変数や定数の書き方、宣言文の使い分けについては基本中の基本。
ケアレスミスや意図しない挙動を防ぐためにも、また複数名での制作時にも相互に書きやすいように、普段から書き方やスコープについては意識してみてくださいね。