GAS(Google Apps Script)を始めたての初学者がつまずきやすいのが、
- 同じ処理を何回もくり返したい
- for 文の仕組みがよく分からない
- 「初期化」「条件式」「増減式」って何?
- while 文との違いは?
- ネスト(入れ子)for が難しい
この記事では、**「反復(for / while)のイメージをしっかりつかむ」→「実際に書ける」**を目的に進めます。
1. 反復(くり返し)とは?
「反復」とは、同じ処理を何回も自動でくり返す仕組みです。
🧠 日常のイメージ
- 腕立て伏せを10回くり返す
- 1ページ目から10ページ目まで読む
- 駅から家まで 20 歩く
プログラミングでは、これを for 文や while 文で表現します。
2. 基本の for 文(超重要)
もっともよく使う反復が for 文 です。
for (let i = 0; i < 5; i++) {
Logger.log(i);
}
読み下し(初心者向け)
| 部分 | 意味 |
|---|---|
let i = 0 |
カウンター変数 i を 0 からスタート(初期化) |
i < 5 |
i が 5 未満のあいだくり返す(条件式) |
i++ |
1回終わるごとに i を 1 ずつ増やす(増減式) |
👉 0,1,2,3,4 の5回くり返すという意味になります。
イメージ:
「数える係の i を 0 から出発させ、4 まで 1 歩ずつ進ませる。そのたびに中の処理を実行する」
3. while 文(条件が続く限りくり返す)
while 文は、「条件が true の間ずっとくり返す」タイプ。
let n = 0;
while (n < 3) {
Logger.log(n);
n++;
}
読み下し
- n が 3 未満ならずっとくり返す
- n が 3 になったら止まる
for と while の違い(初心者向け)
| 文 | 向いている場面 |
|---|---|
| for | 「回数が決まっている」くり返し |
| while | 「条件が続く限り」くり返す |
4. ネスト(入れ子)の for 文
🔹 ネストとは何か?(まず結論)
ネスト for 文とは、
「外側の for が 1 回動くたびに、内側の for が全部動く」仕組みです。
👉 これが理解できると、一気に楽になります。
🔸 例のコード(今回の対象)
for (let day = 1; day <= 2; day++) {
for (let meal = 1; meal <= 3; meal++) {
Logger.log(day + "日目の " + meal + " 回目の食事");
}
}
🧠 まず全体像(日本語で一文にすると)
1日目〜2日目まで順番に進み、
各日ごとに「1回目〜3回目の食事」をすべて表示する
つまり、
- 外側:日
- 内側:食事の回数
という 役割分担 になっています。
🔹 役割の分解(超重要)
外側の for(親)
for (let day = 1; day <= 2; day++)
- day = 1 から始める
- 2 日目まで進める
- 1 日ずつ増える
👉 「今日は何日目か」を管理する係
内側の for(子)
for (let meal = 1; meal <= 3; meal++)
- meal = 1 から始める
- 3 回目まで進める
- 1 回ずつ増える
👉 「その日の何回目の食事か」を管理する係
🔁 実際の処理手順(ここが一番大事)
🟢 ステップ①:外側がスタート
day = 1- 条件
day <= 2→ OK
👉 「1日目」に突入
🟢 ステップ②:内側がフルで回る(重要)
この時点で meal が動き始める
内側1回目
- meal = 1
- 表示
👉1日目の 1 回目の食事
内側2回目
- meal = 2
- 表示
👉1日目の 2 回目の食事
内側3回目
- meal = 3
- 表示
👉1日目の 3 回目の食事
meal = 4 になった
- 条件
meal <= 3が false - 👉 内側 for 終了
⚠️ ここ重要
この時点で「1日目の処理は全部終わった」
🟢 ステップ③:外側が次へ進む
- day++ → day = 2
- 条件
day <= 2→ OK
👉 「2日目」に突入
🟢 ステップ④:また内側が最初から全部回る
※ ここが初心者が混乱しやすいポイント
meal は毎回 1 にリセットされる
内側1回目
- meal = 1
👉2日目の 1 回目の食事
内側2回目
- meal = 2
👉2日目の 2 回目の食事
内側3回目
- meal = 3
👉2日目の 3 回目の食事
→ 内側終了
🟢 ステップ⑤:外側終了
- day = 3
- 条件
day <= 2→ false - 👉 全体終了 🎉
📋 実際に表示される順番(完全版)
1日目の 1 回目の食事
1日目の 2 回目の食事
1日目の 3 回目の食事
2日目の 1 回目の食事
2日目の 2 回目の食事
2日目の 3 回目の食事
👉 「日 → その日の全部」の順番になっているのがポイント
🔑 初心者がつまずくポイント整理
❌ よくある誤解
- 「day と meal が交互に 1 ずつ進む」
- 「meal は続きから始まる」
✅ 正しい理解
- 外側が 1 回動く
- 👉 内側は毎回 0(または 1)から最後まで全部回る
🧠 頭の中のイメージ(口頭説明向け)
「まず『今日は何日目?』を決める
その日が決まったら、
『朝 → 昼 → 夜』を全部こなす
それが終わったら、次の日へ行く」
🎯 一言で覚えるなら
ネスト for は
『外側が 1 回動くたびに、内側はフルで動く』
5. コメントだけで書く「日本語アルゴリズム」
ここからは、コードを書かずに日本語コメントだけでアルゴリズムを示します。
生徒が自分で GAS に変換する練習用に最適です。
🧪 サンプル①:1〜5 を順番に表示する(コメント版)
function showNumbers()
// ① カウンター変数を 1 から始める
// ② 5 まで 1 ずつ増やしながら表示する
// ③ for 文を使って「1,2,3,4,5」と順に出す
🕒 サンプル②:3 回だけ「おはよう」と表示する(コメント版)
function greet()
// ① for 文で 3 回くり返す
// ② 中で「おはよう」を Logger.log で表示する
💡 サンプル③:while 文で 0〜2 を表示する(コメント版)
function showWhile()
// ① 変数 n を 0 で用意する
// ② n が 3 未満の間 while 文でくり返す
// ③ 中で n を表示し、n を 1 増やす
🎯 サンプル④:九九(2の段)を表示する(ネストなし)
function twoDan()
// ① 1〜9 まで変数 i を動かしながら
// ② 「2 × i = 結果」を表示する
🎮 サンプル⑤:2日 × 3回(朝昼晩)を表示する(ネスト)
function nestedSample()
// ① 外側の for:1日目〜2日目
// ② 内側の for:1回目〜3回目の食事
// ③ 「●日目:●回目の食事」を表示する
6. 回答コード(翻訳版)
🧪 サンプル①:1〜5 を表示
function showNumbers() {
for (let i = 1; i <= 5; i++) {
Logger.log(i);
}
}
🕒 サンプル②:3 回「おはよう」
function greet() {
for (let i = 0; i < 3; i++) {
Logger.log("おはよう");
}
}
💡 サンプル③:while 文の例
let n = 0;
function showWhile() {
while (n < 3) {
Logger.log(n);
n++;
}
}
🎯 サンプル④:2 の段
function twoDan() {
for (let i = 1; i <= 9; i++) {
Logger.log("2 × " + i + " = " + (2 * i));
}
}
🎮 サンプル⑤:ネスト(2日×3回)
function nestedSample() {
for (let day = 1; day <= 2; day++) {
for (let meal = 1; meal <= 3; meal++) {
Logger.log(day + "日目の " + meal + " 回目の食事");
}
}
}
7. まとめ
- for 文:回数が決まったくり返しに最適
- while 文:条件が続く限りくり返す
- ネスト for:組み合わせの処理を作れる
- カウンター変数 i は「数える係」
- 初期化、条件式、増減式の3つがセットで動く