開発情報・ナレッジ

投稿者: 学生インターン 2025年12月26日 (金)

【 Gemini API × SPIRAL】「未来の自分を甘やかす」最強ツール

学生インターンシップです!
スパイラル株式会社の学生インターンとして、SPIRALを学習しながらユーザー目線で質問に答える活動をしています。
補足情報や調査結果の提供を行い、皆様のお役立てができればと思っています!
※学生が学びの一環として調査・まとめた内容です。
 正確な仕様や最新情報は、公式リファレンスなどをご確認ください。

はじめに

エンジニアの三大美徳は「怠惰・短気・傲慢」...ならば、週報作成などという毎週繰り返される退屈な作業は
コードに行ってもらうことが正義ではないでしょうか?
「今週何やったっけ…」と記憶を辿る時間、報告書のために日本語を整える時間、全てがもったいない!
そんな非生産的な業務をなくすべく、Gemini APIを使って
日々の記録から週報作成までを1フォームで完結できる最強ツールを作り上げましたので共有いたします。

使用ツール

Gemini API(無料枠)
文章作成用のAIです。
今回はgemini-2.5-flashを使用します。
Gemini APIページはこちら
※無料枠と有料枠がございますが、今回は無料枠を使用しています。
SPIRALver.1
DB・フォーム構築用のローコードツールです。

構築方法

全体の流れはこちらです。

1. DB・フォームを発行
2. APIキーを取得
3. フォームにAPIを追加

では、具体的な手順を解説します。
DB・フォームを発行
まずは、 SPIRALver.1を使って日々の業務記録を溜めておくためのDBと、入力用のフォームを用意します。
ローコードなので、ものの数分で発行できます。

▼ DBの項目例
・日付
・案件名
・顧客名
・進捗内容
・問題点
・次のアクション

具体的な発行方法はこちらをご覧ください。
DB: 通常DB SPIRAL ver.1 サポートサイト
フォーム: フォーム SPIRAL ver.1 サポートサイト

次に、発行されたフォームの入力ページに手を加え「日々の進捗登録」と「週報作成」を1つの画面で切り替えられるようにします。
デフォルトで発行されるフォームは日々の進捗記録用にできるので、切り替えた先のフォームは自力で作成します。
発行されたフォームの入力ページに、ラジオボタンを設置します。

▼今回作成したフォーム
「週報作成」を選択した場合のフォームには、「開始日」と「終了日」を入力できるようにソースコードを追加します。
▼サンプルコードはこちらです。
                
// ラジオボタン選択時にフォームを切り替える
  function toggleForm() {
   const selected = document.querySelector('input[name="formType"]:checked').value;
   document.getElementById("progressForm").style.display = (selected === "progress") ? "block" : "none";
   document.getElementById("weeklyForm").style.display = (selected === "weekly") ? "block" : "none";
  }
                
                
<!-- フォーム切り替え用ラジオボタン -->
   <div class="smp_tmpl">
    <dl class="cf">
     <dt class="title">フォーム選択 <span class="need">*</span></dt>
     <dd class="data multi1">
      <label class="radio">
       <input type="radio" name="formType" value="progress" onclick="toggleForm()" checked>
       <span>進捗管理</span>
      </label>
      <label class="radio">
       <input type="radio" name="formType" value="weekly" onclick="toggleForm()">
       <span>週報作成</span>
      </label>
     </dd>
    </dl>
   </div>

<!-- 週報作成フォーム -->
<form id="weeklyForm" method="post" action="" style="display:none;">
   <div class="smp_tmpl">
    <dl class="cf">
     <dt class="title">開始日 <span class="need">*</span></dt>
     <dd class="data"><input class="input" type="date" name="start_date"></dd>
    </dl>
    <dl class="cf">
     <dt class="title">終了日 <span class="need">*</span></dt>
     <dd class="data"><input class="input" type="date" name="end_date"></dd>
    </dl>
    <input class="submit" type="submit" value="週報作成">
   </div>
  </form>
                
デザインはいくらでも編集できますので、心ゆくまで編集してください。
APIキーを取得
  1. Gemini APIを取得します。
  2. Google AI StudioにGoogleアカウントでアクセスします。
  3. 画面左側の「Get API key」メニューをクリックし、
    「Create API key in new project」ボタンを押せば、キーが生成されます。
  4. ※「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("f00xxxxx", "f00xxxxx", "f00xxxxx", "f00xxxxx", "f00xxxxx", "f00xxxxx"); // 取得したい項目の差し替えキーワード
 $MstDB->setLinesPerPage(500);
 $Mst = $MstDB->doSelect();

 $view_data = [];
  for ($i = 0; $i < $Mst["count"]; $i++) { 
  $raw_date = $Mst["data"][$i]["f00xxxxx(日付に該当する差し替えキーワード)"];// 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 = [ "f00xxxxx" => "日付", "f00xxxxx" => "案件名", "f00xxxxx" => "顧客名", "f00xxxxx" => "進捗内容", "f00xxxxx" => "問題点", "f00xxxxx" => "次のアクション" ];
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タイトルと差し替えキーワード部分( f00xxxxxなどの記載があるところ)のみ、
ご自身が発行されたものに書き換えてください。
PHPに関してですが、通常のPHPとは違いSPIRAL独特の書き方があります。

▼気になる方はこちらからご確認ください
Docs For Class SpiralDataBase

以上で構築は終了となります。

動作確認

実際に使ってみるとこのような感じです。
期間を指定してボタンを押すと…
フォーム上に週報が生成されます。
▼ちなみに、私が実際にフォームから登録した内容はこちらです
範囲外のデータは除外され、こんな雑な記録から立派な週報を作成してくれます。
一度作ってしまえばAIに命令を出す時間すら削減できるので、とってもおススメです!

おわりに

いかがでしたでしょうか。
今回は「いかに楽をして、未来の自分を甘やかすか」という一点に全力を注ぎ、
ローコードと生成AIを組み合わせた週報自動化ツールを構築しました。
数時間で構築できますので、よければ参考にしていただけると幸いです。
このツールが皆様の定時退社への第一歩になれることを願っています。

解決しない場合はこちら コンテンツに関しての
要望はこちら