全国オンライン対応受付 平日 9:00-18:00
お問い合わせ

開発記録 / AiReview制作記 / Vol.14 AiReview制作記 Vol.1

記事 04

Flex版設計:講座に依存しない汎用AI添削エンジンの作り方

別の市の創業塾からの依頼が来たとき、まずA版のコードを開いた。

2026-06-07 公開

別の市の創業塾からの依頼が来たとき、まずA版のコードを開いた。

見てみると、変更が必要な箇所は3か所だけだった。Google DriveのフォルダID、プロンプト内の講座名「ある創業カレッジ2026」、そして地域例示「その市」。それ以外の1,000行近くは全く同じコードだ。

コピーしてデプロイした。これがB版(AiReview_B.gs)だ。

しかしその瞬間、「3つ目の講座が来たらまたコピーするのか」という気持ちが出た。


コピーの何が問題か

コードが2か所に存在するとき、バグを修正すると2か所を直さなければならない。1か所だけ直して、もう1か所を忘れることがある。

実際に起きた。event_idの重複検出を実装したとき(重複メール問題の修正)、A版に入れてB版への適用を忘れた。後から気づいて慌てて直した。

3か所、4か所になったとき、同じことを続けられるか。答えはNOだ。


Flex版の基本設計

Flex版(AiReview_Flex.gs)は1つのGASプロジェクトで複数講座を動かす。設定値の違いはTypeFormのフォームIDで吸収する。

function doPost(e) {
  const payload = JSON.parse(e.postData.contents);
  const formId = payload.form_response.form_id;

  if (formId === 'jwLurS10') {
    handleRegistration(payload);   // メールアドレス登録フォーム
  } else if (formId === 'S4hAdApI') {
    enqueue(payload);              // 添削フォーム
  }
}

1つのGASエンドポイントで2種類のフォームを受け取る。


2フォーム構成にした理由

1フォームで「メールアドレスも事業計画書の内容も全部入力」という設計も考えた。しかしそれでは添削フォームのURLが公開された状態になる。無関係な人が試しに送ってきても処理する。Gemini APIの費用が余分にかかる。

2フォーム構成にした。

フォーム1(登録フォーム):メールアドレスを登録する。GASが即座に招待メールを送る。招待メールに「添削フォームのURL」が記載されている。

フォーム2(添削フォーム):招待メールを受け取った人だけが使える添削フォームだ。

これにより、「事業計画書を提出しようとしている受講者」だけがGeminiを使えるフローになる。


フィールドタイトルで回答を取得する

TypeFormのフィールドIDはフォームごとに変わる。「氏名」を聞く設問でも、フォームAのIDと異なる場合がある。

Flex版では設問IDではなく、設問の「タイトル(文言)」にキーワードが含まれるかどうかで回答を取得する。

function getVal(answers, titleKeyword) {
  const found = answers.find(a =>
    a.field && a.field.title && a.field.title.includes(titleKeyword)
  );
  if (!found) return '';
  return found.text || found.choice?.label || found.email || '';
}

const name  = getVal(answers, '氏名') || getVal(answers, '名前') || getVal(answers, 'お名前');
const email = getVal(answers, 'メール') || getVal(answers, 'email');

「氏名」「名前」「お名前」、どのタイトルを使っていても対応できる。TypeFormのフォームを別の担当者が設計していても、キーワードさえ含まれていれば機能する。


ファイル添付に対応した

受講者の中には、すでにWord文書で事業計画書を書いている人がいる。そのWordファイルをそのまま添付できるようにした。

TypeFormのファイル添付フィールドは、アップロードされたファイルのURLを回答として返す。GASはそのURLからファイルを取得し、Google Drive APIでGoogleドキュメントに変換してテキストを抽出する。ExcelはGoogleスプレッドシートに変換する。

テキスト入力で書き直す手間がなくなった。受講者の負担が下がった。


3か所目の原則

汎用化するかどうかの判断基準を、私は「3か所」に設定している。同じロジックが3か所以上になったとき初めて、汎用化するコストが正当化される。

AiReviewでは「A版」「B版」と2か所まではコピーで対応した。3か所目の講座が来ることが見えた時点でFlex版を作った。

最初から汎用版を作る必要はない。2か所のコピーが存在することのコストと、汎用化するコストを比べて、汎用化のコストが下回った時点で動けばいい。


*シンプルシステム株式会社 代表 伊藤勝彦*