Google Form の問い合わせを Gemini で仕訳して GitHub Issue に自動登録する
やりたかったこと
個人開発でサービスを公開すると、バグ報告や機能要望、たまにスパムまでいろいろな問い合わせが来ます。
ただ個人で運用しているので、毎回メールを確認して仕訳して…というのは現実的ではないんですよね。できれば問い合わせが来たら自動で分類して、バグ報告だけ GitHub の Issue に登録してほしい。スパムは弾いてほしい。
ということで、Google Form + Google Apps Script + Gemini AI + GitHub API を組み合わせて、問い合わせの自動仕訳システムを作りました。
全体の構成

サーバーは不要です。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 はこんな感じで、ラベルも自動で付きます。

スパム対策と運用
実際に運用してみて、Gemini の有害判定はかなり正確です。明らかなスパムや暴言はほぼ弾いてくれますし、「ここが使いにくい」みたいな建設的な不満は通してくれます。
spam シートに記録された内容は定期的に確認していますが、誤判定はほとんどないですね。
運用のコストもほぼゼロです。
- Google Form: 無料
- Google Apps Script: 無料(日次実行数に余裕あり)
- Gemini API: 無料枠で十分(個人開発の問い合わせ量なら)
- GitHub API: 無料
個人開発でもこういう仕組みを入れておくと、問い合わせ対応の心理的ハードルがだいぶ下がります。「来たら自動で処理される」という安心感があるので、サービスの公開に対する抵抗が減りました。