ChatGPT✖︎GASを駆使した効率的データ収集方法

こんにちは、エンジニアの川本です。
主にBUYMAの決済・配送を担当しているチームでバックエンドの開発をしています。

この記事は Enigmo Advent Calendar 2023 の 6 日目の記事です。

昨今の生成AIブームでChatGPTが注目を集めておりますが、私もChatGPTを積極的に業務に活用しています。毎日ChatGPTに質問することが当たり前になりつつあります。

今回は、実際の業務でChatGPTとGoogle Apps Script(GAS)を組み合わせてデータ収集を効率化できた事例を紹介します。

背景

弊社では各バッチ処理の実行時間が規定の時間よりも長い場合にGmailでアラートメールを送信するシステムが稼働しているのですが、ある案件で過去数ヶ月のアラートデータを参照する必要が生じました。

しかし、アラートデータはDBに保存されておらず、Gmailに直接送信されているため、SQLで直接データを参照することが難しい状況でした。

DBに新しいテーブルを作成してアラートデータを保存する案も検討しましたが、データが十分に蓄積されるまでには半年近く時間がかかりそうでした。

長期的な解決策としては有用かもしれませんが、今回は案件の都合で即座にデータが必要でした。そこで、Gmailに送信されたアラートメールからGASを利用してデータを抽出し、スプレッドシートにまとめる方法を考えることにしました。

とはいえGASは未経験だったので1から調べながら実装するのは手間だなと感じ、物は試しにChatGPTに実装させてみました!

ChatGPT✖︎GASの活用

実際にChatGPTに入力したプロンプトと、ChatGPTが出力したGASについて紹介します。

ChatGPTに入力したプロンプト

あなたのGmailのメールボックスには以下のフォーマットのメールが届いています。
2023年1月1日から2023年3月30日までに届いた下記メールからバッチ名(batch_id)、実行状態(run_status)のデータを抽出し、
スプレッドシートにまとめるためのGoogle Apps Scriptを作成してください。

# メールのフォーマット

## メールタイトル

`[CRITICAL]過去1時間止まっているバッチを検出`

## メール本文

過去1時間エラーで停止しているか、実行し続けているバッチを検出しました。
状態を確認してください。

| batch_id | start_date | run_status |
| Batch1 | Aug 17 2023 04:51PM | ERROR |
| Batch2 | Aug 17 2023 10:01AM | RUNNING |
| Batch3 | Aug 17 2023 01:04AM | RUNNING |
| Batch4 | Aug 17 2023 15:04AM | ERROR |

ChatGPTが作成したGAS

function extractStopBatchIdStatusPair() {
  // メールタイトル
  var subjectQuery = "[CRITICAL]過去1時間止まっているバッチを検出";
  
  // 対象期間
  var startDate = "2023/01/01";
  var endDate = "2023/03/30";

  // 対象期間のアラートメールを取得するクエリ
  var query = "subject:" + subjectQuery + " after:" + startDate + " before:" + endDate;

  // メールスレッドを取得
  var threads = GmailApp.search(query);

  // スプレッドシートを指定
  var spreadsheet = SpreadsheetApp.openById("スプレッドシートID");
  var sheet = spreadsheet.getSheetByName("シート名");
  sheet.clearContents();
  
  // 抽出したアラートデータ
  var values = [];

  // メールスレッドごとに処理
  for (var i = 0; i < threads.length; i++) {
    var thread = threads[i];
    var messages = thread.getMessages();

    // メッセージごとに処理
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var body = message.getPlainBody();
      var subject = message.getSubject();

      // メール本文から正規表現で対象データ抽出
      var tableMatches = body.match(/\| ([^\|]+) \| ([^\|]+) \| ([^\|]+) \|/g);

      if (tableMatches) {
        for (var k = 0; k < tableMatches.length; k++) {
          var tableRow = tableMatches[k].split("|").map(item => item.trim());
          // batch_id
          var batchId = tableRow[1];
          // run_status
          var runStatus = tableRow[3];

          values.push([batchId, runStatus]);
        }
      }
    }
  }

  // データをスプレッドシートに一括で書き込む
  if (values.length > 0) {
    sheet.getRange(2, 1, values.length, 2).setValues(values);
  }
}

ChatGPTが作成したGASの実行結果

以下のように期待通りにスプレッドシートにデータが出力されました!

まとめ

ChatGPTが生成するGASの精度は期待以上であり、ゼロからGASを調査・実装する手間を考えると、非常に時間を節約でき、効率的であると感じました。

また、高い精度の出力を得るためには、入力するプロンプトの内容が重要であることがわかりました。詳細に要件を整理し、適切なプロンプトを作成することで、ChatGPTによる出力もより精度が向上します。

初めての試行で高い精度を達成できなかったとしても、修正やリファクタリングの要望を的確に伝えることで、最終的には期待通りの結果を得ることができます。

今後は、プロンプトの適切な書き方を学びつつ、より高い精度の出力を得る方法を探求していきたいと考えています。

明日の記事はT&Sチームの杉山さんが担当しますので、お楽しみに!


株式会社エニグモ すべての求人一覧

hrmos.co