GASで業務を自動化しようとするとき、私たちはよく「もし〜だったら、こうしたい」と考えます。例えば、「もしスプレッドシートのA列の値が100以上なら、B列に『OK』と入力する」といった具合です。
このように、ある条件が成り立つかどうかで処理の流れを変えることを「条件分岐」と呼びます 。GASでは、主にif(イフ)文という命令を使って、この条件分岐を記述します 。
条件分岐は、単調な繰り返し作業だけでなく、状況に応じた判断をGASに任せるために不可欠な技術です。
この記事では、GAS初心者の方向けに、条件分岐の基本であるif文の使い方と、条件を比べるために使う「比較演算子」(>=や==など) について、分かりやすく解説していきます。
if文について
「もし〜なら」を実現する if文の基本
GASで自動化を行う際、「もし特定の条件を満たしたら、この処理を実行したい」という場面が必ず出てきます。例えば、「もし点数が60点以上なら『合格』と判定する」といった処理です。
このような「条件分岐」を行うのが if 文です 。
if文の基本的な書き方
if 文の最も基本的な形は、次のようになります 。
if (条件式) {
// 条件式が成り立った(trueだった)場合に実行する処理
}
( ) の中に「条件式」を記述し、その条件が成り立った場合(専門用語で true と言います)にだけ、{ } の中に書かれた処理が実行されます 。
もし条件が成り立たなかった場合(false と言います)、{ } の中の処理は実行されず、完全に無視(スキップ)されます 。
GASでの具体例:テストの点数で合否判定
スプレッドシートの点数(数値)をGASで読み取り、その点数が合格基準(例:60点)を満たしているか判定するコードを見てみましょう。
実行前のスプレッドシートの状態: Sheet1のA1セルに「80」と入力されているとします。
// スプレッドシートの点数で合否判定する
function checkScore() {
// 現在アクティブなスプレッドシートを取得
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// 'Sheet1' という名前のシートを取得
const sheet = spreadsheet.getSheetByName('Sheet1');
// A1セルの値(点数)を取得
const score = sheet.getRange('A1').getValue(); // scoreには 80 が入る
console.log(`取得した点数: ${score}`);
// 条件分岐:もし点数(score)が60以上なら
if (score >= 60) {
console.log('合格です');
}
console.log('判定処理を終了しました');
}
実行結果(scoreが80の場合):
取得した点数: 80
合格です
判定処理を終了しました
解説:
- 変数
scoreには80が入ります。 if (score >= 60)という条件式は、「80は60以上である」となり、条件が成り立ちます(true)。- そのため、
{ }の中のconsole.log('合格です');が実行されます 。 if文の後のconsole.log('判定処理を終了しました');は、条件分岐とは関係なく必ず実行されます 。
条件が成り立たない場合
では、もしA1セルの値が「45」だったらどうなるでしょうか?
実行結果(scoreが45の場合):
取得した点数: 45
判定処理を終了しました
解説:
- 変数
scoreには45が入ります。 if (score >= 60)という条件式は、「45は60以上である」となり、条件が成り立ちません(false)。- そのため、
{ }の中のconsole.log('合格です');は実行されず、スキップされます 。 if文の後のconsole.log('判定処理を終了しました');のみ実行されます 。
このように、if 文はプログラムの流れをコントロールする基本的な命令です。
条件を比べる「比較演算子」をマスターしよう
前のセクションで、if (score >= 60) というコードが登場しました。この ( ) の中で使われている score >= 60 が「条件式」であり、>= の記号を「比較演算子」と呼びます 。
比較演算子は、左辺(score)と右辺(60)の値を比べて、その条件が「正しい(true)」か「間違っている(false)」かの結果を返す記号です 。if文は、この結果が true だった場合にのみ処理を実行します。
GAS(JavaScript)でよく使う比較演算子には、以下の種類があります。
| 演算子 | 意味 | 使用例 | trueになる条件 | |
> | より大きい(~より上) | a > b | aがbより大きい | |
< | より小さい(~未満) | a < b | aがbより小さい | |
>= | 以上(~以上) | a >= b | aがb以上 | |
<= | 以下(~以下) | a <= b | aがb以下 | |
== | 等しい | a == b | aとbが(型を変換して)等しい | |
!= | 等しくない | a != b | aとbが(型を変換して)等しくない | |
=== | 厳密に等しい | a === b | aとbが値もデータ型も等しい | |
!== | 厳密に等しくない | a !== b | aとbが値またはデータ型が等しくない |
「代入」と「比較」の違いに注意!
初心者が最も間違いやすいのが = と ==(または ===)の違いです。
=(イコール1個): 「代入」を意味します。右辺の値を左辺の変数に入れます。(例:let num = 100;)==または===(イコール2個か3個): 「比較」を意味します。左辺と右辺が等しいか調べます 。
if文の条件式で if (num = 100) と書いてしまうと、「numに100を代入する」という動作になり、比較ができないため、意図した通りの処理になりません。必ず == または === を使ってください。
== と === はどう違う?(重要)
== と === は、どちらも「等しいか」を比べますが、その「厳密さ」が異なります 。
==(等しい): 比較する前に、自動でデータ型を揃えようとします 。- 例えば、数値の
100と、文字列の'100'を比較した場合、==は「どちらも100だ」と判断し、trueを返します 。
- 例えば、数値の
===(厳密に等しい): データ型まで含めて、完全に一致しているか比較します 。- 数値の
100と、文字列の'100'を比較した場合、===は「データ型が違う(数値と文字列だ)」と判断し、falseを返します 。
- 数値の
function checkEquals() {
console.log('--- ==(型変換あり)---');
console.log( 100 == '100' ); // true [cite: 100, 101]
console.log('--- ===(型変換なし・厳密)---');
console.log( 100 === '100' ); // false [cite: 106, 107]
console.log( 100 === 100 ); // true [cite: 103, 104]
}
結論:常に === を使いましょう
GASでスプレッドシートの値を扱う際、数値として入力したつもりが文字列として取得される(またはその逆)といったことが起こりがちです。
== を使うと、このような意図しないデータ型の違いが自動で変換されてしまい、バグ(不具合)の原因になります。
特別な理由がない限り、比較を行う際は常に ===(厳密な比較)を使用すると覚えてください。「等しくない」を判定する場合も同様に !== を使うようにしましょう。
条件が成り立たない時も処理する if…else 文
前のセクションで学んだ if 文は、「もし条件が成り立ったら(trueなら)、処理を実行する」というものでした。
しかし、自動化では「条件が成り立たなかった場合(falseなら)、別の処理を実行したい」という場面も非常に多いです。 例えば、「もし点数が60点以上なら『合格』と表示し、そうでなければ『不合格』と表示する」といった処理です。
このように、条件が成り立たなかった場合の処理を指定するのが if...else 文です。
if…else 文の基本的な書き方
if...else 文は、以下のように記述します。
if (条件式) {
// 条件式が成り立った(trueだった)場合に実行する処理
} else {
// 条件式が成り立たなかった(falseだった)場合に実行する処理
}
条件式が true であれば if の { } 内の処理が実行され、false であれば else の { } 内の処理が実行されます。 どちらか一方だけが必ず実行される、というのがポイントです。
GASでの具体例:在庫ステータスの更新
スプレッドシートの在庫数に応じて、「在庫あり」または「在庫切れ」のステータスを自動で入力するスクリプトを見てみましょう。
実行前のスプレッドシート(シート名 ‘商品リスト’): A2セルに在庫数(例: 5)、B2セルは空欄。
// スプレッドシートの在庫数でステータスを変更する
function checkStockStatus() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('商品リスト');
// A2セルの在庫数を取得
const stock = sheet.getRange('A2').getValue();
// B2セル(ステータスを書き込むセル)を取得
const statusCell = sheet.getRange('B2');
console.log(`現在の在庫数: ${stock}`);
// 条件分岐:もし在庫(stock)が 0 より大きいなら
if (stock > 0) {
// trueの場合(在庫が1以上ある)
statusCell.setValue('在庫あり');
console.log('ステータスを「在庫あり」に更新しました。');
} else {
// falseの場合(在庫が0以下)
statusCell.setValue('在庫切れ');
console.log('ステータスを「在庫切れ」に更新しました。');
}
console.log('在庫確認処理が完了しました。');
}
実行結果の解説
実行例1(A2セルが 5 の場合):
- 変数
stockには5が入ります。 if (stock > 0)の条件式(5は0より大きい)はtrueとなります。ifの{ }内が実行され、B2セルに「在庫あり」と書き込まれます。elseの{ }内は実行されません(スキップされます)。- ログには「現在の在庫数: 5」「ステータスを「在庫あり」に更新しました。」「在庫確認処理が完了しました。」の順で表示されます。
実行例2(A2セルが 0 の場合):
- 変数
stockには0が入ります。 if (stock > 0)の条件式(0は0より大きい)はfalseとなります。ifの{ }内は実行されません(スキップされます)。elseの{ }内が実行され、B2セルに「在庫切れ」と書き込まれます。- ログには「現在の在庫数: 0」「ステータスを「在庫切れ」に更新しました。」「在庫確認処理が完了しました。」の順で表示されます。
このように、if...else 文を使うことで、条件に応じて処理を確実に二分岐させることができます。
3つ以上の選択肢に対応する else if 文
if 文(もし〜なら)、if...else 文(もし〜なら、さもなければ〜)に続いて、今度は「もしAなら〜、そうでなくもしBなら〜、そうでなくもしCなら〜」といった、複数の条件で処理を分けたい場合があります。
例えば、テストの点数に応じて「優(90点以上)」「良(70点以上)」「可(50点以上)」「不可(それ以外)」のように、3つ以上の段階的な判定を行いたい場合です。
このような複数の条件分岐を実現するのが else if 文です。
else if 文の基本的な書き方
else if は、if と else の間に挟む形で、必要な数だけ追加することができます。
if (条件式①) {
// 条件式①が成り立った(trueだった)場合に実行する処理
} else if (条件式②) {
// 条件式①が false で、かつ条件式②が true だった場合に実行する処理
} else if (条件式③) {
// 条件式①も②も false で、かつ条件式③が true だった場合に実行する処理
} else {
// 上記のどの条件式も成り立たなかった(すべて false だった)場合に実行する処理
}
重要なポイント:
- 上から順番に条件式が判定されます。
- どれか一つの条件が
trueになると、その{ }内の処理が実行され、残りのelse ifやelseはすべて無視されます。 - 最後の
elseは、どの条件にも当てはまらなかった場合の「その他」の処理となり、省略することも可能です。
GASでの具体例:成績判定(優・良・可・不可)
スプレッドシートの点数(数値)を読み取り、成績を判定して隣のセルに入力するスクリプトです。
実行前のスプレッドシート(シート名 ‘成績表’): A2セルに点数(例: 75)、B2セルは空欄。
// スプレッドシートの点数で成績を判定する
function setGrade() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('成績表');
// A2セルの点数を取得
const score = sheet.getRange('A2').getValue();
// B2セル(判定を書き込むセル)を取得
const gradeCell = sheet.getRange('B2');
let grade = ''; // 判定結果を格納する変数
console.log(`点数: ${score}`);
// 条件分岐:点数(score)で判定
if (score >= 90) {
grade = '優';
} else if (score >= 70) {
grade = '良';
} else if (score >= 50) {
grade = '可';
} else {
grade = '不可';
}
// 判定結果をB2セルに書き込む
gradeCell.setValue(grade);
console.log(`判定: ${grade}`);
}
実行結果の解説
実行例1(A2セルが 75 の場合):
scoreは75です。if (score >= 90)(75 >= 90)はfalseです。- 次の
else if (score >= 70)(75 >= 70)はtrueです。 gradeに「良」が代入されます。- この時点で処理が実行されたため、以降の
else if (score >= 50)とelseは無視されます。 - B2セルに「良」と書き込まれます。
実行例2(A2セルが 95 の場合):
scoreは95です。- 最初の
if (score >= 90)(95 >= 90)がtrueです。 gradeに「優」が代入されます。- 以降の
else ifとelseはすべて無視されます。 - B2セルに「優」と書き込まれます。
実行例3(A2セルが 40 の場合):
scoreは40です。if (score >= 90)はfalseです。else if (score >= 70)はfalseです。else if (score >= 50)はfalseです。- どの条件にも当てはまらなかったため、最後の
elseが実行されます。 gradeに「不可」が代入されます。- B2セルに「不可」と書き込まれます。
else if を使うことで、このように複雑な条件分岐を上から順番に分かりやすく記述できます。
複数の条件を組み合わせる「論理和」と「論理積」
これまでは if (score >= 90) のように、1つの条件式で判定を行ってきました。 しかし、実際の自動化では「A、または B の場合」「A、かつ B の場合」のように、複数の条件を組み合わせて判定したいことがよくあります。
この「または」と「かつ」を実現するのが、論理演算子と呼ばれる || と && です。
「または」(論理和:||)
「論理和(ろんりわ)」は、||(縦棒2本)という記号を使い、「複数の条件のうち、少なくとも1つが成り立てば true」という意味になります。英語の「OR」に近いです。
if (条件A || 条件B)
上記の場合、条件Aが true であるか、または条件Bが true であれば、if 文の中の処理が実行されます。両方が false の場合にのみ、処理は実行されません。
GASでの具体例:特定のステータスなら処理をスキップ
スプレッドシートでタスク管理をしているとします。ステータス(B列)が「完了」または「保留」のタスクについては、リマインドメールを送る処理から除外したい、という例です。
// ステータスが「完了」または「保留」でないかチェック
function checkTaskStatus() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('タスクリスト');
// B2セルのステータスを取得
const status = sheet.getRange('B2').getValue(); // 例: '対応中'
// 条件分岐:もしステータスが '完了' または '保留' なら
if (status === '完了' || status === '保留') {
console.log('このタスクは処理対象外です(完了または保留)。');
} else {
console.log('このタスクは処理対象です。リマインド処理を実行します。');
}
}
実行結果の解説:
- B2が ‘完了’ の場合:
status === '完了'がtrueになるため、if内の処理が実行されます。 - B2が ‘保留’ の場合:
status === '保留'がtrueになるため、if内の処理が実行されます。 - B2が ‘対応中’ の場合:
status === '完了'もstatus === '保留'もfalseになるため、else内の処理が実行されます。
「かつ」(論理積:&&)
「論理積(ろんりせき)」は、&&(アンパサンド2個)という記号を使い、「複数の条件が、すべて成り立っていれば true」という意味になります。英語の「AND」に近いです。
if (条件A && 条件B)
上記の場合、条件Aと条件Bの両方が true である場合にのみ、if 文の中の処理が実行されます。どちらか一方でも false であれば、処理は実行されません。
GASでの具体例:特定の条件をすべて満たした場合に判定
スプレッドシートの「成績表」で、C列の「テスト点数」が80点以上 かつ D列の「出席率」が90%(0.9)以上の生徒にのみ、E列に「優秀賞」と書き込む例です。
// 成績と出席率で「優秀賞」を判定する
function checkAward() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('成績表');
// C2セルの点数を取得
const score = sheet.getRange('C2').getValue(); // 例: 85
// D2セルの出席率を取得(例: 0.95)
const attendanceRate = sheet.getRange('D2').getValue();
// 条件分岐:もし点数が80以上 かつ 出席率が0.9以上なら
if (score >= 80 && attendanceRate >= 0.9) {
// 両方の条件を満たした場合
sheet.getRange('E2').setValue('優秀賞');
console.log('優秀賞の対象です。');
} else {
// どちらか一方でも条件を満たさなかった場合
sheet.getRange('E2').setValue(''); // 空白にする
console.log('優秀賞の対象外です。');
}
}
実行結果の解説:
- C2が 85、D2が 0.95 の場合:
score >= 80はtrue、attendanceRate >= 0.9もtrueです。両方trueなので、E2セルに「優秀賞」と書き込まれます。 - C2が 90、D2が 0.85 の場合:
score >= 80はtrueですが、attendanceRate >= 0.9がfalseです。&&は両方がtrueである必要があるため、else内の処理が実行されます。
||(または)と &&(かつ)を使いこなすことで、GASで実行できる自動化のロジックが格段に複雑で、実用的なものになります。
switch文について
特定の値で処理を分ける switch 文
これまで学んだ if文や else if文は、「90点以上」や「0より大きい」といった「範囲」を指定した条件分岐が得意でした。
今回学ぶ switch文は、それとは少し異なり、1つの変数や式の結果が、「この値(A)と一致したらこの処理」「あの値(B)と一致したらこの処理」というように、特定の値と厳密に一致するかどうかで処理を分岐させるのが得意です 。
else if を何度も繰り返すよりも、コードがスッキリと読みやすくなる場合があります。
switch 文の基本的な書き方
switch文は、switch case break default というキーワードを組み合わせて使います。
switch (チェックしたい変数や式) {
case 値1:
// 変数が「値1」と厳密に一致(===)した場合の処理
break; // ← 重要!処理をここで終了し、switch文を抜ける
case 値2:
// 変数が「値2」と厳密に一致(===)した場合の処理
break;
// case は必要なだけ追加できる
default:
// 上記のどの case にも一致しなかった場合の処理
break;
}
switch (変数):( )の中に、判定の基準となる変数を入れます。case 値:: 変数の値がcaseの「値」と厳密に一致(===と同じ)するかをチェックします 。break;:caseの処理が終わったら、switch文全体を抜けるための命令です 。default:: どのcaseにも当てはまらなかった場合に実行される処理です 。if...else文の最後のelseに似ています。
GASでの具体例:タスクのステータスに応じてセルの色を変更
スプレッドシートのタスクリスト(A列)のステータス(B列)を読み取り、ステータスの値(例:「未着手」「対応中」「完了」)に応じて、タスク(A列)のセルの背景色を変更するスクリプトです。
実行前のスプレッドシート(シート名 ‘タスクリスト’): B2セルに「対応中」と入力されているとします。
// ステータスに応じてセルの色を変更する
function setStatusColor() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('タスクリスト');
// B2セルのステータス文字列を取得
const status = sheet.getRange('B2').getValue();
// A2セル(色を変更する対象のセル)を取得
const taskCell = sheet.getRange('A2');
console.log(`ステータス: ${status}`);
// switch文でステータス(文字列)によって処理を分岐
switch (status) {
case '完了':
// 完了ならグレー
taskCell.setBackground('#b7b7b7');
console.log('色をグレーに変更しました。');
break;
case '対応中':
// 対応中なら黄色
taskCell.setBackground('#f9e03e');
console.log('色を黄色に変更しました。');
break;
case '未着手':
// 未着手なら赤色
taskCell.setBackground('#e06666');
console.log('色を赤色に変更しました。');
break;
default:
// 上記の3つ以外(例:「保留」など)なら色をなし(白)に
taskCell.setBackground(null);
console.log('色は変更しません(デフォルトに戻します)。');
break;
}
}
実行結果(B2セルが「対応中」の場合):
statusには「対応中」が入ります。switch文はstatusの値(「対応中」)をチェックします。case '完了':は一致しないため、スキップされます。case '対応中':が一致(true)します。- A2セルの背景色が黄色に変更され、ログに「色を黄色に変更しました。」と表示されます。
break;が実行され、switch文が終了します。(case '未着手'やdefaultは実行されません)
break を忘れるとどうなる?
もし break; を書き忘れると、一致した case の処理を実行した後も switch文を抜けず、その下にある case や default の処理もすべて実行されてしまいます。これを「フォールスルー」と呼びます。
意図的に break を書かずに複数の処理を実行させる高等テクニックもありますが、基本的にはバグの原因になるため、case の終わりには必ず break; を書くと覚えてください。
if文(範囲指定)と switch文(特定の値)を使い分けることで、より読みやすく、意図した通りの分岐処理が書けるようになります。
まとめ:条件分岐をマスターしてGASを使いこなそう
今回は、Google Apps Script(GAS)で自動化を行う上で欠かせない「条件分岐」について学習しました。条件分岐とは、プログラムに「もし〜なら、こうする」という「判断」をさせるための重要な仕組みです。
基本となるのは if文です。( ) の中に「比較演算子」(=== や > など)を使って条件式を書き、その結果が true(正しい)か false(間違い)かによって処理の流れを変えます。
if文だけでなく、
else(条件が成り立たない場合の処理)else if(3つ以上の選択肢を作る処理)&&(かつ)や||(または)の論理演算子(複数の条件を組み合わせる処理)switch文(特定の値と厳密に一致するかで分ける処理)
これらを学ぶことで、単純な処理だけでなく、さまざまな状況に応じた複雑な処理をGASに任せられるようになります。
例えば、「もしA列の値が100以上で、かつB列が空白なら、C列に『要確認』と入力する」といった、実務に即した自動化が可能になります。
今回学んだ条件分岐は、あらゆるプログラミングの基礎となる考え方です。ぜひ何度もコードを書いて練習し、あなたの業務を賢く自動化するスクリプト作成に役立ててください。










