別の市の創業塾からの依頼が来たとき、まず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か所のコピーが存在することのコストと、汎用化するコストを比べて、汎用化のコストが下回った時点で動けばいい。
*シンプルシステム株式会社 代表 伊藤勝彦*