1第1回の振り返りと今回のテーマ
第1回では、GASをスクリプトエディタで動かし、Logger.log() で文字を出力したり、
setValue() でセルに値を書き込んだりしました。さらに、税込価格のような計算結果をセルに反映させ、
最後は ChatGPT にコードを書かせる体験までを行いました。
前回までにできるようになったこと
コードを実行する
スクリプトエディタで関数を作り、▷ボタンで実行できる。実行ログで結果を確認できる。
セルに書き込む
getRange() でセルを指定し、setValue() で値を書き込める。
計算する
変数に値を入れ、四則演算で計算した結果をセルに反映できる。
今回のテーマ ── 「市場リサーチレポートの自動判定」
ここまでは「決めた通りに必ず同じ処理をする」プログラムでした。しかし実務では、 「データの中身によって、やることを変えたい」場面がほとんどです。
- 成長率が高い市場は「重点投資」、低い市場は「撤退検討」と振り分けたい
- アンケートの満足度が一定スコア未満の回答だけ「要フォロー」とフラグを立てたい
- 売上が目標を超えた営業所だけ「達成」と色をつけたい
こうした「もし〜なら、〜する」という判断こそが 条件分岐(if文) です。 今回は、JMAR のリサーチ業務をイメージしやすいように、産業マーケティングリサーチレポートを題材にします。 最終的に、市場セグメントのデータを読み取り、有望度を自動でランク分けするプログラムを完成させます。
今回のゴールイメージ。「協働ロボット市場:規模850億円・成長率14%・自社シェア12%」というデータをシートに入れて実行すると、プログラムが自動で「問題児(育成)」と判定し、推奨アクションまで書き込んでくれる——そんな仕組みを、自分の手で作れるようになります。
2データ型を正しく理解する
条件分岐を正しく書くには、「データには種類(型)がある」ことを理解しておく必要があります。 たとえば「14」という数値と「"14"」という文字列は、見た目は同じでもコンピュータにとっては別物です。 ここを曖昧にすると、条件分岐が思った通りに動かない原因になります。
本研修でまず押さえる3つの型
| データ型 | 意味 | リサーチ業務での例 |
|---|---|---|
| 文字列(String) | 文字の集まり。" または ' で囲む |
製品セグメント名「協働ロボット」、判定ラベル「花形」 |
| 数値(Number) | 計算できる数。囲まない | 市場規模 850、成長率 14、シェア 12 |
| 真偽値(Boolean) | true / false の2値のみ |
「成長市場かどうか」「目標達成したか」 |
型を確かめる ── typeof
変数に入っている値が「どの型か」は、typeof で確認できます。実際に動かして、型の違いを体感してみましょう。
function checkTypes() {
const segment = "協働ロボット"; // 文字列
const growth = 14; // 数値
const isHot = true; // 真偽値
Logger.log(typeof segment); // → string
Logger.log(typeof growth); // → number
Logger.log(typeof isHot); // → boolean
}
「14」と「"14"」は別物です。数値の 14 は計算できますが、文字列の "14" は計算できません。スプレッドシートから読み取った値が文字列になっていると、growth >= 10 の比較が意図せず失敗することがあります。この落とし穴は第13章(つまずきポイント)で詳しく扱います。
3変数の宣言と再代入(const / let)
第1回でも触れましたが、変数は値を入れておく「名前付きの箱」です。
GASでは const と let の2種類で変数を宣言します。条件分岐では、
「判定結果をあとから入れ直す」場面が出てくるため、この2つの違いがとても重要になります。
| 宣言 | 性質 | 使いどころ |
|---|---|---|
const |
一度入れたら変更しない(再代入不可) | 消費税率、しきい値など、途中で変わらない値 |
let |
あとから入れ直せる(再代入可) | 条件によって中身が変わる「判定結果」など |
function constLetDemo() {
const threshold = 10; // しきい値:成長率10%(変えない)
let judge = "未判定"; // 判定結果:あとで入れ直す
judge = "成長市場"; // ← let なので再代入できる
Logger.log(threshold); // → 10
Logger.log(judge); // → 成長市場
}
迷ったら、まず const から。「あとで入れ直す必要がある」と分かったときだけ let に変えるのが、エラーの少ない書き方です。条件分岐で「判定結果」を入れる変数は、中身が枝分かれするので let を使います。
4セルの値を「読み取る」
第1回では setValue() でセルに値を書き込みました。
今回はその逆、セルから値を読み取る getValue() を使います。
リサーチデータを判定するには、まず「シートに入っている数字を読む」必要があるからです。
getValue() で読み取り → プログラムで判定 → setValue() で書き戻すfunction readGrowth() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// B3セルの値を読み取って、変数 growth に入れる
const growth = sheet.getRange("B3").getValue();
Logger.log("読み取った成長率: " + growth);
}
getValue()(書き込みの setValue() と1文字違い)。「get=取ってくる」「set=セットする」と覚えると混乱しません。この「読み取る → 判定する → 書き戻す」が、今回作るプログラムの背骨になります。
5比較演算子 ── 条件をつくる部品
条件分岐の「条件」は、比較演算子でつくります。たとえば「成長率が10以上か?」は
growth >= 10 と書きます。比較の結果は、第2章で学んだ 真偽値(true / false) になります。
function compareDemo() {
const growth = 14;
const share = 12;
Logger.log(growth >= 10); // → true (14は10以上)
Logger.log(share >= 20); // → false(12は20未満)
}
「等しい」は ==(イコール2つ)。イコール1つの = は「代入(箱に入れる)」、イコール2つの == は「等しいかの比較」です。条件分岐で if (rank = "花形") と書くのは典型的な間違い。正しくは if (rank == "花形") です。
6if文 ── 処理を分岐させる
いよいよ条件分岐の本体、if文です。「もし(条件)が true なら、{ } の中を実行する」という構文です。
条件が false のときは、{ } の中身はまるごとスキップされます。
{ } の中を実行するfunction judgeGrowth() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const growth = sheet.getRange("B3").getValue();
// もし成長率が10以上なら、B6に「成長市場」と書く
if (growth >= 10) {
sheet.getRange("B6").setValue("成長市場");
}
}
このコードは、B3が 14 なら B6 に「成長市場」と書き込みます。
しかし B3が 5 だったら——条件が false なので、B6には何も書かれません。
「条件を満たさなかったときも、ちゃんと何か書いてほしい」——そこで次の else が登場します。
if文の形をしっかり覚えましょう。if のあとに ( 条件 ) を丸かっこで、実行したい処理を { 波かっこ } で囲みます。この「丸かっこ」と「波かっこ」のセットが、条件分岐の基本形です。
7if / else ── 二択に分ける
else(エルス)を加えると、「条件が true ならA、そうでなければB」という二択の分岐になります。
リサーチでいえば「成長市場か、成熟市場か」をきれいに振り分けられます。
function judgeGrowth2() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const growth = sheet.getRange("B3").getValue();
let result; // 判定結果を入れる箱(あとで入れ直すので let)
if (growth >= 10) {
result = "成長市場"; // 条件が true のとき
} else {
result = "成熟市場"; // それ以外(false)のとき
}
sheet.getRange("B6").setValue(result);
Logger.log("判定: " + result);
}
ここでのポイントは、判定結果を一度 result という変数に入れてから、最後にまとめて書き込んでいること。
こうすると、条件が増えても「書き込む処理」は1か所で済むので、コードがすっきりします。
「判定(if/else)」と「書き込み(setValue)」を分けるのがコツ。分岐の中では result に値を入れるだけにして、シートへの反映は分岐の外で1回だけ行う。この型を覚えると、このあとの3分岐・4分岐でも迷いません。
8else if ── 3つ以上に枝分かれ
二択では足りないことも多いものです。たとえば市場規模を「大規模/中規模/小規模」の3つに分けたい——
そんなときは else if を使います。上から順に条件を判定し、最初に true になったところだけ実行します。
else if は「上から順に判定し、最初に当てはまった1つだけ」を実行するfunction judgeSize() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const size = sheet.getRange("B2").getValue(); // 市場規模(億円)
let category;
if (size >= 1000) {
category = "大規模市場";
} else if (size >= 300) {
category = "中規模市場";
} else {
category = "小規模市場(ニッチ)";
}
sheet.getRange("B8").setValue(category);
}
条件の順番に注意。else if は「上から順」に判定されます。もし size >= 300 を先に書いてしまうと、1500のような大きい値も「中規模」と判定されてしまいます(300以上は当てはまるため)。厳しい条件(大きい値)から先に書くのが鉄則です。
9論理演算子 ── 複数条件を組み合わせる
実務の判断は、たいてい「条件が2つ以上」あります。 「成長率が高く、かつシェアも高い市場」のように、複数の条件を組み合わせるのが 論理演算子です。
| 記号 | 読み方 | 意味 | 例 |
|---|---|---|---|
&& |
かつ(AND) | 両方とも true なら true | growth >= 10 && share >= 20 |
|| |
または(OR) | どちらか一方でも true なら true | size >= 1000 || share >= 30 |
! |
でない(NOT) | true と false を反転する | !isLaunched |
function judgeStar() {
const growth = 14;
const share = 25;
let result;
// 成長率10%以上「かつ」シェア20%以上 なら「花形」
if (growth >= 10 && share >= 20) {
result = "花形(重点投資)";
} else {
result = "花形ではない";
}
Logger.log(result); // → 花形(重点投資)
}
「&&(かつ)」は両方そろって初めて true。上の例では、成長率14%(10以上 ✓)と シェア25%(20以上 ✓)の両方を満たすので「花形」。もしシェアが12%なら、片方が false になるので「花形ではない」になります。次章では、この組み合わせを使って 4つのランクに自動振り分けします。
10統合実践:市場セグメント自動評価プログラム
ここまで学んだ「変数・データ型・getValue・比較演算子・if / else if / else・論理演算子」を全部つなげて、 少し複雑な、実務レベルのGASを1本組み上げます。 題材は、産業マーケティングリサーチの定番フレームワーク PPM(プロダクト・ポートフォリオ・マネジメント)です。
PPMマトリクスとは
PPMは、「市場成長率」と「自社シェア」の2軸で、各製品・事業を4つのタイプに分類する考え方です。 リサーチレポートでは、各市場セグメントがどの象限に入るかを示し、投資判断の材料にします。
判定ロジックの早見表
| 条件(成長率・シェア) | ランク | 推奨アクション |
|---|---|---|
| 成長率 >= 10 かつ シェア >= 20 | 花形 | 重点投資 ── シェアを保ち成長に乗る |
| 成長率 >= 10 かつ シェア < 20 | 問題児 | 育成 ── シェア拡大を狙うか見極める |
| 成長率 < 10 かつ シェア >= 20 | 金のなる木 | 維持・収穫 ── 利益を他事業の原資に |
| 成長率 < 10 かつ シェア < 20 | 負け犬 | 撤退検討 ── 資源の再配分を検討 |
完成版コード
以下が、今回のメインとなる「少し複雑なGAS」です。
① 値を読み取り → ② if / else if と && でランク判定 → ③ 市場規模も別途判定 → ④ 結果を書き込み → ⑤ ランクに応じてセルの色を変える、という流れになっています。
一見長く見えますが、これまで1つずつ学んだ部品の組み合わせです。
function evaluateSegment() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// ===== ① 入力値を読み取る(B列) =====
const segment = sheet.getRange("B1").getValue(); // 製品セグメント名
const size = sheet.getRange("B2").getValue(); // 市場規模(億円)
const growth = sheet.getRange("B3").getValue(); // 年成長率(%)
const share = sheet.getRange("B4").getValue(); // 自社シェア(%)
// ===== ② しきい値を定数で宣言(変えやすくする) =====
const GROWTH_LINE = 10; // 成長率の境目:10%
const SHARE_LINE = 20; // シェアの境目:20%
// ===== ③ PPMランクを判定する =====
let rank; // 判定結果(花形/問題児/金のなる木/負け犬)
let action; // 推奨アクション
if (growth >= GROWTH_LINE && share >= SHARE_LINE) {
rank = "花形";
action = "重点投資 ── シェアを維持しながら市場成長に乗る";
} else if (growth >= GROWTH_LINE && share < SHARE_LINE) {
rank = "問題児";
action = "育成 ── 投資してシェア拡大を狙うか見極める";
} else if (growth < GROWTH_LINE && share >= SHARE_LINE) {
rank = "金のなる木";
action = "維持・収穫 ── 利益を確保し他事業の原資にする";
} else {
rank = "負け犬";
action = "撤退検討 ── 資源の再配分を検討する";
}
// ===== ④ 市場規模の区分を判定する =====
let sizeLabel;
if (size >= 1000) {
sizeLabel = "大規模市場";
} else if (size >= 300) {
sizeLabel = "中規模市場";
} else {
sizeLabel = "小規模市場(ニッチ)";
}
// ===== ⑤ 結果をシートに書き込む =====
sheet.getRange("B6").setValue(rank);
sheet.getRange("B7").setValue(action);
sheet.getRange("B8").setValue(sizeLabel);
// ===== ⑥ ランクに応じてセルの背景色を変える =====
const cell = sheet.getRange("B6");
if (rank == "花形") {
cell.setBackground("#fde68a"); // 黄色
} else if (rank == "問題児") {
cell.setBackground("#bfdbfe"); // 青
} else if (rank == "金のなる木") {
cell.setBackground("#bbf7d0"); // 緑
} else {
cell.setBackground("#fecaca"); // 赤
}
Logger.log(segment + " の判定: " + rank + "(" + sizeLabel + ")");
}
このコードには、今日学んだ要素がすべて詰まっています。定数(const)、再代入する変数(let)、値の読み取り(getValue)、比較演算子(>= < ==)、論理演算子(&&)、多分岐(if / else if / else)。次の章で、実際にデータを書き換えながら動きを確かめます。
11ハンズオン演習:条件分岐を試す
いよいよ実践です。スプレッドシートのデータを実際に書き換えて、条件分岐が正しく動くことを自分の目で確認しましょう。 「数字を変える → 実行する → 判定が変わる」を体感するのが、条件分岐を腹落ちさせる一番の近道です。
STEP 1 ── 入力シートを準備する
新しいスプレッドシートを開き(sheets.new)、次のようにA列・B列を入力してください。B6〜B8は空のままで構いません(プログラムが自動で埋めます)。
STEP 2 ── メインコードを貼り付けて実行する
- 「拡張機能」→「Apps Script」でスクリプトエディタを開く
- 第10章の ⑨【メイン】市場セグメント自動評価 のコードを丸ごと貼り付ける
- 💾 保存し、関数名選択を
evaluateSegmentにして ▷ 実行 - シートに戻り、B6に「問題児」、B7に推奨アクション、B8に「中規模市場」が入り、B6が青色になっていれば成功!
初期データ(成長率14・シェア12)は「成長率は高いがシェアは低い」状態なので、判定は 問題児 になります。図5のマトリクスと照らし合わせて、なぜそうなるか確認してみましょう。
STEP 3 ── データを書き換えて、判定が変わることを確かめる
ここが今回の一番大事な演習です。B2〜B4の数字を次の表のとおり書き換えて、その都度 evaluateSegment を再実行してください。
B6の判定とセルの色が、表の「期待される判定」と一致するかを1件ずつ確認しましょう。
| No. | 製品セグメント(B1) | 規模 B2 | 成長率 B3 | シェア B4 | 期待される判定(B6) | 色 |
|---|---|---|---|---|---|---|
| 1 | 協働ロボット | 850 | 14 | 12 | 問題児 | 青 |
| 2 | 産業用センサー | 1200 | 6 | 35 | 金のなる木 | 緑 |
| 3 | AI画像検査装置 | 500 | 18 | 25 | 花形 | 黄 |
| 4 | 従来型FAXシステム | 200 | 3 | 8 | 負け犬 | 赤 |
| 5 | 境界テスト | 300 | 10 | 20 | 花形 | 黄 |
No.5は「ちょうど境目」のテストです。成長率10・シェア20は、コードでは >=(以上)で判定しているので、どちらも「以上」に当てはまり「花形」になります。もし「花形」にならなかったら、コードの比較演算子が >(より大きい)になっていないか確認してみましょう。境界値の挙動は、条件分岐で最も間違いやすいポイントです。
STEP 4 ── しきい値を変えて、判定基準そのものを動かす
最後に、コードの しきい値(境目)を変える 実験をします。第10章のコードの次の行を探してください。
const GROWTH_LINE = 10; // ← これを 15 に変えてみる
const SHARE_LINE = 20; // ← これを 10 に変えてみる
GROWTH_LINE を 15 に、SHARE_LINE を 10 に書き換えて、もう一度 No.1(成長率14・シェア12)を実行してみてください。
先ほどは「問題児」だった協働ロボットが、今度は 「金のなる木」 に変わります
(成長率14 < 15 で「低成長」、シェア12 >= 10 で「高シェア」と判定されるため)。
これが条件分岐の威力です。「判断の基準(しきい値)」を1か所変えるだけで、何百件のデータでも一斉に判定をやり直せます。リサーチレポートで「成長市場の定義を10%から15%に見直す」といった作業が、コード1行で完了するわけです。実験が終わったら、しきい値は元の 10 と 20 に戻しておきましょう。
12AIに「条件分岐入りGAS」を書かせる
第1回で学んだ通り、2026年のスタイルは「自分で書く」と「AIに書かせる」の並走です。 条件分岐のようにロジックが複雑になるほど、AIの力が効いてきます。ただし、条件分岐は 「境界値」や「条件の順番」でAIも間違えやすいので、出力をそのまま信じず必ず検証することが大切です。
条件分岐をAIに頼むときの「型」
条件分岐を依頼するときは、「判定の表」を言葉で渡すのがコツです。 第10章の「判定ロジックの早見表」のように、条件と結果を箇条書きで明示すると、AIは正確なコードを返しやすくなります。
動作確認のチェックポイント:① 関数名が judgePpm か/② しきい値が const で宣言されているか/③ >= で「以上」を表現できているか(> になっていないか)/④ 第11章の5つのテストケースで、すべて期待通りの判定になるか。とくに No.5の境界値(10・20) は必ず確認しましょう。
うまく動かなかった時のデバッグ依頼
AIの出したコードがエラーになったり、判定がおかしいときは、「どんな入力で、何を期待し、実際どうなったか」をセットで伝えると、修正が速くなります。
AIは「条件の順番」や「境界値」をよく間違えます。たとえば else if の順番を逆にして、大きい値が手前の条件に吸い込まれてしまう、といったミスです。必ず自分のテストケース(第11章の表)で全パターン検証してください。AIに任せきりにせず、「判定表」という形で正解を自分が持っておくことが、品質を守る最大のポイントです。
13つまずきポイントと対処
条件分岐は、初学者が最初に「思った通りに動かない」を経験する場所です。代表的な3つのつまずきを、先回りして押さえておきましょう。
① = と == を取り違える
「等しいか比較したい」のに、代入の = を書いてしまうミスです。条件の中で値を比較するときは、必ず == を使います。
// ✗ 間違い:= は「代入」なので、条件として正しく働かない
if (rank = "花形") { ... }
// ✓ 正しい:== は「等しいか」の比較
if (rank == "花形") { ... }
② セルの値が「文字列」になっていて比較に失敗する
スプレッドシートのセルに 14 ではなく、先頭にスペースが入った " 14" や、文字列として入力された数字が入っていると、
growth >= 10 が思った通りに動かないことがあります。心配なときは、読み取った直後に 数値へ変換しておくと安全です。
// Number(...) で、確実に数値に変換してから比較する
const growth = Number(sheet.getRange("B3").getValue());
③ else if の順番で取りこぼす
第8章でも触れた通り、else if は「上から順」です。範囲で判定するときは
厳しい条件(大きい値)から先に書きます。下の例では、順番を逆にすると 1500 も「中規模」と判定されてしまいます。
| 書き方 | 結果(size = 1500 のとき) | |
|---|---|---|
| ✓ 正 | if (size >= 1000) ... else if (size >= 300) ... | 「大規模市場」(正しい) |
| ✗ 誤 | if (size >= 300) ... else if (size >= 1000) ... | 「中規模市場」(取りこぼし) |
困ったら「Logger.log で途中の値を見る」。判定がおかしいときは、Logger.log(growth) や Logger.log(typeof growth) を入れて、実際にどんな値・型が入っているかを確かめるのがデバッグの第一歩です。これは第3回以降でも繰り返し使う、最も基本的な調査テクニックです。
第2回の宿題
メインプログラムを動かし、5つのテストケースを検証する
第11章の手順で演習用シートを作り、⑨【メイン】市場セグメント自動評価 を実行してください。第11章STEP3の5つのテストケースすべてで、判定(B6)と色が「期待される判定」と一致することを確認しましょう。1件でも食い違ったら、コードのどこが原因かを考えてみてください。
しきい値を変えて、判定がどう変わるか観察する
第11章STEP4のとおり、GROWTH_LINE と SHARE_LINE の値を変えて再実行し、同じデータでも判定が変わることを確認してください。「成長市場の定義を厳しくすると、花形が減る」といった変化を、自分の言葉で1〜2行メモしておきましょう。
ChatGPTに条件分岐入りのGASを生成させる
第12章の 「条件分岐の生成」プロンプト(judgePpm) を ChatGPT に貼り付け、出力されたコードをスクリプトエディタで実行してください。第11章の5つのテストケースで全パターン検証し、とくに境界値(成長率10・シェア20)が「花形」になるかを必ず確認します。間違っていたら、デバッグ依頼プロンプトで修正してもらいましょう。
自分の業務に近い「判定プログラム」をAIと作る
自分の業務に近いテーマで、条件分岐を使った判定プログラムを ChatGPT と一緒に作ってみてください。例:アンケート満足度(5段階)を「高評価/普通/要フォロー」に振り分ける/問い合わせ件数で営業所を「繁忙/通常/閑散」に分類するなど。「判定の表」を自分で先に書いてからAIに渡すのがコツです。次回の冒頭で、3名ほどに「どんな判定を作ったか」を共有してもらいます。
提出方法:宿題④で作成したスプレッドシートのURL、ChatGPTに送ったプロンプト、最終的に動いたGASコード、そして「判定の表」の4点を、研修事務局へメールでご提出ください。提出期限:次回研修の前日17:00まで。