はじめに
エンジニアの三大美徳は「怠惰・短気・傲慢」...ならば、週報作成などという毎週繰り返される退屈な作業は、コードに押し付けるのが正義ではないでしょうか?
「今週何やったっけ…」と記憶を辿る時間、報告書のために日本語を整える時間、全てがもったいない!そんな非生産的な業務を撲滅すべく、Gemini APIを使って日々の記録から週報作成までを1フォームで完結できる最強ツールを作り上げましたので共有いたします。
使用ツール
- Gemini API
文章作成用のAIです。今回はgemini-2.5-flashを使用します。 - SPIRALver.1
DB・フォーム構築用のローコードツールです。
どちらも無料で使用できますので(もちろん課金要素はありますが)とっつきやすいかと思います。
▽SPIRALのトライアルはこちらから!
構築方法
全体の流れはこんな感じです。
①DB・フォームを発行
➁APIキーを取得
③フォームにAPIを追加
では、具体的な手順を解説します。
① DB・フォームを発行
まずは、 SPIRALver.1を使って日々の業務記録を溜めておくためのDBと、入力用のフォームを用意します。
ローコードなので、ものの数分で発行できます。
▼ DBの項目例
- 日付
- 案件名
- 顧客名
- 進捗内容
- 問題点
- 次のアクション
具体的な発行方法はこちらをご覧ください。
次に、発行されたフォームの入力ページに手を加え「日々の進捗登録」と「週報作成」を1つの画面で切り替えられるようにします。
デフォルトで発行されるフォームは日々の進捗記録用にできるので、切り替えた先のフォームは自力で作成します。こんな感じ↓
ちなみにデザインはいくらでも編集できますので、気のすむまで編集してください。
➁APIキーを取得
- Gemini APIを取得します。
Google AI StudioにGoogleアカウントでアクセスします。 - 画面左側の「Get API key」メニューをクリックし、「Create API key in new project」ボタンを押せば、キーが生成されます。
※※「Vertex AI API」が有効になっているか、請求先アカウントがリンクされているかを必ず確認してください。無料枠でも請求先をリンクさせる必要があります。
③フォームにAPIを追加
先ほど作成したフォームの入力ページの先頭に、以下のコードを追加してください。
<?php //<!-- SMP_DYNAMIC_PAGE DISPLAY_ERRORS=ON NAME= --> //おまじない?>
<?php require_once('report/API.php'); // APIキーが格納されたファイル ?>
<?php
// 年・月・日を取得 $start_date = $_POST['start_date'] ?? null; $end_date = $_POST['end_date'] ?? null;
// 週報生成結果を格納する変数 $weekly_report = "";
// 開始日と終了日が指定されている場合のみ処理を実行
if ($start_date && $end_date) {
// ▼ ここからSPIRAL独自のコードが混じっています。
$MstDB = $SPIRAL->getDataBase("reportDB"); // DB呼び出し
$MstDB->addSelectFields("f003536834", "f003536835", "f003536836", "f003536837", "f003536838", "f003536839"); // 取得したい項目の差し替えキーワード
$MstDB->setLinesPerPage(500); // おまじない
$Mst = $MstDB->doSelect(); // おまじない
$view_data = [];
for ($i = 0; $i < $Mst["count"]; $i++) {
$raw_date = $Mst["data"][$i]["f003536834"];// SPIRALの仕様上、doSelectの結果は”data”の中に格納されます。
$formatted_date = preg_replace('/(\d{4})年(\d{1,2})月(\d{1,2})日/', '$1-$2-$3', $raw_date);
$current = strtotime($formatted_date);
$start = strtotime($start_date);
$end = strtotime($end_date);
if ($current !== false && $start !== false && $end !== false) {
if ($start <= $current && $current <= $end) {
$view_data[] = $Mst["data"][$i];
}
}
}
// ▲ ここまで独自コード含む
if (!empty($view_data)) {
$report_data_string = ""; $field_map = [ "f003536834" => "日付", "f003536835" => "案件名", "f003536836" => "顧客名", "f003536837" => "進捗内容", "f003536838" => "問題点", "f003536839" => "次のアクション" ];
foreach ($view_data as $data) {
foreach ($data as $key => $value) {
if (isset($field_map[$key]) && !empty($value)) {
$report_data_string .= $field_map[$key] . ": " . $value . "\n";
}
} $report_data_string .= "------------------------\n";
}
// ▼ API連携部分
// Gemini APIにリクエストを送信する
// ★ご自身のAPIキーを別ファイルから呼び出し
$apiKey = GEMINI_API_KEY;
$model = 'gemini-2.5-flash';
$api_url = "https://generativelanguage.googleapis.com/v1/models/{$model}:generateContent?key={$apiKey}";
$prompt = "あなたは優秀なアシスタントです。\n" . "以下の業務報告データを元に、上司に提出するための丁寧な言葉遣いの週報を作成してください。\n\n" . "フォーマットは以下のように、見やすくおねがいします。\n" . "件名:週報({$start_date}~{$end_date})\n\n" . "■ 今週のサマリー\n(全体の状況を簡潔にまとめてください)\n\n" . "■ 各案件の進捗状況\n・[案件名]\n - 進捗:[進捗内容を記載]\n - 課題:[問題点を記載]\n - 来週の予定:[次のアクションを記載]\n\n" . "■ 課題と対策\n(全体を通しての課題や、特筆すべき問題点とその対策をまとめてください)\n\n" . "■ 来週の予定\n(全体の来週の予定をまとめてください)\n\n" . "---\n元データ:\n{$report_data_string}";
$data = [ 'contents' => [ [ 'role' => 'user', 'parts' => [ ['text' => $prompt] ] ] ] ];
$headers = ['Content-Type: application/json'];
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
if ($http_code == 200) { $result = json_decode($response, true);
if (isset($result['candidates'][0]['content']['parts'][0]['text'])) {
$weekly_report = $result['candidates'][0]['content']['parts'][0]['text'];
} else {
$weekly_report = "エラー:Gemini APIから予期せぬ形式の応答がありました。\n\n" . print_r($result, true);
}
} else {
$weekly_report = "エラーが発生しました。APIからの応答がありません。(HTTP CODE: {$http_code})\n" . $response;
}
// ▲ API連携部分
} else {
$weekly_report = "指定された期間に該当するデータがありませんでした。";
}
}
?>
DB名と差し替えキーワード部分( f003536834などの記載があるところ)のみご自身が発行されたものに書き換えてください。
PHPに関してですが、通常のPHPとは違いSPIRAL独特の書き方があるので、疑問に思ってもスルーしてください。
気になる方はこちら→ Docs For Class SpiralDataBase
以上で完成となります。
実際に使ってみるとこんな感じです。
期間を指定してボタンを押すと…
フォーム上に週報が生成されます。
ちなみに、私が実際にフォームから登録した内容はこれ↓
範囲外のデータは除外され、こんな雑な記録から立派な週報を作成してくれます。
一度作ってしまえばAIに命令を出す時間すら削減できるので、とってもおススメです!
おわりに
いかがでしたでしょうか。
今回は「いかに楽をして、未来の自分を甘やかすか」という一点に全力を注ぎ、ローコードと生成AIを組み合わせた週報自動化ツールを構築しました。
数時間で構築できますので、よければ参考にしていただけると幸いです。
このツールが皆様の定時退社への第一歩になれることを願っています。
私がインターンしているスパイラル株式会社は、ローコードプラットフォーム、SPIRAL ver.1のトライアルアカウントを無償提供しています。このアカウントの記事でも紹介するように、たくさんの機能ございます。
▶︎ フォーム
▶︎ 認証エリア
▶︎ ログイン
▶︎ メール送信
▶︎ カスタムプログラム
などの作成できますので、ぜひ試してみてください!!
そして、今チームでトライアル登録者向けに、オンボーディングコンテンツを作成しています。SPIRAL ver.1にご興味のある方、ぜひこちらもご覧ください👇




