本サイトはアフィリエイト広告(A8.net/もしもアフィリエイト/アクセストレード等)を利用しています
GAS変数const/letの違いと使い分け3パターン|初心者がハマる落とし穴も解説
📂 GAS入門

GAS変数const/letの違いと使い分け3パターン|初心者がハマる落とし穴も解説

📅 ⏱ 読了 約8分 ✍️ 凛

💡 本記事には広告(アフィリエイトリンク)が含まれる場合があります。

こんにちは、凛です。2児のママで現役ナースをしながら、GASで副業をしています。今日は、GASを触り始めた人がほぼ確実に一度はつまずく「constletの違い」について、病棟の申し送りばりにわかりやすくお話しますね。

「GAS const let 違い」で検索してここに来た方が、読み終わったあとすぐにコードに戻れるレベルを意識して書いています。

こんな悩みありませんか?

  • constlet、結局どっちを使えばいいのか毎回悩む」
  • 「サンプルコードにvarって書いてあるけど、2026年も使っていいの?」
  • 「書き換えようとしたら急に Assignment to constant variable って赤字で怒られた」
  • for文のカウンタはletって聞いたけど、なんでconstじゃダメなのか説明できない」

私も最初は全部varで書いていて、ある日スプレッドシートの自動集計スクリプトが突然エラーで止まったとき、白衣のポケットでスマホを握りしめたまま固まりました。でも仕組みを知ってしまえば、もう迷うことはありません。むしろ**「迷ったらconst」というシンプルなルール**で日常のGAS業務はほぼ回ります。

GASの変数宣言3兄弟の全体像

GAS(正確にはV8ランタイムのJavaScript)で使う変数宣言は、次の3つです。

宣言再代入再宣言スコープ2026年の推奨度
constできないできないブロック◎ まず使う
letできるできないブロック○ 必要なら使う
varできるできる関数△ 新規では使わない

ざっくり言うと、中身を書き換えないならconst、書き換えるならletvarはもう使わない、これだけ覚えておけば十分です。

const SHEET_NAME = '勤怠';     // 後から変えない名前 → const
let rowCount = 0;              // ループの中で増えていく → let
// var oldStyle = 'もう使わない'; // V8以降はlet/const推奨

ブロックスコープってそもそも何?

病棟で例えるなら「担当する患者さんの範囲」です。letconst波括弧 { } の中で生まれた変数が、そのブロックの外には出ていけません。varは病棟全体(=関数まるごと)が担当になってしまうので、他のループに漏れて事故ります。

function demo() {
  for (let i = 0; i < 3; i++) {
    // この i は for の中だけの存在
  }
  // console.log(i); // エラー:i は外からは見えない
}

この「見える範囲が狭い」ことが、後々のバグを減らす最大の理由です。

使い分け3パターン:迷ったらここを見る

パターン1:固定値・設定値はすべてconst

シート名、列番号、APIのURL、スプレッドシートのID…一度決めたら動かさない値はすべてconstにします。コードを読み返したときに「これは定数だな」と一目でわかるのが一番大きなメリットです。

const SPREADSHEET_ID = '1abcXXXXXXXXXXXXXXXXXXXX';
const SHEET_NAME = '患者リスト';
const HEADER_ROW = 1;
const API_ENDPOINT = 'https://example.com/api';

function openSheet() {
  const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
  return ss.getSheetByName(SHEET_NAME);
}

定数は慣習として 大文字+アンダースコア(SCREAMING_SNAKE_CASE) で書くと、さらに読みやすくなります。チームでGASを触るときにも「これは絶対に触らないで」という合図になります。

constでも中身は書き換えられるワナ

ここが初心者の最大のハマりポイント。constで宣言した配列やオブジェクトは、再代入はできないけれど中身は書き換え可能です。

const users = [];
users.push('佐藤'); // ✅ OK:配列に要素を追加しているだけ
users[0] = '変更';        // ✅ OK:中身を書き換えているだけ
// users = ['別配列'];    // ❌ NG:再代入はできない

constだから中身も変わらない」と思い込んで、意図せず配列の中身が書き換わってバグった…というのは副業でGASを教えた生徒さんからもよく聞きます。constが守ってくれるのは「名前と中身の結びつき」だけ、と覚えておきましょう。

パターン2:ループカウンタ・一時値はlet

for文のカウンタや、途中で中身が変わる変数にはletを使います。

function sumColumn(values) {
  let total = 0;
  for (let i = 0; i < values.length; i++) {
    total += values[i];
  }
  return total;
}

ここで const i と書くと「ループを1周して i++しようとした瞬間」にエラーで止まります。再代入できないのがconstの仕事なので、当然の挙動ですね。

もうひとつletの出番は、条件分岐で値が変わる変数です。

function selectMessage(hour) {
  let message = 'おつかれさまです';
  if (hour < 10) {
    message = 'おはようございます';
  } else if (hour >= 18) {
    message = 'お疲れ様でした、お気をつけてお帰りください';
  }
  return message;
}

ifで値を差し替える用途は、letの王道です。

パターン3:関数の引数は加工してconstに入れ直す

関数の引数は技術的には書き換え可能ですが、直接いじらず新しいconstに入れ直すのが読みやすさの面で圧倒的におすすめです。

function formatPatientName(rawName) {
  const name = rawName.trim();                  // 前後の空白除去
  const normalized = name.replace(/\s+/g, ' '); // 全角半角空白をまとめる
  return normalized;
}

引数を直接上書きすると、呼び出し元と食い違ったときに原因追跡がツラくなります。入り口を汚さず、加工ステップごとに新しいconstを積み上げると、半年後の自分が助かります。

varを避けるべき3つの理由

varでも動くなら、別にいいのでは?」という質問もよくいただきます。結論、新規コードではvarを使わない方が安全です。

  1. ブロックを突き抜けてしまうforの中で宣言したvar iが外まで見えて、意図せず別の場所で書き換わる
  2. 再宣言できてしまう:同じ名前を何度でも宣言できるため、タイプミスに気づきにくい
  3. 巻き上げ(hoisting)の挙動が直感に反する:宣言前に参照してもundefinedになり、エラーで気づけない

GAS(V8ランタイム)はlet/constが素直に使えるので、varを選ぶ理由がもう残っていません。古いサンプルコードにvarが出てきたら、写経するときにconst/letに書き換える練習をするくらいがちょうど良いです。

よくあるエラーと解決法

Assignment to constant variable.

もっともよく見るエラー。constで宣言した変数に再代入しようとしたときに出ます。

const count = 0;
count = count + 1; // ❌ Assignment to constant variable.

対処:再代入したいならletに変える。再代入したくないなら、ロジックを見直して別のconstを作る。

let count = 0;
count = count + 1; // ✅ letなのでOK

SyntaxError: Identifier '〇〇' has already been declared.

同じ名前を2回const/letで宣言すると出ます。

const name = '佐藤';
const name = 'ママ'; // ❌ 同じ名前は2回宣言できない

対処:違う名前を付けるか、再代入にするならletに統一します。var時代の「同じ名前で何度でも宣言OK」のクセが残っている人は要注意。

迷ったら「const → let」の順で書く

現場のコツとして、まずconstで書いてみて、どうしても再代入が必要になったらletに書き換えるという順序を強くおすすめします。

  • constで書き始める
  • エラーが出て再代入が必要とわかったらletに変える
  • ループの中だけで使う変数は最初からlet
  • グローバルに置く設定値は全部constで大文字命名

この順で書くと、後から読み返したときに「ここは変わる値/ここは固定値」が自然に整理されます。料理でおかずを小分けにするのと同じで、容器を先に決めてから中身を詰めると失敗しないんですよね。

まとめ

  • 書き換えないならconst、書き換えるならletvarは新規では使わない
  • constは再代入を禁止するだけで、配列・オブジェクトの中身は変えられる
  • letの出番はループカウンタと条件分岐での値差し替え
  • 迷ったらconstファーストで書いて、必要になったらletに直す
  • エラー Assignment to constant variable. が出たらそれはlet案件

GAS初心者のうちは「全部constにして大丈夫?」と不安になるのですが、実際に書いてみると再代入が必要な場面は意外と少ないことに気づきます。ナース仲間にも「変数は基本const、ループと条件分岐だけlet」と教えると、だいたい一発で腑に落ちてもらえます。

次は GAS関数の書き方7例とreturn徹底解説 で、関数の中での変数スコープをもう一歩深く見ていくのがおすすめです。

関連記事


この記事を書いた人:凛

2児のママで現役ナース。夜勤明けの細切れ時間を副業GASに投じ、月5〜8万円の副収入を継続中。「看護師でもコードは書ける」を合言葉に、家事育児とプログラミングを両立する等身大の情報を発信しています。本記事のコードは静的検証済みです(構文・API仕様・ロジックを確認)。