ChatGPTでGAS×GEMINI API 処理を バイブコーディングしてみた!!!

2025年5月1日木曜日

ChatGPT GAS Gemini API Google Apps Script VibeCoding

ChatGPTでバイブコーディングしてみた!!!

投稿日:

目次

はじめに

今回は、ChatGPTを使ってGAS(Google Apps Script)のコードを自動生成(バイブコーディング)してみました!日々の繰り返しタスクを自動化するコードを、AIに生成させる新しい開発体験をご紹介します。

スクリプト紹介

以下のコードをChatGPTに生成させ、1件ずつ処理するように制限をかけたサンプルです。K列に勘定科目、L列にOCRテキスト、M列に処理フラグを扱います。

/**
 * Google Apps Script: 領収書OCRテキストから勘定科目を取得し、
 * シートに書き込む自動処理(Generative Language API v1beta + Gemini 1.5 Pro)
 *
 * モデル呼び出し時の JSON ペイロードには `contents` フィールドを使います :contentReference[oaicite:0]{index=0}。
 * レスポンスからは最初の候補の content.parts[0].text を抽出します :contentReference[oaicite:1]{index=1}。
 */

// ——— 定数設定 ———
const GEMINI_API_KEY = 'XXXX';                   // ご自身の Gemini API キー
const SPREADSHEET_ID = 'YYYY';                   // 対象のスプレッドシート ID
const SHEET_NAME     = '経費明細';                // 対象シート名
const ERROR_EMAIL    = 'your-email@example.com'; // エラー通知先メールアドレス

// ——— モデル名 & エンドポイント ———
const MODEL_NAME = 'gemini-1.5-pro-002';
const ENDPOINT   =
  'https://generativelanguage.googleapis.com/v1beta/models/'
  + MODEL_NAME
  + ':generateContent?key='
  + encodeURIComponent(GEMINI_API_KEY);

/**
 * メイン関数:
 * 2行目以降の未処理行を1行だけ処理し、
 * K列に勘定科目、M列に「完了」を書き込む
 */
function processReceiptCategory() {
  const ss    = SpreadsheetApp.openById(SPREADSHEET_ID);
  const sheet = ss.getSheetByName(SHEET_NAME);
  if (!sheet) {
    throw new Error(`シート「${SHEET_NAME}」が見つかりません。`);
  }

  // データ取得(1行目はヘッダー)
  const values = sheet.getDataRange().getValues();
  for (let i = 1; i < values.length; i++) {
    const ocrText  = values[i][11]; // L列 (0-based index 11)
    const doneFlag = values[i][12]; // M列 (0-based index 12)

    // OCRテキストあり & 未処理 の行を処理
    if (ocrText && !doneFlag) {
      try {
        // プロンプト作成
        const prompt = [
          '以下は領収書のOCRテキストです(ノイズが含まれています)。',
          ocrText,
          '',
          'この中から、会計処理に必要な情報のみ抽出して、最も適切な「勘定科目」を1つだけ日本語で出力してください。'
        ].join('\n');

        // リクエストペイロード
        const payload = JSON.stringify({
          contents: [
            { parts: [ { text: prompt } ] }
          ]
          // generation_config などを追加したい場合はここに
        });

        const options = {
          method: 'post',
          contentType: 'application/json',
          payload,
          muteHttpExceptions: true
        };

        // API 呼び出し
        const response = UrlFetchApp.fetch(ENDPOINT, options);
        const code     = response.getResponseCode();
        const body     = response.getContentText();

        if (code === 200) {
          const json = JSON.parse(body);
          // 最初の候補のテキストを抽出
          const parts   = json.candidates[0].content.parts;
          const category = parts.map(p => p.text).join('').trim();

          // K列(勘定科目)と M列(処理完了フラグ)に書き込み
          sheet.getRange(i + 1, 11).setValue(category); // K列 (1-based)
          sheet.getRange(i + 1, 13).setValue('完了');   // M列 (1-based)
        } else {
          throw new Error(`Gemini API Error (${code}): ${body}`);
        }
      } catch (e) {
        // エラー時はログ & メール通知
        Logger.log(e);
        MailApp.sendEmail({
          to: ERROR_EMAIL,
          subject: '【GAS エラー通知】領収書処理エラー',
          body: e.toString()
        });
      }
      // 1行だけ処理したら必ずループを抜ける
      break;
    }
  }
}

/**
 * デバッグ用: 利用可能なモデル一覧を Logger に出力
 */
function listModels() {
  const url = 'https://generativelanguage.googleapis.com/v1beta/models'
            + '?key=' + encodeURIComponent(GEMINI_API_KEY);
  const res = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
  Logger.log(res.getContentText());
}

使い方

  1. スクリプトエディタに上記コードを貼り付け
  2. GEMINI_API_KEYに自分のAPIキーを設定
  3. SPREADSHEET_IDに自身のスプレッドシートIDを入力
  4. スクリプトを実行して動作を確認

まとめ

ChatGPTによるバイブコーディングで、GASの開発効率が大幅に向上しました。AIを活用したコード自動生成の可能性をぜひ体験してみてください!


とコードだけ見ればすんなりなのですが・・・
ここまでにかなり試行錯誤を繰り返しました。。。

別途、ChatGPT様との戯れ履歴を開示します!