見出し画像

GAS学習note:Day4 for文×if文で実務ミニツールを作ろう

はじめに

前回(Day3)では if文の基礎と条件分岐の考え方 を学びました。
たとえば「点数が80点以上ならA、それ以外はB」というように、
1つのセルの条件を判定する練習を通して、if文の使い方を理解しました。

一方で、現場のスプレッドシートには数十行・数百行のデータが並んでいます。
1行ずつ手で判定するのは大変です。

そこでDay4では、for文とif文を組み合わせて、複数行を自動でチェックする“実務ツール”を作るステップに進みます。

💡 まとめると:

Day3は「条件を理解するための練習」、
Day4は「条件を実務データに適用するステップ」です。



実践1:在庫チェックを自動化

A列:商品名
B列:在庫数
C列:発注ステータス(チェックボックス:TRUE=発注済み)
D列:メモ

条件: 在庫が10以下 かつ 発注していない → 「⚠補充要」と表示&行を黄色にする

function stockAlert() {
  const sh = SpreadsheetApp.getActive().getActiveSheet();
  const last = sh.getLastRow();

  for (let r = 2; r <= last; r++) {
    const qty = Number(sh.getRange(r, 2).getValue());
    const ordered = sh.getRange(r, 3).getValue();

    if (qty <= 10 && ordered === false) {
      sh.getRange(r, 4).setValue("⚠補充要");
      sh.getRange(r, 1, 1, 4).setBackground("#fff2cc");
    } else {
      sh.getRange(r, 4).setValue("");
      sh.getRange(r, 1, 1, 4).setBackground(null);
    }
  }
}



実践2:期限チェックを自動化

F列:期限(日付)
G列:ステータス(チェックボックス:TRUE=済)
H列:メモ

条件: 今日より前 & ステータス未チェック → 「期限切れ」+行を赤背景

function dueAlert() {
  // 必要なら特定シート名に固定:const sh = SpreadsheetApp.getActive().getSheetByName('タスク一覧');
  const sh = SpreadsheetApp.getActive().getActiveSheet();
  const last = sh.getLastRow();

  // 今日(0:00)を基準にする
  const today = new Date();
  today.setHours(0, 0, 0, 0);
  const todayMs = today.getTime();

  for (let r = 2; r <= last; r++) {
    // --- F列:期限(日付)
    const rawDue = sh.getRange(r, 6).getValue(); // F列
    // 文字列でもDateでも受けられるように変換
    let due = (rawDue instanceof Date) ? new Date(rawDue) : new Date(String(rawDue));
    if (!(due instanceof Date) || isNaN(due)) {
      // 日付でなければリセットして次へ
      sh.getRange(r, 8).setValue('');
      sh.getRange(r, 6, 1, 3).setBackground(null);
      continue;
    }
    due.setHours(0, 0, 0, 0);
    const dueMs = due.getTime();

    // --- G列:ステータス(チェックボックスTRUE/FALSE or 文字)
    const rawStatus = sh.getRange(r, 7).getValue(); // G列
    // 完了判定:チェックボックスTRUE または 文字で「済」
    const isDone = (rawStatus === true) || (String(rawStatus).trim() === '済');
    // 未処理判定:チェックボックスFALSE、または空欄・空白
    const isTodo = (rawStatus === false) || (String(rawStatus).trim() === '');

    if (isTodo && dueMs < todayMs) {
      sh.getRange(r, 8).setValue('期限切れ');     // H列
      sh.getRange(r, 6, 1, 3).setBackground('#f4cccc'); // F〜H列を赤系
    } else {
      sh.getRange(r, 8).setValue('');             // H列クリア
      sh.getRange(r, 6, 1, 3).setBackground(null);
    }
  }
}

実践3:売上ランクを自動付与

J列:売上金額
K列:ランク

条件:

  • 100,000以上 → S

  • 50,000以上 → A

  • それ以下 → B

function rankSales() {
  const sh = SpreadsheetApp.getActive().getActiveSheet();
  const last = sh.getLastRow();

  for (let r = 2; r <= last; r++) {
    const sales = Number(sh.getRange(r, 10).getValue());
    if (isNaN(sales)) continue;

    if (sales >= 100000) {
      sh.getRange(r, 11).setValue("S");
    } else if (sales >= 50000) {
      sh.getRange(r, 11).setValue("A");
    } else {
      sh.getRange(r, 11).setValue("B");
    }
  }
}



よくあるつまずきポイント

  • 比較演算子の混同 → = は代入、条件比較は === を使う

  • チェックボックスの扱い → TRUE/FALSE は文字列ではなく論理値

  • 背景色が残る → else 節でリセットを忘れない

  • 日付比較のズレ → .setHours(0,0,0,0) で日付だけを比較


まとめ:Day4で学んだこと

Day3で学んだif文は「条件の仕組みを理解するための練習」でした。
Day4ではそれを発展させ、for文と組み合わせて シート全体を自動処理する“実務ツール”に進化させました。

💡 Day4のゴールは、「条件を実務データに適用できるようになること」。

具体的には次の3点です👇

  1. for×if の組み合わせで複数行を一括処理できるようになった

  2. 条件に応じて 文字表示・色付け・セル操作 ができるようになった

  3. 在庫・期限・売上など、日常業務を 自動でチェック・見える化 できるようになった

👉 ここまでできれば、あなたのGASスキルは“実務で使えるレベル”に入っています!
次回のDay5では、これらの処理を 関数化して再利用 できるように整理していきましょう。

いいなと思ったら応援しよう!

この記事が参加している募集