学生インターンシップです!
スパイラル株式会社の学生インターンとして、SPIRALを学習しながらユーザー目線で質問に答える活動をしています。
補足情報や調査結果の提供を行い、皆様のお役立てができればと思っています!
※学生が学びの一環として調査・まとめた内容です。
正確な仕様や最新情報は、公式リファレンスなどをご確認ください。
はじめに
エンジニアの三大美徳は「怠惰・短気・傲慢」...ならば、週報作成などという毎週繰り返される退屈な作業はコードに行ってもらうことが正義ではないでしょうか?
「今週何やったっけ…」と記憶を辿る時間、報告書のために日本語を整える時間、全てがもったいない!
そんな非生産的な業務をなくすべく、Gemini APIを使って
日々の記録から週報作成までを1フォームで完結できる最強ツールを作り上げましたので共有いたします。
使用ツール
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つの画面で切り替えられるようにします。
デフォルトで発行されるフォームは日々の進捗記録用にできるので、切り替えた先のフォームは自力で作成します。
発行されたフォームの入力ページに、ラジオボタンを設置します。
▼今回作成したフォーム
「週報作成」を選択した場合のフォームには、「開始日」と「終了日」を入力できるようにソースコードを追加します。
▼サンプルコードはこちらです。
デザインはいくらでも編集できますので、心ゆくまで編集してください。
ローコードなので、ものの数分で発行できます。
▼ 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キーを取得
- 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("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
以上で構築は終了となります。
ご自身が発行されたものに書き換えてください。
PHPに関してですが、通常のPHPとは違いSPIRAL独特の書き方があります。
▼気になる方はこちらからご確認ください
Docs For Class SpiralDataBase
以上で構築は終了となります。
動作確認
実際に使ってみるとこのような感じです。
期間を指定してボタンを押すと…
フォーム上に週報が生成されます。
▼ちなみに、私が実際にフォームから登録した内容はこちらです
▼ちなみに、私が実際にフォームから登録した内容はこちらです
範囲外のデータは除外され、こんな雑な記録から立派な週報を作成してくれます。
一度作ってしまえばAIに命令を出す時間すら削減できるので、とってもおススメです!
一度作ってしまえばAIに命令を出す時間すら削減できるので、とってもおススメです!
おわりに
いかがでしたでしょうか。
今回は「いかに楽をして、未来の自分を甘やかすか」という一点に全力を注ぎ、
ローコードと生成AIを組み合わせた週報自動化ツールを構築しました。
数時間で構築できますので、よければ参考にしていただけると幸いです。
このツールが皆様の定時退社への第一歩になれることを願っています。
今回は「いかに楽をして、未来の自分を甘やかすか」という一点に全力を注ぎ、
ローコードと生成AIを組み合わせた週報自動化ツールを構築しました。
数時間で構築できますので、よければ参考にしていただけると幸いです。
このツールが皆様の定時退社への第一歩になれることを願っています。