はじめに
この記事はand factory.inc Advent Calendar 2025 1日目の記事です。
and factoryでandroidエンジニアをやっています。
AIを使った開発のナレッジを共有します。
ticktakclock「Claudeで作りました」
???「これってどんな感じで指示して作ってるんですか?」
ticktakclock「えっと〜・・・なんかいい感じに・・・?」
(もうログが残ってなくて詳しく覚えてない)
☝️を解決するためのプロンプトログ
スプレッドシートとGASを作成する
GASにコピペ
- コマンドごとにシートを分けて記述(シートなければ追加)
- hooksで受け取ったJSONをパースして列に記述(なければ増やす)
function doPost(e) {
Logger.log("triggerd:" + e.params)
try {
// パラメータ取得
const params = e.parameter;
const prompt = params.prompt;
Logger.log("params:" + params)
Logger.log("prompt:" + prompt)
if (!prompt) {
Logger.log("Missing parameter: prompt")
return ContentService.createTextOutput("Missing parameter: prompt")
.setMimeType(ContentService.MimeType.TEXT);
}
// JSONを解析
let jsonData;
try {
jsonData = JSON.parse(prompt);
} catch (parseError) {
Logger.log("JSON parse error: " + parseError.message)
return ContentService.createTextOutput("Error: Invalid JSON format")
.setMimeType(ContentService.MimeType.TEXT);
}
// hook_event_nameをシート名として使用
const sheetName = jsonData.hook_event_name;
if (!sheetName) {
Logger.log("Missing hook_event_name in JSON")
return ContentService.createTextOutput("Error: hook_event_name not found in JSON")
.setMimeType(ContentService.MimeType.TEXT);
}
Logger.log("sheetName:" + sheetName)
// スプレッドシートの取得(このスクリプトが紐づいているスプレッドシート)
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName(sheetName);
// 現在時刻
const timestamp = new Date();
// シートがなければ作成
if (!sheet) {
Logger.log("create sheet")
sheet = ss.insertSheet(sheetName);
// ヘッダー行を作成(記録日時 + JSONのキー)
const headers = ["記録日時"];
const jsonKeys = Object.keys(jsonData);
headers.push(...jsonKeys);
sheet.appendRow(headers);
} else {
// 既存シートの場合、ヘッダーが不足していないかチェック
const existingHeaders = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
const jsonKeys = Object.keys(jsonData);
const requiredHeaders = ["記録日時", ...jsonKeys];
// 不足しているヘッダーがあれば追加
if (existingHeaders.length < requiredHeaders.length) {
const missingHeaders = requiredHeaders.slice(existingHeaders.length);
const startCol = existingHeaders.length + 1;
sheet.getRange(1, startCol, 1, missingHeaders.length).setValues([missingHeaders]);
}
}
// データ行を作成
const rowData = [timestamp];
const currentHeaders = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
// ヘッダーの順序に従ってデータを配置(記録日時を除く)
for (let i = 1; i < currentHeaders.length; i++) {
const headerKey = currentHeaders[i];
rowData.push(jsonData[headerKey] || ""); // キーが存在しない場合は空文字
}
// データの書き込み
sheet.appendRow(rowData);
return ContentService.createTextOutput("Success")
.setMimeType(ContentService.MimeType.TEXT);
} catch (error) {
Logger.log("catch error " + error.message)
return ContentService.createTextOutput("Error: " + error.message)
.setMimeType(ContentService.MimeType.TEXT);
}
}
新しいデプロイを作成
アクセスできるユーザーは全員にする
URLは漏洩しないようにね 💡
出てきたウェブアプリURLをコピーする(後で使います)
/hooks でHooks設定起動,『UserPromptSubmit』を選択
『+ Add new hook…』を選択
コマンド入力欄に以下記述してEnter
GASのURLは先程コピーしたものを使う
curl -X POST --data-urlencode "prompt=$(jq '.')" "https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxk/exec"
場所はユーザーでいいかなと
こんな感じで追加されていればOK
- あとはいつもどおりClaudeで指示していればスプレッドシートに追記されていきます
- cwdでフィルターしたりsession_idでフィルタすればどんなプロンプトを入力したのかわかるようになります
おわりに
いかがでしたでしょうか?
AIを使いこなしている人が「一体どんなプロンプトを作ってるんだ・・・?」と気になったり実際に聞かれたときにさっと出せるよう作ってみましたが割と便利です。
次回は
@yasukotelinさんのAndroidプロジェクトの CI で役立つメモリ設定テクニックもお楽しみに ![]()
Andfactory Advent Calendarもよろしくお願いします。






