個人開発

Google Form の問い合わせを Gemini で仕訳して GitHub Issue に自動登録する

AIロボットのイメージ
Photo by Kindel Media on Pexels

やりたかったこと

個人開発でサービスを公開すると、バグ報告や機能要望、たまにスパムまでいろいろな問い合わせが来ます。

ただ個人で運用しているので、毎回メールを確認して仕訳して…というのは現実的ではないんですよね。できれば問い合わせが来たら自動で分類して、バグ報告だけ GitHub の Issue に登録してほしい。スパムは弾いてほしい。

ということで、Google Form + Google Apps Script + Gemini AI + GitHub API を組み合わせて、問い合わせの自動仕訳システムを作りました。

全体の構成

Google Form 問い合わせ自動仕訳システムの構成図

サーバーは不要です。Google Form の送信をトリガーにして Apps Script が自動実行されるので、全部 Google のインフラで完結します。

Gemini で有害判定する

問い合わせの中にはスパムや誹謗中傷が混ざることがあります。これを Gemini AI に判定させています。

ポイントはプロンプトの設計で、単純に「不適切ですか?」と聞くのではなく、建設的なネガティブ意見は通すようにしています。

【判定基準】
- 誹謗中傷、暴言、侮辱的な表現 → HARMFUL
- スパム、意味不明な文字列の羅列 → HARMFUL
- 差別的・性的な表現 → HARMFUL
- バグ報告、機能要望、質問、感想(ネガティブでも建設的なもの)→ SAFE

「動かなくてイライラする」みたいな感想は SAFE として通して、「◯ね」「◯えろ」みたいな攻撃的表現だけ HARMFUL にする、という線引きです。

API 呼び出しは Gemini API に直接リクエストしています。温度を 0 に設定して、判定のブレを最小限にしています。

var payload = {
  contents: [{ parts: [{ text: prompt }] }],
  generationConfig: {
    temperature: 0,
    maxOutputTokens: 100
  }
};

エラー時はデフォルトで SAFE と判定するようにしています。AI の判定ミスでユーザーの正当な問い合わせが弾かれるほうが困るので、フェイルセーフはSAFE側に倒しています。

カテゴリごとの仕訳ルール

Google Form でユーザーにカテゴリを選んでもらっています。

カテゴリ処理
バグ報告GitHub Issue 自動作成
機能要望スプレッドシートに記録
お問い合わせスプレッドシートに記録
その他スプレッドシートに記録
(有害判定)spam シートに記録

GitHub Issue にするのはバグ報告だけです。機能要望や質問はスプレッドシートに溜めておいて、定期的に確認しています。全部 Issue にすると量が増えすぎて管理しきれないんですよね。

実際のスプレッドシートはこんな感じです。

フィードバックが記録されたスプレッドシート

GitHub Issue の自動作成

バグ報告が来ると、GitHub API を使って自動で Issue を作成します。

カテゴリに応じてラベルを自動付与します。

var labelMap = {
  "バグ報告": "bug",
  "機能要望": "enhancement",
  "お問い合わせ": "inquiry",
  "その他": "feedback"
};

実際の GAS のコードはこんな感じです。UrlFetchApp.fetch で GitHub API を叩いています。

function createGitHubIssue(title, body, labels, config) {
  var payload = {
    title: title,
    body: body,
    labels: labels
  };

  var options = {
    method: "post",
    contentType: "application/json",
    headers: {
      Authorization: "Bearer " + config.GITHUB_TOKEN,
      Accept: "application/vnd.github.v3+json",
      "User-Agent": "Feedback-Bot"
    },
    payload: JSON.stringify(payload)
  };

  var url = "https://api.github.com/repos/" + config.GITHUB_REPO + "/issues";
  var response = UrlFetchApp.fetch(url, options);
  var issue = JSON.parse(response.getContentText());
  Logger.log("Created issue #" + issue.number);
}

タイトルはフィードバック内容の先頭80文字から自動生成して、本文には報告日時や利用環境などのメタ情報も付加されます。トークンは Apps Script の PropertiesService に保存して、コードにはハードコードしないようにしています。

自動作成された Issue はこんな感じで、ラベルも自動で付きます。

自動作成された GitHub Issue の一覧

スパム対策と運用

実際に運用してみて、Gemini の有害判定はかなり正確です。明らかなスパムや暴言はほぼ弾いてくれますし、「ここが使いにくい」みたいな建設的な不満は通してくれます。

spam シートに記録された内容は定期的に確認していますが、誤判定はほとんどないですね。

運用のコストもほぼゼロです。

  • Google Form: 無料
  • Google Apps Script: 無料(日次実行数に余裕あり)
  • Gemini API: 無料枠で十分(個人開発の問い合わせ量なら)
  • GitHub API: 無料

個人開発でもこういう仕組みを入れておくと、問い合わせ対応の心理的ハードルがだいぶ下がります。「来たら自動で処理される」という安心感があるので、サービスの公開に対する抵抗が減りました。


参照リンク