【GAS入門#2】制御構文入門 - 条件分岐と繰り返し処理をやさしく解説
GAS初学者向け:制御構文入門 - プログラムに「判断」と「繰り返し」の力を与えよう
こんにちは!ノンプロ研でGASコースのTAをしているTaroです。
今回は、GAS(Google Apps Script)の「制御構文」について、初学者の方でも理解できるように丁寧に解説していきます。この記事は、ノンプロ研初心者講座【GASコース】第2回の内容をもとに作成しています。
この記事で学べること
プログラムに「判断する力」を与える条件分岐
プログラムに「繰り返す力」を与えるループ処理
これらを組み合わせた実践的な使い方
最初に伝えたい大切なこと: 制御構文は、最初は「なんでこんな書き方をするの?」と思うかもしれません。でも大丈夫。これを理解すると、あなたのプログラムが一気に「実務で使えるツール」に変わります。今は完璧に理解できなくても、手を動かしながら少しずつ慣れていきましょう。
プログラミングの基本は「3つの手続き」
プログラムは、実は3種類の処理の組み合わせでできています:
順次:上から順番に実行する
選択:条件によって処理を変える(今日のメインテーマ その1)
反復:同じ処理を繰り返す(今日のメインテーマ その2)
前回の講座では「順次」を学びました。データを変数に入れたり、計算したりする基本的な流れでしたね。
今回はいよいよ、プログラムに「自分で判断する力」と「繰り返す力」を与えます。この2つができるようになると、あなたのプログラムは一気に実用的になります。
なぜこれが大事?
実務では、「もし○○だったら△△する」「100件のデータを全部処理する」といった作業が山ほどあります。これを手作業でやっていたら日が暮れてしまいますが、制御構文を使えば一瞬で終わります。
第1部:条件分岐 - プログラムに「判断する力」を与える
条件式(ブール式)とは?
プログラムに判断させるには、まず「条件式」を理解する必要があります。
条件式は、trueかfalseのどちらかの値しか持たない式です:
true:条件が成立している
false:条件が成立していない
例えば:
「5は3より大きい」→ true(成立している)
「5は10より大きい」→ false(成立していない)
これだけです。プログラムは白黒ハッキリさせるのが得意なんです。
比較演算子:数値や文字列を比べる
条件式を書くために、まず「比較演算子」を覚えましょう。
x === y // 等しい
x !== y // 等しくない
x > y // より大きい
x >= y // 以上(等しいを含む)
x < y // より小さい
x <= y // 以下(等しいを含む)
ちょっと待って!「===」って何?「=」じゃダメなの?
いい質問です!プログラミングでは:
=:代入(箱に値を入れる)
===:比較(等しいかどうかチェックする)
この違いは超重要なので、しっかり区別しましょう。
実際に試してみよう(演習2-01)
function myFunction2_01() {
const x = 5;
const y = 3;
console.log(x === y); // false(5と3は等しくない)
console.log(x !== y); // true(5と3は等しくない)
console.log(x > y); // true(5は3より大きい)
console.log(x >= y); // true(5は3以上)
console.log(x < y); // false(5は3より小さくない)
console.log(x <= y); // false(5は3以下ではない)
}
xとyの値を変えて何度か実行してみてください。「あ、こういうことか!」と腑に落ちる瞬間が来るはずです。
if文:条件が成立したら処理を実行する
さて、いよいよ「条件分岐」の本番です。
if文の基本形:
if (条件式) {
// 条件式がtrueのときだけ実行される処理
}
ポイント:
条件式がtrueなら、{}の中の処理を実行
条件式がfalseなら、{}の中の処理をスキップ
{}の中はインデント(字下げ)を入れる ← これは暗黙のルールです
実際に試してみよう(演習2-02)
function myFunction2_02() {
const x = 5;
const y = 3;
if (x > y) {
console.log('xはyより大きい');
}
}
xとyの値を色々変更して試してみましょう。例えば、x = 2にすると、何も出力されません。なぜなら条件がfalseだからです。
これが将来どう役立つ?
例えば、スプレッドシートで「売上が目標を超えたら担当者にメールを送る」といった処理を自動化できます。if文がないと、人間が毎回チェックしなければいけませんよね。
if...else文:「○○だったら△△、そうでなければ××」
実務では、「Aだったら処理1、Aじゃなかったら処理2」という二者択一の判断がよくあります。
if...else文の基本形:
if (条件式) {
// 条件式がtrueのときの処理
} else {
// 条件式がfalseのときの処理
}
実際に試してみよう(演習2-03)
function myFunction2_03() {
const x = 5, y = 3; // カンマで区切って同時に宣言できます
if (x > y) {
console.log('xはyより大きい');
} else {
console.log('xはy以下');
}
}
ここで一つ演習:偶数か奇数かを判定しよう(演習2-04)
整数xが偶数なら「●●は偶数です」、奇数なら「●●は奇数です」と出力するプログラムを作ってみましょう。
ヒント:
偶数かどうかは、2で割った余りで判定できます
余りを求める演算子は%(モジュロ演算子)
x % 2 === 0なら偶数
function myFunction2_04() {
const x = 10;
if (x % 2 === 0) {
console.log(x + 'は偶数です');
} else {
console.log(x + 'は奇数です');
}
}
これが実務でどう使える?
データの分類(偶数行と奇数行で背景色を変える、など)
曜日判定(平日と土日で処理を変える、など)
在庫管理(在庫が偶数か奇数かで発注タイミングを変える、など)
論理演算子:複数の条件を組み合わせる
実務では、「○○かつ△△」「○○または△△」といった複雑な条件が必要になることがあります。
主な論理演算子:
条件A && 条件B // AND(かつ):両方ともtrueのときだけtrue
条件A || 条件B // OR(または):どちらか一方でもtrueならtrue
!条件A // NOT(否定):trueとfalseを逆転
実際に試してみよう(演習2-05)
function myFunction2_05() {
const x = 15, y = 10;
// xもyも10以上の場合
if (x >= 10 && y >= 10) {
console.log('xもyも10以上です');
}
// xかyのどちらかが10以上の場合
if (x >= 10 || y >= 10) {
console.log('xかyのどちらかが10以上です');
}
}
xとyの値を変えて、結果がどう変わるか試してみましょう。
ちょっと不思議な動き(演習2-06)
function myFunction2_06() {
if (10) {
console.log('trueでした');
}
if ('Hello!') {
console.log('trueでした');
}
}
両方とも「trueでした」と出力されます。なぜ?
真偽値への型変換
JavaScriptでは、条件式に数値や文字列を指定すると、自動的に真偽値に変換されます:
0、''(空文字)、null、undefined、NaN → false
それ以外 → true
今は「そういうものなんだ」程度の理解でOKです。慣れてくると便利に使えるようになります。
if...else if文:3つ以上の選択肢から選ぶ
「Aなら処理1、Bなら処理2、それ以外なら処理3」といった、3つ以上の分岐が必要な場合があります。
if...else if文の基本形:
if (条件式A) {
// 条件Aがtrueのときの処理
} else if (条件式B) {
// 条件Aがfalse、かつ条件Bがtrueのときの処理
} else {
// どの条件もfalseのときの処理
}
実際に試してみよう(演習2-07)
function myFunction2_07() {
const x = 10;
if (x > 10) {
console.log('xは10より大きいです');
} else if (x === 10) {
console.log('xは10と等しいです');
} else {
console.log('xは10未満です');
}
}
実務での使い道:
成績評価(90点以上ならA、80点以上ならB...)
料金計算(年齢によって料金が変わる)
ステータス管理(在庫が100以上なら「十分」、50以上なら「やや少ない」、それ以下なら「不足」)
switch文:値による分岐を見やすく書く
「ある値によって処理を振り分ける」場合、switch文を使うとコードが読みやすくなります。
switch文の基本形:
switch (式) {
case 値1:
// 式が値1と一致したときの処理
break;
case 値2:
// 式が値2と一致したときの処理
break;
default:
// どの値とも一致しなかったときの処理
}
重要: break;を忘れると、次のcaseにも入ってしまいます!
実際に試してみよう(演習2-08)
function myFunction2_08() {
const rank = '優';
switch (rank) {
case '優':
console.log('すごいですね');
break;
case '良':
console.log('がんばりましたね');
break;
case '可':
console.log('ギリギリでしたね');
break;
case '不可':
console.log('残念でしたね');
break;
}
}
if文とswitch文、どっちを使えばいい?
if文:複雑な条件式、範囲判定(○○以上、○○未満など)
switch文:値が完全に一致するかどうかの判定
慣れてくると、どちらが読みやすいか感覚でわかるようになります。
第2部:繰り返し - プログラムに「繰り返す力」を与える
さて、ここからは「繰り返し処理(ループ)」について学びます。
なぜ繰り返しが必要?
プログラミングの最大の強みは、「同じ作業を何千回でも正確に、一瞬で実行できる」ことです。
例えば:
スプレッドシートの1000行のデータを全部チェック
メール送信リストの全員にメールを送る
1から100までの数字を全部足す
これを手作業でやったら...想像したくないですよね。
for文:決まった回数だけ繰り返す
「○○回繰り返す」という処理には、for文を使います。
for文の基本形:
for (初期化式; 条件式; 増減式) {
// 繰り返す処理
}
3つの式の役割:
初期化式:カウント用の変数を初期化(最初に1回だけ実行)
条件式:この条件がtrueの間、繰り返しを続ける
増減式:繰り返しの最後に実行(カウントを増やす)
実際に試してみよう(演習2-09)
function myFunction2_09() {
for (let i = 1; i <= 10; i++) {
console.log(i);
}
}
この処理の流れ:
let i = 1:iを1で初期化
i <= 10をチェック → true(1は10以下)
console.log(i)を実行 → 1と出力
i++を実行 → iが2になる
i <= 10をチェック → true(2は10以下)
...これを10回繰り返す
iが11になったとき、i <= 10がfalseになり、ループ終了
i++って何?
これは「インクリメント演算子」といって、i = i + 1と同じ意味です。iを1増やす、という意味ですね。
カウント変数iはどう変化している?
1回目の処理:iの値は1
2回目の処理:iの値は2
...
10回目の処理:iの値は10
演習にチャレンジ(演習2-10)
1から任意の整数xまでの整数を順番に足し算した結果を出力するプログラムを作ってみましょう。
例:x=10の場合、「1から10まで加算すると55です」と出力
ヒント:
合計を入れる変数を用意する
forループで1からxまで繰り返す
各ループで合計に値を加算していく
function myFunction2_10() {
const x = 10;
let sum = 0; // 合計を入れる変数
for (let i = 1; i <= x; i++) {
sum = sum + i; // または sum += i
}
console.log('1から' + x + 'まで加算すると' + sum + 'です');
}
これが実務でどう使える?
売上の集計
データの一括処理
レポート生成
forループは、スプレッドシートの行を全部処理する、といった作業で大活躍します。
while文:条件を満たす間、繰り返す
「○○という条件を満たす間、繰り返す」という処理には、while文を使います。
while文の基本形:
while (条件式) {
// 条件式がtrueの間、繰り返す処理
}
for文との違いは?
for文:繰り返す回数が決まっている場合
while文:条件次第で繰り返す回数が変わる場合
実際に試してみよう(演習2-11)
function myFunction2_11() {
let i = 10;
while (i) {
console.log(i);
i--; // デクリメント演算子(i = i - 1と同じ)
}
}
10から1まで、カウントダウンするように出力されます。
ちょっと待って!i--を消すとどうなる?
function myFunction2_11() {
let i = 10;
while (i) {
console.log(i);
// i--; を削除
}
}
これは絶対にやってはいけません!
iが永久に10のままなので、条件が永久にtrueのままになります。これを「無限ループ」といい、プログラムが止まらなくなります。
無限ループを防ぐには:
必ずループが終了する条件を設定する
ループの中で条件が変化するようにする(例:カウント変数を増減させる)
演習にチャレンジ(演習2-12)
x=1から、xの値を2倍ずつにしていき(2, 4, 8, ...)、xの値が100を超えない間、xをログ出力するプログラムを作ってみましょう。
ヒント:
xを2倍にするには x = x * 2 または x *= 2
条件は x <= 100
function myFunction2_12() {
let x = 1;
while (x <= 100) {
console.log(x);
x = x * 2; // または x *= 2
}
}
出力結果:1, 2, 4, 8, 16, 32, 64
実務での使い道:
データベースから条件に合うデータを取り出す
ファイルの終わりまで読み込む
ユーザーが「終了」を選ぶまで処理を続ける
第3部:ネスト - 制御構文を組み合わせる
さて、ここからが応用編です。「ネスト」とは「入れ子構造」のこと。制御構文の中に、さらに制御構文を入れることです。
ネストの例:
for (let i = 1; i <= 100; i++) {
if (i % 3 === 0) {
console.log(i);
}
}
これは「1から100までループして、3の倍数だけを出力する」プログラムです。
ポイント:
forブロックの中にifブロックが入っている
ネストの分だけインデントを増やす ← これは必須ルール
実際に試してみよう(演習2-13)
function myFunction2_13() {
for (let i = 1; i <= 100; i++) {
if (i % 3 === 0) {
console.log(i);
}
}
}
3, 6, 9, 12, ...と、3の倍数だけが出力されます。
繰り返しのネスト:ループの中にループ
ループの中にループを入れることもできます。これは「二重ループ」と呼ばれます。
繰り返しのネストの基本形:
for (let i = 1; i <= 9; i++) {
for (let j = 1; j <= 9; j++) {
// iとjを使った処理
}
}
どういうときに使う?
縦×横の処理(例:座席表、カレンダー)
二次元配列の処理(表のような構造のデータ)
全ての組み合わせを試す処理
九九表を作ってみよう(演習2-14)
function myFunction2_14() {
for (let i = 1; i <= 9; i++) {
for (let j = 1; j <= 9; j++) {
console.log(i + '×' + j + '=' + (i * j));
}
}
}
出力結果:
1×1=1
1×2=2
...
9×8=72
9×9=81
処理の流れ:
iが1のとき、jが1から9まで変化(1×1, 1×2, ..., 1×9)
iが2のとき、jが1から9まで変化(2×1, 2×2, ..., 2×9)
...
iが9のとき、jが1から9まで変化(9×1, 9×2, ..., 9×9)
実務での使い道:
スプレッドシートの全セルをチェック
複数のリストの組み合わせをチェック
マトリックス形式のレポート作成
総合演習:FizzBuzz問題にチャレンジ(演習2-15)
最後に、プログラミング学習でよく使われる「FizzBuzz問題」にチャレンジしましょう。
問題: 1から100まで数字を出力します。ただし:
3の倍数のときは数字の代わりに「Fizz」
5の倍数のときは数字の代わりに「Buzz」
3の倍数かつ5の倍数のときは「FizzBuzz」
このプログラムを2通り以上作ってみてください。
解答例1:if...else if文を使う方法
function myFunction2_15_v1() {
for (let i = 1; i <= 100; i++) {
if (i % 15 === 0) { // 15の倍数 = 3の倍数かつ5の倍数
console.log('FizzBuzz');
} else if (i % 3 === 0) {
console.log('Fizz');
} else if (i % 5 === 0) {
console.log('Buzz');
} else {
console.log(i);
}
}
}
解答例2:文字列を組み立てる方法
function myFunction2_15_v2() {
for (let i = 1; i <= 100; i++) {
let output = '';
if (i % 3 === 0) {
output += 'Fizz';
}
if (i % 5 === 0) {
output += 'Buzz';
}
if (output === '') {
output = i;
}
console.log(output);
}
}
ポイント:
同じ結果を得るのに、複数の書き方がある
どちらが良いかは、状況や好みによる
「動く」だけでなく「読みやすい」コードを書くのが大事
まとめ:プログラミングの3つの手続き
最後にもう一度、プログラミングの基本を確認しましょう。
順次:上から順番に実行する
選択:条件によって処理を変える(if文、switch文)
反復:同じ処理を繰り返す(for文、while文)
これだけで何ができる?
この3つを組み合わせるだけで、驚くほど複雑で実用的なプログラムが作れます:
売上データを自動集計して、目標達成した担当者にメールを送る
スプレッドシートの全データをチェックして、エラーがあれば修正する
毎日決まった時刻に、前日の業績レポートを自動生成する
発展:将来できるようになること
制御構文をマスターすると、こんなことができるようになります:
業務自動化の例
1. 条件付きメール送信
スプレッドシートの売上データをチェック
↓
if (売上 >= 目標):
担当者にお祝いメールを送信
else:
励ましメールを送信
2. データ整理・分類
for (各行について):
if (金額 >= 10000):
「重要」ラベルを付ける
else if (金額 >= 5000):
「中程度」ラベルを付ける
else:
「通常」ラベルを付ける
3. 定期レポート生成
for (各部署について):
while (データがある間):
データを集計
レポートを作成
管理者にメールで送信
今は難しく感じてもOK!
これらの例は、まだ習っていない知識も含まれています。でも、今日学んだ「条件分岐」と「繰り返し」が、これらの自動化の核になっているんです。
将来、スプレッドシート操作やメール送信を学んだとき、「あ、あのときの制御構文がここで使えるんだ!」と気づく瞬間が来ます。その日を楽しみに、今は基礎を固めていきましょう。
学習のコツ
1. 手を動かす
記事を読むだけでなく、必ず自分でコードを書いて実行してみてください。エラーが出ても大丈夫。エラーから学ぶことはたくさんあります。
2. 小さく始める
最初から完璧なプログラムを書こうとしなくてOK。「1から10まで出力する」だけでも立派な一歩です。
3. 写経する
最初は例題をそのまま写すだけでもOK。写しながら「この部分はこういう意味だな」と考えることが大事です。
4. 数値を変えて遊ぶ
例題の数値を変更して、動きがどう変わるか試してみましょう。予想と違う結果になったら、「なぜ?」と考えるチャンスです。
5. わからないことは質問する
ノンプロ研のSlackで質問してみましょう。同じことで悩んでいる人は他にもいるはずです。
次回予告
次回は「関数」と「配列」について学びます。
関数:処理をまとめて再利用できる仕組み
配列:複数のデータをまとめて扱う仕組み
これらを学ぶと、プログラムがさらに整理されて、もっと複雑な処理ができるようになります。
今回の制御構文と組み合わせると、本当に実務で使えるツールが作れるようになりますよ!
最後に
制御構文は、最初は「何のためにこんな書き方をするの?」と思うかもしれません。でも、実務で使い始めると、その威力に驚くはずです。
「もし〇〇だったら」「全部のデータを」という処理は、仕事の中で山ほど出てきます。それを自動化できる力を、あなたは今日手に入れました。
まずは簡単な例から始めて、少しずつ複雑な処理にチャレンジしていきましょう。あなたのペースで大丈夫です。
一緒に頑張りましょう!
ハッシュタグ:#ノンプロ研 #GAS初心者講座
質問や感想は、ノンプロ研のSlackやXでシェアしてくださいね!
