let / var / const の違いとは?GAS初心者がつまずいた変数の基本
GASを独学で始めたときに最初につまずいた「let」「var」「const」の違いや、変数と定数の基本を、実際の例とともに分かりやすく解説します。
このブログは、Google Apps Script(GAS)を使った自作ツールの記録や、開発の過程での気づきをまとめたものです。
丁寧な解説というより、「こんなこともGASでできるんだ」というアイディアのきっかけになれば幸いです。
変数って何?
変数とは、データに名前をつけて保存する「箱」のようなものです。
let name = "たろう";
これで、name という変数に「たろう」という文字列が入ります。
同じように、変数には数字を入れることもできます
let count = 5;
このあとでこのcountを使えば、「5」として処理してくれるわけです。
この「名前をつけて、値をしまう」という仕組みが、プログラムの基本です。
let / var / const の違い
JavaScript(GASを書いている言語)には、変数を宣言する方法が3つあります。
var name = "たろう";
let name = "たろう";
const name = "たろう";
「var」「let」「const」のどれも「変数宣言」に使いますが、それぞれ挙動や使いどころに違いがあります。
| 宣言方法 | 再代入 | 再宣言 | スコープ |
|---|---|---|---|
| var | OK | OK | 関数単位 |
| let | OK | NG | ブロック単位 |
| const | NG | NG | ブロック単位 |
初心者の頃は「表見てもよく分からん」ってなりましたが、次の実例を見れば納得できます。
varでハマった実例
JavaScriptでは、varで宣言した変数は「関数スコープ」を持つため、ループ内で定義してもそのブロック(ループ)を抜けた後も有効です。
そのため、思わぬバグの原因になることがあります。
例:varを使った場合
for (var i = 0; i < 5; i++) {
Logger.log(i);
}
Logger.log(i); // → 5 と出る
このコードでは、forループの中でvarを使ってiを宣言していますが、ループが終わったあとにもiという変数が生き残っており、値は5になっています。
これは、意図しない挙動やバグにつながる恐れがあります。
解決策:letでブロックスコープを使う
一方で、letで宣言した変数は「ブロックスコープ」を持つため、ループの中でのみ有効です。
ループ外でアクセスしようとするとエラーになります。
例:letを使った場合
for (let i = 0; i < 5; i++) {
Logger.log(i);
}
Logger.log(i); // → エラー(iはループの外にいない)
このように、letを使うことでスコープを限定し、意図しない変数の再利用や上書きを防ぐことができます。
ポイント
- varは関数全体で有効になってしまうため、ループ外でも思わぬ影響が出る。
- letはループの中だけで有効なので、安全で意図が明確。
- ループ内のカウンタ変数や一時的な変数は、基本的にletで書くようにしましょう。
GASでのスクリプトもJavaScriptがベースのため、こうしたスコープの違いには十分注意が必要です。
constは固定値用
JavaScriptでは変数の宣言に var、let、const の3種類がありますが、その中でも「変更されるべきでない値」にはconstを使うのが基本です。
これは、プログラムの可読性や保守性、バグの予防において非常に重要なポイントです。
const TAX_RATE = 0.1;
このように、消費税率など「一度決めたら途中で変更されることがない値」にはconstを使います。
constによって変数の再代入が禁止されるため、後からうっかり値を変更してしまうミスを未然に防ぐことができます。
const TAX_RATE = 0.1;
TAX_RATE = 0.08; // エラー:constで定義された変数は再代入できません
なぜ const が安全なのか?
プログラムが複雑になってくると、変数の値がどこで変更されたのか追いにくくなり、思わぬバグを引き起こすことがあります。
たとえば、グローバル変数や設定値などがどこかで変更されてしまうと、意図しない動作につながります。
const を使えば、「この値は絶対に変わらない」という前提がコード上で明確になるため、以下のようなメリットがあります。
- 読み手にとって意図が明確になる(=可読性の向上)
- うっかり再代入するバグを防げる(=安全性の向上)
- コード全体の予測しやすさが高まる(=保守性の向上)
値が変わらない前提なら、迷わず const を使いましょう。
そうすることで、コードの意図が明確になり、保守性も向上します。
定数と変数の具体例
定数にすべき例(const)
const TAX_RATE = 0.1;→ 税率は固定値const API_KEY = "abc123";→ セキュリティ上、変更すべきでないconst MAX_LENGTH = 100;→ 入力制限など、仕様上固定
変数にすべき例(let)
let userName = "たろう";→ 入力内容は人によって変わるlet count = 0;→ カウント処理などで値が増えるlet isValid = false;→ 処理の中で状態が変わる
最初はletだけ使っておいて、あとから「この値は固定だな」と思ったらconstに変える…くらいの感覚でOKです。
命名規則
変数には意味のある名前をつけるようにしています。
昔の自分は「a」とか「data1」とかで済ませていたけど、あとから見返すと超わかりにくいです
以下のような名前付けがオススメです
- 意味が通じる名前 →
userName,totalPrice,isValid - キャメルケース(2語目以降を大文字に) →
userAge,formData - 基本は英単語(慣れたら辞書引きながらでもOK)
変数名が分かりやすいだけで、コード全体の読みやすさが段違いになります。
まとめ
GASを独学で学ぶ中で、「let」と「const」の使い分けを意識することは、コードの品質を大きく向上させるポイントのひとつです。
変数の扱い方に気を配るだけで、思わぬバグの発生を防ぎ、数週間後・数ヶ月後の「自分」がコードを見返したときにも理解しやすくなります。
特に、「この値は変わる可能性があるかどうか?」を基準にして考えるクセをつけることが重要です。
変わるものにはlet、変わらない前提のものにはconstを使うようにすると、無駄な再代入のミスを防げるだけでなく、コード全体の意図が明確になります。
最初はすべてletで書いてみて、あとから「これは変わらないな」と判断した変数だけconstに変更するというやり方でもかまいません。
こうした基本的なルールの積み重ねが、GASを使った効率的な自動化や、チーム開発における信頼性あるスクリプト作成につながります。
関連リンク
次に学べる内容や、関連する実例はこちらをご覧ください。