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

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

📅 ⏱ 読了 約8分 ✍️ 凛

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

こんにちは、凛です。看護師をしながら、すき間時間にGAS(Google Apps Script)で病棟の事務仕事を自動化しています。

GASを触り始めた人がほぼ確実に一度はつまずくのが「constletの違い」。私も最初は全部varで書いていて、ある日スプレッドシートの自動集計スクリプトが突然エラーで止まったとき、白衣のポケットでスマホを握りしめたまま固まりました。書き換えようとしたらAssignment to constant variableと赤字で怒られた経験がある方も多いんじゃないでしょうか。

この記事は、副業でGASを教えていて実際によく受ける質問を、Q&A形式でそのまま並べてみました。気になるところから読んでもらって大丈夫です。

Q. constとlet、結局どっちを使えばいいの?

一番多い質問なので、最初に答えます。「迷ったらconst」というシンプルなルールで、日常のGAS業務はほぼ回ります。

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

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

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

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

Q. 「ブロックスコープ」ってそもそも何?

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

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

この「見える範囲が狭い」ことが、後々のバグを減らす最大の理由です。担当範囲が狭いほど、事故ったときに原因を探す範囲も狭くて済む。看護もコードも同じですね。

Q. 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を触るときにも「これは絶対に触らないで」という合図になります。

Q. constなのに配列の中身が変わるんだけど、バグ?

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

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

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

Q. じゃあletの出番はいつ?

大きく2つです。まずfor文のカウンタや、途中で中身が変わる変数。

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

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

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

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

ifで値を差し替える用途は、letの王道です。逆に言うと、この2つ以外でletが必要になる場面は意外と少ないんですよ。

Q. 関数の引数って直接書き換えていいの?

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

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

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

Q. サンプルコードにvarって書いてあるけど、使っちゃダメ?

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

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

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

Q. 「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

Q. 「Identifier ‘〇〇’ has already been declared.」は?

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

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

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

おわりに:現場では「const→let」の順で書く

質問に一通り答えたところで、私が実際にやっている書き方のコツをひとつ。まずconstで書いてみて、どうしても再代入が必要になったらletに書き換えるという順序を強くおすすめします。エラーが出て再代入が必要とわかったらletに変える。ループの中だけで使う変数は最初からlet。グローバルに置く設定値は全部constで大文字命名。この順で書くと、後から読み返したときに「ここは変わる値/ここは固定値」が自然に整理されます。料理でおかずを小分けにするのと同じで、容器を先に決めてから中身を詰めると失敗しないんですよね。

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

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

関連記事

自分でも作れるようになりたい方へ

GASを体系的に学びたい方には、現役エンジニアから直接学べるプログラミングスクールがおすすめです。副業で稼ぐための実践的なカリキュラムが充実しています。

Dive into Code(プログラミングスクール)


この記事を書いた人:凛

2児のママで現役ナースの凛です。病棟の事務仕事を一つずつGASで自動化してきた経験をもとに、「非エンジニアでも読める実務目線のGAS解説」をモットーに発信しています。誇張なし・実務ベースで、今日から使えるレシピをお届けします。