自動化システムの頭脳となる条件分岐の役割と重要性
これまでの章では、データの取得や書き込み、変数の扱い方といったプログラミングの基礎的な動作を学んできました。これらは言わば、手足となって動く部分の構築でした。本章で学ぶ「条件分岐」は、システムに「判断能力」を与える、まさに頭脳にあたる部分です。条件分岐とは、「もしAならばBをする、そうでなければCをする」という論理構造をプログラムに組み込むことです。Excel関数でもIF関数はおなじみですが、GASにおける条件分岐は、セルの値を変化させるだけでなく、メールを送る、ファイルを移動する、別のシートを作成するなど、アプリケーションの挙動そのものを劇的に変化させる力を持っています。
開発者としてシステムを構築する際、単に一直線に処理が進むだけのプログラムは稀です。現実の業務は、「売上が目標を達成していればチャットに通知を送るが、未達であれば上長にメールで報告する」「在庫数が10個以下になったら発注リストに追加する」「請求書のステータスが未払いの場合のみリマインドを送る」といった具合に、無数の「IF(もしも)」で構成されています。この条件分岐を適切に設計し、AIに実装させることで、あなたのプログラムは単なる自動操作ツールから、状況判断を行うインテリジェントなエージェントへと進化します。
本章では、JavaScriptにおけるif文の構造から、論理演算子を用いた複雑な条件設定、そしてAIに意図通りの分岐ロジックを書かせるための言語化テクニックまでを詳細に解説します。ExcelのIF関数とは似て非なる、プログラミング言語としての厳密な論理構造を理解し、業務フローをアルゴリズムとして落とし込むスキルを習得しましょう。
if文の基本構造とExcel関数との決定的な違い
GASにおいて条件分岐を記述する最も基本的な構文がif文です。Excelのセルに入力する =IF(論理式, 真の場合, 偽の場合) という関数と、GASの if (条件式) { 処理 } は、概念こそ同じですが、その構造と及ぼす影響範囲には大きな違いがあります。ExcelのIF関数は、基本的にそのセルの中に値を返すことしかできません。しかし、GASのif文は「制御構文」と呼ばれ、プログラムの流れそのものをコントロールします。条件が満たされた場合にのみ、特定のブロック(波括弧 { } で囲まれた範囲)の中に書かれたコードが実行されます。満たされない場合は、そのブロック内のコードは完全に無視され、スキップされます。この「処理を実行するか否か」を制御できる点が、プログラミングにおける条件分岐の強力な点です。
具体的な構文は以下のようになります。 if (条件式) { // 条件式が正しい(true)の時に実行される処理 } 例えば、変数 score の値が80以上の場合にログを出力したい場合は、if (score >= 80) { console.log("合格"); } と記述します。ここで重要なのは、条件式を囲む丸括弧 ( ) と、実行する処理を囲む波括弧 { } の存在です。開発者としては、この波括弧によるブロック構造を意識することが不可欠です。インデント(字下げ)を行うことで、どこからどこまでが「条件が満たされた時の処理」なのかを視覚的に明確にする習慣をつけましょう。AIにコードを書かせる際も、このブロック構造が正しく生成されているかを確認することで、意図しない動作(条件に関係なく常に実行されてしまうなど)を防ぐことができます。Excel脳からGAS脳への切り替えにおいて、この「値を返す」のではなく「処理の流れを制御する」という感覚をつかむことが、最初の重要なステップとなります。
比較演算子の種類と「厳密な等価性」の理解
条件分岐の核となるのは、「AとBは等しいか」「AはBより大きいか」といった比較を行う「比較演算子」です。GAS(JavaScript)で使用される比較演算子は、Excelの数式とは一部異なる記号を使用するため、正確に把握しておく必要があります。大小関係を表す >(大なり)、<(小なり)、>=(以上)、<=(以下)はExcelと同様ですが、注意が必要なのは「等しい」と「等しくない」の表現です。
プログラミングの世界では、=(イコール1つ)は「代入」を意味します。変数に値を入れる際に使用するため、比較には使えません。比較として「等しい」を表す場合は、===(イコール3つ)、または ==(イコール2つ)を使用します。現代の開発現場、そして本講座で推奨するのは、より厳密な ===(厳密等価演算子)です。なぜなら、== は「文字の”100″」と「数値の100」を「同じ」とみなす曖昧さを持っていますが、=== はデータ型まで含めて厳密に比較し、型が違う場合は「等しくない」と判定するからです。業務データにおいて、文字列と数値を混同することはバグの温床となります。AIも文脈によっては == を提案することがありますが、開発者としては堅牢性を高めるために === を使用するよう指示、あるいは修正する視点を持つべきです。
同様に、「等しくない」を表す場合は !==(厳密不等価演算子)を使用します。Excelでは <> を使いますが、GASでは ! が「否定(NOT)」を意味する記号として使われます。これらの演算子を組み合わせることで、「売上が100万以上(sales >= 1000000)」「担当者が佐藤さんである(inCharge === “佐藤”)」といった具体的な条件式を構築します。AIへのプロンプトでも、「等しい場合はイコール3つを使って」と明示することで、より品質の高いコードを得ることができます。
二者択一の処理を実現するelse文の活用
条件を満たした場合の処理だけでなく、「満たさなかった場合」の処理も記述したい場面は頻繁にあります。例えば、「在庫があれば出荷処理をする、なければ入荷待ちリストに追加する」といったケースです。これを実現するのが else 文です。else は単独では存在できず、必ず if 文の直後に記述されます。
構文は以下の通りです。 if (条件式) { // 条件がtrueの時の処理 } else { // 条件がfalseの時の処理 } この構造により、プログラムは必ずどちらか一方のルートを通ることになります。ExcelのIF関数の第3引数(偽の場合)に相当します。開発者として意識すべきは、この「二者択一」のロジックが、業務フローのあらゆる場面に適用できるということです。例えば、スプレッドシートのセル値を取得し、それが空欄か否かで処理を分ける(空欄ならスキップ、値があれば処理続行)といった「ガード節」と呼ばれるテクニックも、この if-else 構造の応用です。
AIにコード生成を依頼する際は、「条件に合致しない場合はどうするか」を明示的に伝えることが重要です。単に「100以上なら赤字にして」とだけ伝えると、AIは if ブロックのみを作成し、それ以外の場合に何もしないコードを書くかもしれません。しかし業務によっては「それ以外の場合は黒字に戻す」という処理が必要なこともあります。else ブロックの必要性を常に考慮し、条件から漏れたデータの扱いを決定しておくことが、予期せぬエラーやデータの不整合を防ぐ鍵となります。
複数の条件を網羅するelse if文による多段階分岐
現実は白か黒かの二択だけで割り切れるものばかりではありません。「点数が90点以上ならS評価、80点以上ならA評価、70点以上ならB評価、それ以外はC評価」のように、複数の条件を順次判定していく必要があります。これを実現するのが else if です。最初の if 条件が偽だった場合に、次の条件判定を行い、それも偽なら次へ…と連鎖させていくことができます。
構文は以下のようになります。 if (条件A) { // 条件Aがtrueの処理 } else if (条件B) { // 条件Aはfalseだが、条件Bはtrueの処理 } else { // AもBもfalseの時の処理 } ここで開発者が最も注意すべき点は「判定の順序」です。プログラムは上から順に条件を評価し、一度でも true になってブロック内に入ると、それ以降の else if や else はすべて無視されます。例えば、上記の評価システムで、誤って「70点以上ならB評価」を最初に書いてしまうと、90点のデータが来ても「70点以上」という条件を満たしてしまうため、本来S評価であるべきものがB評価として処理され、そこで分岐が終了してしまいます。
AIにこのような多段階分岐を作らせる場合、自然言語のプロンプトで条件を箇条書きにするだけでは、AIが順序を誤る可能性があります。「評価の高い順に判定してください」や「条件は排他的(重複しないよう)に扱ってください」といった指示を加えることで、ロジックの破綻を防げます。多段階分岐は非常に強力ですが、条件が増えるほどコードが複雑化するため、ロジックの整理整頓が開発者の腕の見せ所となります。
論理演算子による複合条件の構築:ANDとOR
ビジネスルールはしばしば複雑です。「売上が100万以上、かつ、利益率が20%以上」や「地域が東京、または、大阪」といった複合的な条件判定が必要になります。これらを記述するために使用するのが「論理演算子」です。GASでは、「かつ(AND)」を &&、「または(OR)」を || で表現します。
&&(論理積)は、左右の条件式が「両方とも」真である場合にのみ、全体として真となります。一方、||(論理和)は、左右の条件式の「どちらか一方でも」真であれば、全体として真となります。Excel関数の AND() や OR() と同じ概念ですが、GASでは条件式の中に記号として埋め込む形になります。 例: if (sales >= 1000000 && profitRate >= 0.2) { ... }
開発者として理解しておくべき重要な挙動に「短絡評価(ショートサーキット)」があります。例えば A && B の場合、もしAが偽であれば、その時点で全体が偽確定となるため、プログラムはBの判定を行わずにスキップします。これを利用して、「データが存在するか確認し(A)、存在する場合のみそのデータの中身をチェックする(B)」といった安全なコードを書くことができます。AIに対して複雑な条件を伝える際は、「AかつBの場合」や「AまたはBの場合」と明確に言語化することで、AIは適切な論理演算子を選択してくれます。複雑な業務ロジックを正確にコードに翻訳するためには、この論理演算子の使いこなしが不可欠です。
真偽値(Boolean)とTruthy/Falsyな値の概念
条件分岐において、コンピュータは最終的にすべての条件を true(真)か false(偽)のどちらかに変換して判断します。この true と false という2つの値だけを持つデータ型を「真偽値(Boolean型)」と呼びます。比較演算子 sales >= 1000 の結果は、数値ではなく true または false という真偽値になります。
さらにJavaScript(GAS)には特有の概念として、「Truthy(真のような値)」と「Falsy(偽のような値)」があります。これは、厳密な true/false ではなくても、if文の中に入れると true 扱い、あるいは false 扱いされる値のことです。具体的には、数値の 0、空文字 ""、null、undefined などは「Falsy」な値として扱われ、false と同等に見なされます。それ以外の値(数値の1以上や、文字が入った文字列など)は「Truthy」として true 扱いされます。
この性質を利用すると、if (userName) と書くだけで、「変数 userName に何らかの名前が入っていれば(空文字やnullでなければ)処理をする」という判定が可能になります。これはコードを簡潔にする便利な機能ですが、意図せず 0 を有効な値として扱いたい場合などにバグの原因になることもあります(0 はFalsyなので条件を満たさないと判定されてしまう)。開発者としては、AIが書いたコードがこの「曖昧な判定」を使っているか、「厳密な比較(userName !== "")」を使っているかをチェックし、業務要件に合わせて適切にコントロールする視点が必要です。
業務シナリオ実践1:数値による赤字・黒字の自動書式設定
それでは、ここまでの知識を統合して、具体的な業務自動化のシナリオをAIに実装させてみましょう。一つ目のシナリオは「スプレッドシートの売上管理表において、利益がマイナス(0未満)の行の文字色を赤にし、さらに『要確認』というステータスを書き込む」というものです。これは if 文による単純な条件分岐と、セルの書式変更メソッド setFontColor を組み合わせることで実現できます。
AIへのプロンプト例: 「現在開いているシートのC列に利益が入力されています。2行目から最終行まで順番にチェックし、もし利益が0未満(マイナス)の場合は、その行のA列からC列までの文字色を赤に変更し、D列に『要確認』と入力するGASコードを作成してください。それ以外(0以上)の場合は、文字色を黒にし、D列は空欄にしてください。」
この指示により、AIは for 文によるループ処理の中に if (profit < 0) という条件分岐を組み込み、条件合致時には range.setFontColor("red") と range.setValue("要確認") を実行し、else ブロックで正常時の処理を行うコードを生成します。このように、条件によって見た目やデータを動的に変化させる処理は、GASによる業務効率化の最も基本的かつ効果的な活用法の一つです。条件付き書式でも似たことはできますが、GASを使えば「同時にチャット通知を送る」などの複合的なアクションへ拡張できる点が大きな強みです。
業務シナリオ実践2:ステータスに応じた承認メールの自動送信
二つ目のシナリオは、より高度な「承認フローの自動化」です。「スプレッドシート上の申請リストにおいて、ステータス列が『承認』に変更された場合、申請者に対して自動的に承認完了メールを送信する」というシステムを構築します。ここでは comparison(比較)と論理的な判断が重要になります。
AIへのプロンプト例: 「シートのE列がステータス、F列が申請者のメールアドレスです。ステータスが『承認』かつ、G列の『メール送信済フラグ』が空欄の場合に、そのメールアドレス宛に件名『申請承認のお知らせ』でメールを送信する関数を作成してください。メール送信後、G列に『済』と入力して、二重送信を防いでください。」
このプロンプトには、if (status === "承認" && mailSent === "") というAND条件が含まれています。これにより、「承認された瞬間」かつ「まだメールを送っていない」という特定のタイミングを捕捉します。このロジックは、条件分岐と論理演算子の真骨頂です。もし条件分岐がなければ、承認済みの案件に何度もメールを送り続けてしまうでしょう。AIに対して「二重送信を防ぐための条件」を自然言語で伝えることで、AIは適切な論理演算子を用いたコードを生成します。このように、条件分岐はシステムの「振る舞い」や「ルール」そのものを定義する重要な役割を担っています。
AIへの指示出し:論理構造を正確に伝えるプロンプトエンジニアリング
最後に、複雑な条件分岐をAIに正確にコード化させるためのコツを解説します。AIは優秀ですが、曖昧な指示は曖昧なコード(バグの元)を生みます。開発者として行うべきは、業務のロジックを「もし〜なら〜、そうでなくもし〜なら〜」という明確な構造に分解し、それをプロンプトに落とし込むことです。
推奨されるのは「決定木」や「箇条書き」を用いた指示です。 例: 「以下の条件に従って処理を分岐させてください。
1. 在庫数が10未満の場合:
◦ ステータスを『発注勧告』にする
◦ 背景色を黄色にする
2. 在庫数が0の場合:
◦ ステータスを『在庫切れ』にする
◦ 背景色を赤にする
◦ 在庫管理者にメールを送る
3. それ以外の場合:
◦ ステータスを『在庫あり』にする
◦ 背景色を白に戻す」
このように条件とアクションをセットにして構造的に記述することで、AIは迷うことなく if - else if - else の構造を生成できます。また、「優先順位」がある場合は、「在庫0の条件を最優先で判定してください」と注釈を加えることで、判定順序によるバグも防げます。プログラミングの文法を覚える代わりに、この「ロジックを整理して言語化する力」こそが、AI時代の開発者に求められる最も重要なスキルです。条件分岐を制する者は、自動化を制します。次章では、この条件分岐を大量のデータに対して適用するための「繰り返し処理」について学んでいきましょう。
-scaled.jpg)