見出し画像

GAS学習note:Day8 ログ管理で“動きを見える化”〜AIと一緒にトラブルを減らすGAS運用〜

はじめに

Day7で「通知機能(メール/Slack)」を追加し、
GASが自動で“報告”まで行ってくれるようになりました。

でも自動化が進むほど、気になるのが次の問題👇

✅ 「ちゃんと動いてる?」
✅ 「いつエラーが出た?」
✅ 「何件処理した?」

そこでDay8では、ログ管理(Logging) に注目します。


1️⃣ ログとは?

ログとは、GASの動作履歴やエラー内容を記録する仕組みです。
プログラムがバックグラウンドで動くようになった今、
ログは「見えない裏側の記録ノート」です。


2️⃣ 基本のログ出力:Logger.log()

GASには、標準で「Logger」というオブジェクトがあります。

function dueAlert() {
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("タスク管理");
  const last = sh.getLastRow();
  const today = new Date();
  today.setHours(0, 0, 0, 0);

  Logger.log("処理開始:" + today);

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

    if (!(due instanceof Date)) continue;

    if (due < today && status === false) {
      sh.getRange(r, 8).setValue("期限切れ");
      Logger.log(`期限切れ検出 → 行:${r}, 期限:${due}`);
    }
  }

  Logger.log("処理完了");
}

📘 確認方法
スクリプトエディタ上で実行後、
メニュー → 表示 → ログ で記録内容を確認できます。


3️⃣ 実務向けログ保存:スプレッドシートに出力

定期的に動くトリガー処理は、Loggerでは見逃すことも。
そこで、ログ専用シートを用意して残しておくと安心です👇

function writeLog(message) {
  const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("LOG");
  const time = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss");
  logSheet.appendRow([time, message]);
}

これを既存コードに組み込むだけ。

function dueAlertWithLog() {
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("タスク管理");
  const last = sh.getLastRow();
  const today = new Date();
  today.setHours(0, 0, 0, 0);

  writeLog("処理開始");

  for (let r = 2; r <= last; r++) {
    const due = sh.getRange(r, 6).getValue();
    const status = sh.getRange(r, 7).getValue();
    if (!(due instanceof Date)) continue;

    if (due < today && status === false) {
      sh.getRange(r, 8).setValue("期限切れ");
      writeLog(`期限切れ検出:行${r}`);
    }
  }

  writeLog("処理完了");
}

📊 結果イメージ(LOGシート)

日時メッセージ2025/10/10 08:00:00処理開始2025/10/10 08:00:02期限切れ検出:行52025/10/10 08:00:03処理完了


4️⃣ エラーをキャッチしてログに残す

トリガー実行時は「エラーが出ても気づかない」のが落とし穴。
そこで try...catch を使って安全にログを残します👇

function safeDueAlert() {
  try {
    dueAlertWithLog();
  } catch (e) {
    writeLog("⚠ エラー発生:" + e.message);
    MailApp.sendEmail("you@example.com", "【GASエラー通知】", e.stack);
  }
}

💡 ポイント

  • try ブロックで通常処理を実行

  • catch ブロックでエラーを検知

  • ログ+メール通知で 「失敗も見逃さない」仕組み


5️⃣ ChatGPTと一緒にログを分析してみよう

自動化が増えると、ログも溜まります。
でも「エラーが出た時だけ抽出したい」「処理時間が長い日を見つけたい」など、
データを読み解くのはちょっと大変。

そこでChatGPTに質問👇


💬 実際のやり取り

📘 あなた

LOGシートに「エラー発生」「処理完了」などが記録されています。
ChatGPT、このデータから最近エラーが多い日を教えてもらえますか?

🤖 ChatGPT

もちろんです!
日付ごとに「⚠ エラー発生」が何件あったか数える関数を作りましょう👇

=QUERY(LOG!A:B, "select A, count(B) where B contains 'エラー' group by A label count(B) '件数'")

📘 あなた

すごい!スプレッドシート上で可視化できました✨
ChatGPTに聞いたらログ分析まで自動化できるなんて…!


💡 AIを活かすポイント

  • ChatGPTは「ログの読み方」まで提案できる

  • SQLライクなQUERY関数や正規表現をサクッと生成してくれる

  • 「何を知りたいか」を伝えると、最適な式・コードを出してくれる


6️⃣ GAS × ChatGPT で「止まらない自動化」を実現



まとめ:Day8で身についた力

Day8では、「動かす」から「見守る」へ。
GASが自動で動き続ける仕組みを、AIと一緒に“安全運転化” しました。

習得したスキル

  • Logger.log()で開発時の確認ができる

  • LOGシートで履歴を残すことで、後から状況を追える

  • try...catchでエラーを検知し、メールで通知

  • ChatGPTにログを分析してもらうことで、改善点を発見できる

💡 GAS × AI × ログ管理 =「止まらない自動化」


次回予告(Day9)

Day9では、「入力補助と自動入力」をテーマにします。
ユーザーがスプレッドシートを編集したときに、
ChatGPTが提案した値を自動入力する“賢い補助ツール”を作っていきます。

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

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