見出し画像

GAS学習note:Day5 関数化・再利用でコードを整える〜ChatGPTと一緒に“育てるGAS”をつくる〜

はじめに

前回(Day4)では、for文とif文を組み合わせて、在庫チェックや期限管理などの自動化ツールを作りました。

今回は、そのコードをさらに使いやすく整理していくステップです。
テーマは――

関数化と再利用、そしてChatGPTとの連携。

「1つの処理を別のシートでも使いたい」
「似たようなコードを毎回コピペするのが大変」
そんな悩みを解決するのが「関数化」。

そして、生成AIを使えば、エラー修正や改善も一緒に進められるんです。

💡 Day3 → 条件を理解する練習
💡 Day4 → 条件を実務データに適用するステップ
💡 Day5 → それを“関数”として整理し、再利用可能にする段階



1️⃣ 関数化とは?

関数化とは、処理のまとまりに名前をつけて再利用できるようにすること。

たとえば、Day4で作った在庫チェック処理を関数にすると、こんな風に整理できます👇

// 在庫アラートを汎用関数に
function checkStock(row, qtyCol, orderedCol, noteCol) {
  const sh = SpreadsheetApp.getActive().getActiveSheet();
  const qty = Number(sh.getRange(row, qtyCol).getValue());
  const ordered = sh.getRange(row, orderedCol).getValue();

  if (qty <= 10 && ordered === false) {
    sh.getRange(row, noteCol).setValue('⚠補充要');
    sh.getRange(row, qtyCol, 1, 3).setBackground('#fff2cc');
  } else {
    sh.getRange(row, noteCol).setValue('');
    sh.getRange(row, qtyCol, 1, 3).setBackground(null);
  }
}

呼び出し側のメイン処理はシンプルに!

function stockAlert() {
  const sh = SpreadsheetApp.getActive().getActiveSheet();
  const last = sh.getLastRow();
  for (let r = 2; r <= last; r++) {
    checkStock(r, 2, 3, 4); // 行番号, 在庫列, 発注列, メモ列
  }
}

💡 列構成が変わっても、引数を変えるだけで再利用可能
似たロジックを何度も書かずに済みます。


2️⃣ 共通処理を小さく分ける

日付処理や型チェックなど、複数のコードで使う部分は共通関数にしておくと便利です。

// 日付の時刻を0時に統一する共通関数
function normalizeDate(date) {
  if (!(date instanceof Date)) return null;
  const d = new Date(date);
  d.setHours(0, 0, 0, 0);
  return d;
}

この小さな関数を入れるだけで、Day4で作った期限チェックがスッキリ👇

function dueAlert() {
  const sh = SpreadsheetApp.getActive().getActiveSheet();
  const last = sh.getLastRow();
  const today = normalizeDate(new Date());

  for (let r = 2; r <= last; r++) {
    const due = normalizeDate(sh.getRange(r, 6).getValue());
    const status = sh.getRange(r, 7).getValue();

    if (!due) continue;
    if (due < today && status === false) {
      sh.getRange(r, 8).setValue("期限切れ");
      sh.getRange(r, 6, 1, 3).setBackground("#f4cccc");
    } else {
      sh.getRange(r, 8).setValue("");
      sh.getRange(r, 6, 1, 3).setBackground(null);
    }
  }
}

3️⃣ ChatGPTと一緒にデバッグしてみよう

GASを触っていると、必ず出会うのが 「TypeError」や「Range not found」などのエラー
そんなときこそ、ChatGPTの出番です💡


💬 実際のやり取り

📘 あなた(質問)

実行したら「TypeError: Cannot read properties of null」と出ました。
どこを直せばいいですか?

🤖 ChatGPT(回答)

このエラーは「指定したシートやセル範囲が見つからない」時に出ます。
getActiveSheet() が空を返している可能性があります。
確実に対象シートを指定してみましょう。

const sh = SpreadsheetApp.getActive().getSheetByName("在庫管理");

📘 あなた

修正したら動きました!
でも、背景色が残ったままになります。

🤖 ChatGPT

条件に合わない場合に色をリセットしていないのが原因です。
else 節で setBackground(null) を入れましょう!

else {
  sh.getRange(r, 8).setValue("");
  sh.getRange(r, 6, 1, 3).setBackground(null);
}

📘 あなた

なるほど! else で元に戻すんですね。


🔍 コツ

  • エラーメッセージはそのまま貼る!

  • コード全体と一緒に送ると原因特定が早い。

  • 修正後は「どこがどう変わったか」も一緒に質問すると理解が深まる。

生成AIを使うと、ただ「直す」だけでなく、“なぜ動かないのか”を一緒に学べるのが最大のメリットです。


4️⃣ AIと一緒にGASを“育てる”という考え方

生成AIは「答えを出すツール」ではなく、一緒にコードを育てるパートナー

  • 書いたコードをレビューしてもらう

  • エラーを一緒に直す

  • コメント付きでリファクタリング(整理)してもらう

そうして少しずつ「読みやすい・動かしやすい」コードに育っていく。
この流れがまさに “AI時代の学び方” です。


まとめ:Day5で身につけたこと

Day5では、これまで学んだGASコードを
整理・再利用・改善できる形 にステップアップしました。

学びの3ポイント

  1. 関数化で処理をモジュール化し、別の場所でも使えるようになった。

  2. 共通関数を作ることで、コードの重複を減らして管理しやすくなった。

  3. ChatGPTを活用して、エラー修正や改善のスピードが大幅アップ。

💡 GAS × 生成AI = “1人で悩まない開発”
コードを「書く」から「育てる」フェーズへ。


次回予告(Day6)

Day6では、ついに トリガー設定(自動実行) に挑戦します。
「毎朝8時に自動で期限チェックを実行」など、本格的な自動化の世界へ進みましょう。

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

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