<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AI開発実践ラボ</title>
	<atom:link href="https://creativecontentlabtokyo.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://creativecontentlabtokyo.com</link>
	<description>AIで、作る力を手に入れる。</description>
	<lastBuildDate>Wed, 09 Sep 2026 09:16:47 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>
	<item>
		<title>システム設計書のテンプレート一覧｜基本設計・詳細設計の成果物とExcelサンプル</title>
		<link>https://creativecontentlabtokyo.com/system-design-document-template-list/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Wed, 09 Sep 2026 08:46:14 +0000</pubDate>
				<category><![CDATA[デリバリーメソッド]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/system-design-document-template-list/</guid>

					<description><![CDATA[設計工程で作る成果物を、画面・帳票・データモデル・処理・外部連携の種類別に一覧化しました。設計書と定義書と仕様書の違い、一覧と設計書の作る順序、Excelテンプレートの入手先までまとめています。]]></description>
										<content:encoded><![CDATA[<p>「基本設計書を作っておいて」と言われて、まず手が止まる。何を、何冊、どの順で作ればいいのかが決まっていないからです。</p>
<p>しかも呼び方が現場ごとに違います。同じものを画面設計書と呼ぶ会社もあれば、画面定義書、画面仕様書と呼ぶ会社もある。前の現場の言葉が通じません。</p>
<p>この記事では、設計工程で作る成果物を<strong>種類別に並べ、それぞれのExcelテンプレートへの入口をまとめました</strong>。どれから手をつけるかの順序もあわせて示します。</p>
<h2 id="設計工程の成果物は一覧と設計書の2階建てになっている">設計工程の成果物は「一覧」と「設計書」の2階建てになっている</h2>
<p>最初に、全体の構造を押さえておきます。設計工程の成果物は、ほぼ例外なく2階建てです。</p>
<table>
<thead>
<tr>
<th>対象</th>
<th>1階：一覧（数と粒度を決める）</th>
<th>2階：設計書（中身を決める）</th>
</tr>
</thead>
<tbody>
<tr>
<td>画面</td>
<td>画面一覧</td>
<td>画面定義書</td>
</tr>
<tr>
<td>帳票</td>
<td>帳票一覧</td>
<td>帳票設計書</td>
</tr>
<tr>
<td>バッチ処理</td>
<td>バッチ処理一覧</td>
<td>バッチ処理設計書</td>
</tr>
<tr>
<td>外部連携</td>
<td>外部インタフェース一覧</td>
<td>外部インタフェース設計書</td>
</tr>
<tr>
<td>プログラム</td>
<td>プログラム一覧</td>
<td>各処理の設計書</td>
</tr>
</tbody>
</table>
<p><strong>一覧で「いくつあるか」を確定させ、設計書で「中身をどうするか」を決めます。</strong></p>
<p>この順序を逆にすると破綻します。画面定義書を先に書き始めると、書いている途中で「この画面、隣のチームが作っている画面と同じでは」という話が出ます。画面IDが採番されていないので、どちらを残すかの判断もできません。手戻りは設計書1冊まるごとになります。</p>
<p>一覧が先である理由はもう1つあります。<strong>見積もりと進捗管理が一覧の行数を単位にしている</strong>からです。画面が38本あると分かって初めて、工数も進捗率も出せます。設計書から書き始めると、終わりが見えないまま進むことになります。</p>
<h2 id="設計書定義書仕様書はほぼ同じものを指している">設計書・定義書・仕様書は、ほぼ同じものを指している</h2>
<p>呼称の違いは、内容の違いではありません。会社と時代の違いです。</p>
<table>
<thead>
<tr>
<th>呼び方</th>
<th>使われ方</th>
</tr>
</thead>
<tbody>
<tr>
<td>〜設計書</td>
<td>最も一般的。「どう作るか」を書いたもの</td>
</tr>
<tr>
<td>〜定義書</td>
<td>項目や値の定義が中心のときに使われやすい</td>
</tr>
<tr>
<td>〜仕様書</td>
<td>発注側・受入側の視点が入るときに使われやすい</td>
</tr>
</tbody>
</table>
<p>厳密に使い分けている現場もありますが、<strong>多くの現場では同じものを違う名前で呼んでいるだけ</strong>です。テンプレートを探すときは、3つとも試してください。</p>
<p>工程の呼び方も同じです。</p>
<table>
<thead>
<tr>
<th>呼び方</th>
<th>同じ意味で使われる語</th>
<th>決めること</th>
</tr>
</thead>
<tbody>
<tr>
<td>基本設計</td>
<td>外部設計</td>
<td>利用者から見える部分。画面・帳票・連携の仕様</td>
</tr>
<tr>
<td>詳細設計</td>
<td>内部設計</td>
<td>中の作り。処理ロジック・データアクセス</td>
</tr>
</tbody>
</table>
<p>ただし実務では、<strong>1つのExcelブックの中に基本設計と詳細設計の両方が入っている</strong>ことがよくあります。処理概要のシートは基本設計、入出力処理設計のシートは詳細設計、というように混在します。工程で分冊しようとすると、かえって管理が煩雑になります。</p>
<h2 id="画面まわりの設計書">画面まわりの設計書</h2>
<p>利用者が直接触る部分です。設計工程で最も分量が多くなります。</p>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/screen-list-excel-template/">画面一覧</a></strong> — 画面IDを採番し、画面の数を確定させます。すべての起点になります</li>
<li><strong><a href="https://creativecontentlabtokyo.com/screen-design-document-excel-template/">画面定義書／画面設計書</a></strong> — 1画面ずつ、レイアウト・画面項目定義・表示条件・入力チェック・入出力処理設計まで書きます</li>
<li><strong><a href="https://creativecontentlabtokyo.com/screen-transition-excel-template/">画面遷移図</a></strong> — 画面同士のつながり。単体では正しく見えても、つないだ瞬間に破綻する経路が見つかります</li>
<li><strong><a href="https://creativecontentlabtokyo.com/basic-design-application-message-difinition-excel-template/">メッセージ設計書</a></strong> — メッセージIDの設定ルールと文言。画面定義書の入力チェックと対になります</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce-select-list-data-type-definition-excel-template/">選択リスト定義書</a></strong> — 選択肢の一覧と値。画面と帳票の両方から参照されます</li>
</ul>
<p>メッセージ設計書は後回しにされがちですが、<strong>分散させると同じ意味の文言が画面ごとに違う</strong>という状態になります。1か所に集めておく価値があります。</p>
<h2 id="帳票まわりの設計書">帳票まわりの設計書</h2>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/form-list-excel-template/">帳票一覧</a></strong> — 帳票の数と出力方式を確定させます</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce-form-design-document-excel-template/">帳票設計書／帳票定義書</a></strong> — 出力項目・レイアウト・出力件数と性能まで</li>
</ul>
<p>帳票で問題になるのは、たいてい<strong>件数</strong>です。レイアウトの議論は進むのに、月末に何万件出るのかが最後まで決まらない。性能問題は本番直前に出ます。一覧の段階で件数の欄を埋めておくと、後半が楽になります。</p>
<h2 id="データモデルまわりの設計書">データモデルまわりの設計書</h2>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/basic-design-object-definition/">データモデル・オブジェクト設計</a></strong> — 概念データモデルから設計に落とす進め方。オブジェクト定義書のテンプレートもここから辿れます</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce_desgin_crud_matrix_excel_sample_template/">CRUD図／CRUDマトリクス表</a></strong> — 機能とデータの関係。どの機能がどのデータを作り、更新し、消すか</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce_basic_design_program_code_difinition_sample_template/">コード設計書／コード定義書</a></strong> — コード体系と値の定義。区分値をどこで持つか</li>
</ul>
<p>CRUD図は省略されることが多い成果物です。ただし**「このデータは誰が作るのか」が誰も答えられない**状態に気づけるのは、この表だけです。作るなら機能×オブジェクトのレベルまでで十分で、項目レベルまで作ると維持できなくなります。</p>
<h2 id="処理バッチまわりの設計書">処理・バッチまわりの設計書</h2>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/program-list-excel-template/">プログラム一覧</a></strong> — 実装対象の数。機能種別ごとの難易度と規模を定義しておくと見積もりに使えます</li>
<li><strong><a href="https://creativecontentlabtokyo.com/apex-batch-process-list-job-schdule-excel-template/">バッチ処理一覧</a></strong> — バッチの数と処理方式</li>
<li><strong><a href="https://creativecontentlabtokyo.com/apex-batch-process-basic-design-excel-template/">バッチ処理設計書</a></strong> — 処理概要・処理フロー図・入出力処理設計</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce-batch-job-time-schedule-template/">ジョブスケジュール</a></strong> — 起動サーバ・サイクル・時刻。バッチ同士の順序と依存</li>
<li><strong><a href="https://creativecontentlabtokyo.com/apex-trigger-detail-process-design-excel-template/">トリガー処理設計書</a></strong> ／ <strong><a href="https://creativecontentlabtokyo.com/salesforce-apex-trigger-program-list-document-template/">トリガー一覧</a></strong> — データ更新をきっかけに動く処理</li>
</ul>
<p>ジョブスケジュールは一覧の一種ですが、<strong>時間軸で見ないと衝突が見つかりません</strong>。処理単体では正しくても、同じ時刻に重い処理が3本走る設計になっていることがあります。</p>
<h2 id="外部連携まわりの設計書">外部連携まわりの設計書</h2>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/external-system-integration-interface-list-excel-template/">外部インタフェース一覧／連携全体図</a></strong> — 連携の数と方向。全体図があると相手先との合意が早くなります</li>
<li><strong><a href="https://creativecontentlabtokyo.com/external-system-interface-design-excel-templete/">外部インタフェース設計書</a></strong> — 処理概要・連携処理フロー・データ移送項目</li>
</ul>
<p>外部連携は<strong>相手がいる</strong>ため、自分たちだけでは決められません。設計工程の中で最初に着手すべき領域です。</p>
<h2 id="どこから手をつけるか">どこから手をつけるか</h2>
<p>順序をまとめると、こうなります。</p>
<ol type="1">
<li><strong><a href="https://creativecontentlabtokyo.com/system-function-chart-sample-template/">システム機能一覧</a></strong> で、作るものの全体像を確定させる</li>
<li><strong>各種の一覧</strong>（画面・帳票・バッチ・外部連携・プログラム）で、数と粒度を決める</li>
<li><strong>外部連携の設計書</strong>から着手する（相手との調整に時間がかかるため）</li>
<li><strong>画面・帳票の設計書</strong>を進める</li>
<li><strong>処理・バッチの設計書</strong>とデータモデルを固める</li>
</ol>
<p>一覧がすべて揃った時点で、<strong>設計工程の残作業が行数で見える</strong>ようになります。ここが引けているかどうかで、後半の進め方が変わります。</p>
<h2 id="テンプレートを埋める作業をどう減らすか">テンプレートを埋める作業をどう減らすか</h2>
<p>テンプレートを配っても、埋める作業は残ります。設計工程で時間を食うのは様式を整えることではなく、<strong>項目を1つずつ書いていく作業</strong>です。</p>
<p>この部分は生成AIにかなりの割合を任せられます。ただし任せられる範囲と、任せてはいけない範囲が分かれます。具体的な手順は別の記事にまとめました。</p>
<ul>
<li><a href="https://creativecontentlabtokyo.com/ai-writes-screen-design-document/">画面定義書をAIに書かせる手順</a></li>
<li><a href="https://creativecontentlabtokyo.com/ai-writes-system-function-list/">機能一覧をAIに作らせる手順</a></li>
</ul>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>設計工程の成果物は**「一覧」と「設計書」の2階建て**。一覧で数と粒度を決め、設計書で中身を決める</li>
<li><strong>順序を逆にすると手戻りが設計書1冊単位</strong>になる。見積もりと進捗も一覧の行数が単位</li>
<li>設計書・定義書・仕様書はほぼ同じもの。<strong>基本設計＝外部設計、詳細設計＝内部設計</strong></li>
<li>1つのExcelブックに基本設計と詳細設計が混在するのは普通。工程で分冊しなくてよい</li>
<li>着手順は<strong>機能一覧 → 各一覧 → 外部連携 → 画面・帳票 → 処理・データモデル</strong></li>
</ul>
<p>テンプレートの埋め方や、プロジェクトに合わせた様式の調整を手を動かしながら身につけたい方は、<a href="https://creativecontentlabtokyo.com/training/">AI開発トレーニング</a>で個別にお伝えしています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>障害の原因分類をAIに整理させる手順｜傾向分析から再発防止までの流れ</title>
		<link>https://creativecontentlabtokyo.com/ai-classifies-defect-root-cause/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 06 Sep 2026 13:56:31 +0000</pubDate>
				<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[原因分析]]></category>
		<category><![CDATA[品質管理]]></category>
		<category><![CDATA[生成AI]]></category>
		<category><![CDATA[障害管理]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-classifies-defect-root-cause/</guid>

					<description><![CDATA[障害管理表は埋まっているのに、そこから何も出てこない。溜まった障害をAIに分類させ、傾向を出して再発防止の打ち手に変えるまでの手順を、任せてはいけない判断まで含めて解説します。]]></description>
										<content:encoded><![CDATA[<p>障害管理表は毎日更新されている。件数も分類も入っている。それなのに、<strong>そこから何も出てこない</strong>。</p>
<p>品質会議で「今週は15件でした」と報告して終わる。傾向を聞かれても答えられない。テストの終盤になって、同じような不具合が繰り返し出ていたことに気づく——。</p>
<p>原因は、記録していないことではありません。<strong>溜めた記録を分析する工程が、誰の仕事にもなっていない</strong>ことです。この工程は手間がかかるわりに、やらなくても表面上は困りません。だから真っ先に省かれます。</p>
<p>ここは生成AIで大きく変わる領域です。<strong>分類と傾向出しはAIに任せ、人は打ち手を決めることに集中できます。</strong></p>
<h2 id="なぜ原因分類は形骸化するのか">なぜ原因分類は形骸化するのか</h2>
<p>形骸化には、はっきりした理由が3つあります。</p>
<p><strong>1. 分類を決めるのが早すぎる</strong> プロジェクト開始時に「こんな分類が必要だろう」と机上で決めます。実際に障害が出始めると当てはまらず、<strong>判断に迷ったものが全部「その他」に流れます</strong>。気づくと半分が「その他」になっています。</p>
<p><strong>2. 登録する人によって基準が違う</strong> 同じ「画面に想定外の値が出る」でも、ある人は「表示不具合」、別の人は「計算誤り」と入れます。<strong>集計しても実態を表さない</strong>ので、誰も見なくなります。</p>
<p><strong>3. 分析する時間が確保されていない</strong> 分類はされていても、集計して傾向を読む人がいません。テスト工程は常に逼迫しているため、この作業は必ず後回しになります。</p>
<p>AIで解けるのは主に1と2です。3は、1と2の手間が減った結果として時間が生まれます。</p>
<h2 id="用意するもの">用意するもの</h2>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>入力</th>
<th>具体例</th>
</tr>
</thead>
<tbody>
<tr>
<td>溜まった障害の記録</td>
<td><a href="https://creativecontentlabtokyo.com/failure-bug-report-template/">障害管理表</a>の現物。事象・原因・対応内容の記述があるもの</td>
</tr>
<tr>
<td>分類の定義</td>
<td>現在使っている選択リスト値の一覧。無ければ手順①で作る</td>
</tr>
<tr>
<td>工程の情報</td>
<td>検出工程と、本来検出すべき工程</td>
</tr>
<tr>
<td>参考の観点</td>
<td><a href="https://creativecontentlabtokyo.com/salesforce-design-develop-test-point-of-review/">設計・開発・テストのレビュー観点</a></td>
</tr>
</tbody>
</table>
<p><strong>重要なのは、事象と原因が文章で書かれていること</strong>です。分類コードだけが入っていて記述が空欄の表は、AIに渡しても何も出てきません。逆に、記述さえあれば分類が雑でも整理できます。</p>
<h2 id="手順">手順</h2>
<h3 id="分類の定義を実際の障害から作り直す">① 分類の定義を、実際の障害から作り直す</h3>
<p>机上で決めた分類を捨て、<strong>実際に起きた障害から帰納して作り直します</strong>。</p>
<p>溜まった障害の事象と原因の記述をまとめて渡し、「この障害群を、原因の性質で5〜8種類に分類する定義を作って」と依頼します。件数が偏らないように、と添えると実用的な粒度になります。</p>
<p>出てきた定義を人が確認し、<strong>現場の言葉に直します</strong>。AIは一般的な用語を使いたがりますが、分類はチーム内で通じることが最優先です。</p>
<p>このとき、<a href="https://creativecontentlabtokyo.com/failure-bug-report-template/">障害管理表の設計そのもの</a>で解説しているとおり、<strong>障害分類（起きた事象の種別）と根本原因（なぜ作り込まれたか）は別の列</strong>として分けておきます。混ぜると、この後の分析が成立しません。</p>
<h3 id="溜まった障害を一括で分類させる">② 溜まった障害を一括で分類させる</h3>
<p>定義が固まったら、既存の全件を分類し直します。<strong>ここは完全に機械的な作業</strong>で、AIに任せて問題ありません。</p>
<p>数十件から数百件を一度に渡すと精度が落ちるので、30〜50件ずつに区切って処理します。出力には<strong>分類の根拠を1行で添えさせる</strong>と、後の確認が一気に楽になります。</p>
<p>判断に迷ったものには印を付けさせます。<strong>印が付いたものは、たいてい記述が曖昧な障害</strong>です。分類の問題ではなく、記録の問題として起票者に確認します。</p>
<h3 id="分類の揺れを検出させる">③ 分類の揺れを検出させる</h3>
<p>分類が終わったら、<strong>AI自身に揺れを探させます</strong>。</p>
<p>「同じような事象なのに違う分類になっているものを挙げて」と依頼するだけです。人が目視で探すのは非現実的ですが、機械的な突き合わせなら確実に見つかります。</p>
<p>揺れが多い分類は、<strong>定義そのものが曖昧</strong>というシグナルです。分類名を変えるか、2つに割るかを検討します。</p>
<h3 id="傾向を出させ打ち手の候補まで書かせる">④ 傾向を出させ、打ち手の候補まで書かせる</h3>
<p>ここが本来やりたかった工程です。</p>
<p>分類済みのデータを渡し、次を出させます。</p>
<ul>
<li>分類ごとの件数と、その推移</li>
<li><strong>検出工程と、本来検出すべき工程のずれ</strong>が大きい分類</li>
<li>特定の機能・担当・工程に偏っているもの</li>
<li>それぞれに対して考えられる打ち手の候補</li>
</ul>
<p>2つ目が特に効きます。<strong>「単体テストで見つけるべきだったものが、結合テストで大量に出ている」</strong>という状態が見えれば、打ち手はテストの強化ではなく、単体テストの観点や完了基準の見直しになります。</p>
<p>テストの消化状況とあわせて見るなら<a href="https://creativecontentlabtokyo.com/salesforce-test-progress-management-template/">テスト進捗管理表</a>、単体テストの中身は<a href="https://creativecontentlabtokyo.com/salesforce-test-process-unit-test-excep-template/">単体テスト仕様書兼結果報告書</a>を突き合わせます。</p>
<h2 id="aiに任せてはいけないこと">AIに任せてはいけないこと</h2>
<p><strong>1. 打ち手を決めること</strong></p>
<p>AIは打ち手の候補を出せますが、<strong>どれを実行するかは決められません</strong>。残っている期間、体制、顧客との関係、他機能への影響——これらを踏まえた判断は、プロジェクトの文脈を持っている人にしかできません。</p>
<p>「テストケースを増やす」は正しく見えますが、期間が残っていなければ実行不能です。実行できない打ち手を掲げるくらいなら、<strong>スコープを削る相談を先にする</strong>ほうが誠実です。</p>
<p><strong>2. 個人の評価に使うこと</strong></p>
<p>「この分類の障害は、特定の担当に偏っている」という分析結果は簡単に出ます。<strong>これを人の評価に使った瞬間に、障害の報告が止まります。</strong></p>
<p>障害が報告されなくなったプロジェクトは、品質が良くなったのではなく、見えなくなっただけです。分析結果は<strong>仕組みの問題として扱う</strong>と決めておきます。偏りが出たなら、レビュー体制か引き継ぎの問題として読みます。</p>
<p><strong>3. 事実の確認を省くこと</strong></p>
<p>分類結果は必ずサンプリングして確認します。<strong>AIは、記述が曖昧な障害を、それらしい分類に入れてしまいます</strong>。全件は無理でも、分類ごとに数件ずつ見れば、大きな誤りは検出できます。</p>
<h2 id="分析結果を打ち手に変える">分析結果を打ち手に変える</h2>
<p>傾向が出たら、<strong>打ち手は3種類に整理する</strong>と実行に移しやすくなります。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>種類</th>
<th>内容</th>
<th>例</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>今すぐ効くもの</strong></td>
<td>現在のテスト工程で対応できる</td>
<td>特定の観点でテストケースを追加する</td>
</tr>
<tr>
<td><strong>横展開するもの</strong></td>
<td>同種の障害が潜んでいる箇所を先回りで点検</td>
<td>同じ設計パターンの機能をまとめて再レビュー</td>
</tr>
<tr>
<td><strong>次から効くもの</strong></td>
<td>工程・基準の見直し</td>
<td>単体テストの完了基準に観点を追加する</td>
</tr>
</tbody>
</table>
<p><strong>2つ目の横展開が、いちばん費用対効果が高い</strong>です。1件の障害から、まだ表面化していない同種の障害を先に潰せます。テストの終盤で同じ不具合が繰り返し出るのは、これをやっていないからです。</p>
<p>打ち手をどう合意し、どう報告するかは<a href="https://creativecontentlabtokyo.com/preparation-of-overall-test-policy-template/">テスト計画書・テスト方針書の書き方</a>にまとめています。レビュー段階で検出した指摘は<a href="https://creativecontentlabtokyo.com/review-note-template/">レビュー指摘表</a>で管理し、実装後に顕在化したものを障害管理表へ引き継ぐと、工程ごとの検出状況が正しく集計できます。</p>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>分類しても傾向が見えない</td>
<td>障害分類と根本原因を1列で扱っている</td>
<td>事象の種別と、なぜ作り込まれたかを分けて持つ</td>
</tr>
<tr>
<td>「その他」が大量に出る</td>
<td>机上で決めた分類のまま</td>
<td>実際の障害から帰納して定義し直す（手順①）</td>
</tr>
<tr>
<td>分類結果が信用できない</td>
<td>記述が空欄の障害が多い</td>
<td>分類の前に、記述を埋める運用を直す</td>
</tr>
<tr>
<td>打ち手が実行されない</td>
<td>実行可能性を検討せずに掲げている</td>
<td>期間と体制を踏まえて3種類に整理する</td>
</tr>
<tr>
<td>報告が上がらなくなった</td>
<td>分析結果を個人の評価に使った</td>
<td>仕組みの問題として扱うと明示し、運用を戻す</td>
</tr>
</tbody>
</table>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>原因分類が形骸化するのは、<strong>分類を決めるのが早すぎる</strong>ことと、<strong>分析する時間が誰の仕事でもない</strong>こと</li>
<li>分類の定義は、<strong>机上で決めず、実際に起きた障害から帰納して作り直す</strong></li>
<li>分類・揺れの検出・傾向出しはAIに任せられる。<strong>数十件ずつ区切り、根拠を1行添えさせる</strong></li>
<li><strong>打ち手を決めること・個人の評価に使うこと・事実確認を省くことは渡さない</strong></li>
<li>打ち手は「今すぐ効く／横展開する／次から効く」の3種類に整理する。<strong>横展開が最も費用対効果が高い</strong></li>
</ul>
<p>分類と集計が自動化されると、品質会議の中身が「件数の報告」から「打ち手の相談」に変わります。もともとそこが目的だったはずです。</p>
<p>実際の進め方を手を動かしながら身につけたい方は、<a href="https://creativecontentlabtokyo.com/training/">AI開発トレーニング</a>で個別にお伝えしています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>機能一覧をAIに作らせる手順｜ヒアリングメモから見積もりの土台を作る</title>
		<link>https://creativecontentlabtokyo.com/ai-writes-system-function-list/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 06 Sep 2026 13:50:56 +0000</pubDate>
				<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[機能一覧]]></category>
		<category><![CDATA[生成AI]]></category>
		<category><![CDATA[要件定義]]></category>
		<category><![CDATA[見積もり]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-writes-system-function-list/</guid>

					<description><![CDATA[業務ヒアリングのメモから機能を洗い出し、粒度を揃えて機能一覧にまとめる手順を解説。難易度づけと工数見積もりへの繋げ方、そしてAIに任せてはいけない判定まで整理しています。]]></description>
										<content:encoded><![CDATA[<p>機能一覧は、要件定義フェーズの成果物のなかで<strong>もっとも後工程に影響する表</strong>です。ここに載らなかった機能は見積もりに入らず、体制にも日程にも反映されません。後から出てくると、たいてい揉めます。</p>
<p>それだけ重要なのに、作り方は属人的です。ヒアリングのメモを眺めながら、経験のある人が頭の中で機能に切り分けている、というのが実態ではないでしょうか。</p>
<p>この作業の<strong>洗い出しと粒度そろえの部分は、生成AIにかなり任せられます</strong>。一方で、<strong>任せると見積もりが壊れる判定</strong>もはっきり存在します。この記事では、その境界線を含めて手順をまとめます。</p>
<h2 id="機能一覧とは見積もりの土台になる表">機能一覧とは｜見積もりの土台になる表</h2>
<p>機能一覧（システム機能一覧）とは、<strong>構築するシステムの機能をすべて並べ、それぞれをどう実現するかまで定義した一覧表</strong>です。単なる機能の目録ではありません。</p>
<p>一覧に持たせる列は、おおむね次のようになります。</p>
<table>
<thead>
<tr>
<th>列</th>
<th>何を書くか</th>
</tr>
</thead>
<tbody>
<tr>
<td>機能ID</td>
<td>一意に特定するための採番</td>
</tr>
<tr>
<td>機能名／機能概要</td>
<td>何をする機能か</td>
</tr>
<tr>
<td>業務分類（大・中・小）</td>
<td>どの業務に属するか</td>
</tr>
<tr>
<td>機能分類</td>
<td>画面・帳票・バッチなどの種別</td>
</tr>
<tr>
<td>実現方法</td>
<td>標準機能の設定か、開発か。具体的にどう実現するか</td>
</tr>
<tr>
<td><strong>難易度</strong></td>
<td><strong>工数見積もりのための区分</strong></td>
</tr>
<tr>
<td>備考</td>
<td>制約事項・前提</td>
</tr>
</tbody>
</table>
<p><strong>この表が「目録」ではなく「見積もりの土台」になるのは、実現方法と難易度の2列があるから</strong>です。この2列が無い機能一覧は、後工程で作り直しになります。</p>
<p>様式は<a href="https://creativecontentlabtokyo.com/system-function-chart-sample-template/">システム機能一覧のテンプレート</a>をそのまま使えます。</p>
<h2 id="用意するもの">用意するもの</h2>
<p>機能一覧は、ゼロから発明するものではありません。<strong>必ず元になる情報があります。</strong></p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>入力</th>
<th>具体例</th>
</tr>
</thead>
<tbody>
<tr>
<td>業務ヒアリングの記録</td>
<td><a href="https://creativecontentlabtokyo.com/hearing-sheet-template/">業務ヒアリングシート</a>の記入結果、議事録</td>
</tr>
<tr>
<td>業務の全体像</td>
<td><a href="https://creativecontentlabtokyo.com/business-function-matrix-excel-template/">業務機能階層図</a>、<a href="https://creativecontentlabtokyo.com/organization-business-structure-difinition-template/">組織図・業務体系図</a></td>
</tr>
<tr>
<td>現行システムの資産</td>
<td>既存の画面・帳票・バッチの一覧</td>
</tr>
<tr>
<td>要求の記録</td>
<td><a href="https://creativecontentlabtokyo.com/requirement_management_template/">要求仕様管理一覧</a></td>
</tr>
<tr>
<td>記入先の様式</td>
<td>使う機能一覧テンプレートの見出し行</td>
</tr>
</tbody>
</table>
<p>このうち<strong>現行システムの画面・帳票・バッチ一覧は、あるなら必ず入れてください</strong>。移行案件では、機能の8割がここから導けます。逆にこれを渡さないと、AIは一般的な業務システムの機能を創作します。</p>
<h2 id="手順">手順</h2>
<h3 id="ヒアリングメモから機能候補を洗い出させる">① ヒアリングメモから機能候補を洗い出させる</h3>
<p>まず、量を出します。<strong>この段階で絞らない</strong>のがコツです。</p>
<p>ヒアリング記録と業務の全体像を渡し、「この業務を実現するために必要なシステム機能を、抜けなく挙げて」と依頼します。重複や粒度のばらつきは、この時点では気にしません。</p>
<p>人が最初から整った一覧を作ろうとすると、<strong>思いつかなかった機能がそのまま抜けます</strong>。AIに大量に出させてから削るほうが、抜けが減ります。</p>
<h3 id="粒度を揃える">② 粒度を揃える</h3>
<p>ここが機能一覧づくりの本丸です。洗い出した候補は、粒度がばらばらになっています。</p>
<p>粒度の基準は、<strong>「見積もれる単位か」</strong>で決めます。</p>
<ul>
<li><strong>粗すぎる</strong>（例：「受注管理」）→ 何人日かかるか誰にも答えられない</li>
<li><strong>細かすぎる</strong>（例：「受注画面の得意先コード入力欄」）→ 一覧が数百行になり、管理そのものが目的化する</li>
<li><strong>ちょうどよい</strong>（例：「受注登録画面」「受注一覧照会画面」「受注確定バッチ」）</li>
</ul>
<p>実務的には<strong>1機能＝1画面／1帳票／1バッチ</strong>を基準にすると、ほぼ破綻しません。「この機能は何画面ぶんか」と問い返せる状態になっていれば、粒度は足りています。</p>
<p>AIには、基準を明示して揃え直させます。「1機能＝1画面・1帳票・1バッチの単位に分割・統合して」と指示すれば、機械的に整います。</p>
<h3 id="機能分類と業務分類を振らせる">③ 機能分類と業務分類を振らせる</h3>
<p>粒度が揃ったら、画面・帳票・バッチの分類と、業務分類（大・中・小）を振ります。<strong>この作業は完全に機械的</strong>なので、そのまま任せて構いません。</p>
<p>業務分類は後で並び替えと集計に使います。ここが揃っていないと、「業務ごとに何機能あるか」が出せず、体制の検討に使えません。</p>
<h3 id="重複と抜けを突き合わせさせる">④ 重複と抜けを突き合わせさせる</h3>
<p>一覧ができたら、<strong>AIに自分の出力を検査させます</strong>。</p>
<ul>
<li>名前は違うが実質同じ機能になっていないか</li>
<li>登録があるのに照会・修正・削除が抜けていないか</li>
<li>帳票を出す機能はあるのに、出力対象データを作る機能が無い、といった不整合はないか</li>
</ul>
<p><strong>登録はあるが一覧照会が抜けている</strong>——これは実際によくある抜けです。人が作った一覧でも頻繁に起きます。機械的な突き合わせは、AIが人より確実に見つけます。</p>
<p>現行システムの一覧があるなら、それとも突き合わせます。「現行にあって新機能一覧に無いもの」を出させると、移行漏れが一度に洗えます。</p>
<h2 id="標準機能で足りるかの判定はaiに任せない">標準機能で足りるかの判定は、AIに任せない</h2>
<p>ここが最も重要な線引きです。</p>
<p>「この機能は、パッケージやプラットフォームの標準設定で実現できるか。それとも開発が必要か」——<strong>この判定をAIに任せると、見積もりが根本から狂います。</strong></p>
<p>理由は3つあります。</p>
<p><strong>1. 製品のバージョンと契約内容に依存する</strong> 同じ機能でも、エディションやライセンス、有効化されているオプションによって、標準で足りるかどうかが変わります。AIは一般論で答えます。</p>
<p><strong>2. 「できる」と「実用に耐える」は違う</strong> 標準機能で形は作れても、件数や同時実行数の条件で使い物にならない、というケースは頻繁にあります。この判断には実際の運用条件が要ります。</p>
<p><strong>3. 間違えたときの損害が大きい</strong> 「標準で足りる」と誤判定した機能は、見積もりから開発工数が抜け落ちます。<strong>設計フェーズの終盤で発覚し、そのまま赤字要因になります。</strong></p>
<p>したがって、実現方法の列は<strong>候補を挙げさせるところまでをAI、判定は人</strong>が持ちます。「標準で実現する場合の方法と、開発する場合の方法を両方挙げて」と依頼し、どちらを採るかは自分で決めます。</p>
<h2 id="難易度と工数見積もりへの繋げ方">難易度と工数見積もりへの繋げ方</h2>
<p>難易度の列は、機能一覧が見積もりに繋がる要です。</p>
<p>難易度は<strong>絶対的な基準ではなく、自社の基準に揃える</strong>ものです。「高・中・低」でも「1〜5」でも構いませんが、<strong>それぞれが何人日相当かを先に決めておきます</strong>。決めずに難易度だけ振っても、合計が出せません。</p>
<p>AIの使い方としては、<strong>基準を渡してから一括で振らせる</strong>のが有効です。</p>
<blockquote>
<p>難易度の定義（低＝◯人日、中＝◯人日、高＝◯人日）を渡したうえで、 「この定義に照らして、各機能の難易度を振って。判断に迷ったものは印を付けて」</p>
</blockquote>
<p><strong>迷ったものに印を付けさせる</strong>のが要点です。全件を人がレビューするのは大変ですが、印の付いたものだけなら現実的に見られます。そして、迷いが出るのはたいてい<strong>要件が固まっていない機能</strong>です。難易度づけは、要件の曖昧さを炙り出す工程でもあります。</p>
<p>標準機能で足りるかの判定結果は、<a href="https://creativecontentlabtokyo.com/system-requirement-fit-gap-analysis-results/">FIT&amp;GAP分析一覧</a>と揃えておくと、後の要件確定がスムーズになります。</p>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>一般的な業務システムの機能が並ぶ</td>
<td>ヒアリング記録を渡していない</td>
<td>議事録やヒアリングシートの実物を渡す</td>
</tr>
<tr>
<td>粒度がばらばらのまま</td>
<td>基準を示していない</td>
<td>「1機能＝1画面・1帳票・1バッチ」と明示する</td>
</tr>
<tr>
<td>数百行になって管理できない</td>
<td>細かく出しすぎ</td>
<td>画面の項目レベルまで割らない。そこは設計書の仕事</td>
</tr>
<tr>
<td>難易度の合計が現実離れする</td>
<td>難易度の定義を渡していない</td>
<td>何人日相当かを先に決めて渡す</td>
</tr>
<tr>
<td>移行漏れが後で出る</td>
<td>現行の資産一覧と突き合わせていない</td>
<td>手順④で必ず突き合わせる</td>
</tr>
</tbody>
</table>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>機能一覧は目録ではなく、<strong>実現方法と難易度の2列があって初めて見積もりの土台になる</strong></li>
<li><strong>洗い出しは絞らず量を出す。</strong> 人が最初から整えようとすると、思いつかなかった機能が抜ける</li>
<li>粒度は<strong>1機能＝1画面・1帳票・1バッチ</strong>を基準にすると破綻しにくい</li>
<li><strong>標準機能で足りるかの判定は人が持つ。</strong> 誤判定は見積もりから工数が抜け落ち、そのまま赤字要因になる</li>
<li>難易度は<strong>定義を先に決めてから振らせ、迷ったものに印を付けさせる</strong>。印はそのまま要件の曖昧さを示す</li>
</ul>
<p>洗い出しと整形をAIに任せられるようになると、空いた時間を<strong>実現方法の判定と、要件の詰め</strong>に回せます。機能一覧の精度を決めているのは、もともとそちらです。</p>
<p>進め方を実際に手を動かしながら身につけたい方は、<a href="https://creativecontentlabtokyo.com/training/">AI開発トレーニング</a>で個別にお伝えしています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>画面定義書をAIに書かせる手順｜要件メモから設計書を作る流れと限界</title>
		<link>https://creativecontentlabtokyo.com/ai-writes-screen-design-document/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 06 Sep 2026 12:37:48 +0000</pubDate>
				<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[基本設計]]></category>
		<category><![CDATA[生成AI]]></category>
		<category><![CDATA[画面設計]]></category>
		<category><![CDATA[設計書]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-writes-screen-design-document/</guid>

					<description><![CDATA[テンプレートは手に入れたのに中身が埋まらない。要件メモから画面定義書の項目定義・入力チェック・表示条件をAIに起こさせる手順を、任せてはいけない範囲まで含めて解説します。]]></description>
										<content:encoded><![CDATA[<p>テンプレートはダウンロードした。でも、真っ白なシートを前にして止まっている。</p>
<p>設計書づくりでいちばん時間を食うのは、様式を整えることではありません。<strong>項目を1つずつ埋めていく作業</strong>です。画面定義書なら、項目名・型・桁数・必須有無・初期値・入力チェック・表示条件を、画面の数だけ書くことになります。</p>
<p>この部分は、生成AIにかなりの割合を任せられます。ただし<strong>任せられる範囲と、任せてはいけない範囲がはっきり分かれます</strong>。この記事では、要件メモから画面定義書を起こす具体的な手順と、その境界線をまとめます。</p>
<h2 id="なぜ設計書はaiと相性がいいのか">なぜ設計書はAIと相性がいいのか</h2>
<p>設計書の記述には、<strong>元になる情報が必ずどこかに存在している</strong>という特徴があります。</p>
<p>業務のヒアリングメモ、既存システムの画面、Excelの管理台帳、あるいは口頭で決まった仕様のチャット履歴。設計書を書く作業の大部分は、<strong>ゼロから発明することではなく、散らばっている情報を決まった形式に整えること</strong>です。</p>
<p>そして「散らばった情報を、決まった形式に整える」は、生成AIが最も得意とする作業です。</p>
<p>逆に言えば、<strong>元になる情報が無い状態でAIに投げても、それらしい嘘が返ってくるだけ</strong>です。ここが最初の分岐点になります。</p>
<h2 id="用意するもの">用意するもの</h2>
<p>手順に入る前に、入力を揃えます。ここが揃っていないと、後の工程がすべて空回りします。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>入力</th>
<th>具体例</th>
<th>無いとどうなるか</th>
</tr>
</thead>
<tbody>
<tr>
<td>業務の説明</td>
<td>誰が、いつ、何のためにこの画面を使うか</td>
<td>項目の要否を判断できない</td>
</tr>
<tr>
<td>扱うデータ</td>
<td>項目名の一覧、既存台帳のヘッダー行</td>
<td>項目が創作される</td>
</tr>
<tr>
<td>画面のたたき台</td>
<td>手描きのラフ、既存画面のキャプチャ</td>
<td>レイアウトが一般論になる</td>
</tr>
<tr>
<td>記入先の様式</td>
<td>使う設計書テンプレートの見出し行</td>
<td>出力形式が毎回変わる</td>
</tr>
</tbody>
</table>
<p>4つ目が意外と重要です。<strong>出力先の様式を先に見せておくと、そのまま貼り付けられる形で返ってきます。</strong> 様式を渡さずに書かせると、整形し直す手間が発生し、時短になりません。</p>
<p>様式は<a href="https://creativecontentlabtokyo.com/screen-design-document-excel-template/">画面定義書のテンプレート</a>をそのまま使えます。</p>
<h2 id="手順">手順</h2>
<h3 id="項目定義を起こさせる">① 項目定義を起こさせる</h3>
<p>最初に作るのは項目定義です。画面に載せる項目を、型・桁数・必須有無・初期値まで含めて一覧にします。</p>
<p>このとき、<strong>業務の説明と扱うデータを一緒に渡す</strong>のが要点です。項目名だけを渡すと、型や桁数は一般的な値で埋められます。「この項目は何のために存在するのか」が分かっていれば、AIは適切な型を選べます。</p>
<p>出てきた一覧は、そのまま採用せず<strong>次の3点だけを人が確認</strong>します。</p>
<ul>
<li><strong>桁数</strong>：業務上の最大値を反映しているか（AIは無難な値を置きたがります）</li>
<li><strong>必須有無</strong>：運用上、空で登録される場面が本当に無いか</li>
<li><strong>初期値</strong>：登録時と更新時で挙動が変わらないか</li>
</ul>
<h3 id="入力チェックと表示条件を詰める">② 入力チェックと表示条件を詰める</h3>
<p>項目が固まったら、チェック仕様と表示条件を書かせます。ここはAIが得意な領域です。</p>
<p>「この項目とこの項目は、どちらか一方が必須」「この区分のときだけ表示する」といった<strong>条件の網羅</strong>は、人が手で書くと必ず漏れます。AIに一度洗い出させてから、不要なものを削るほうが速く、そして漏れません。</p>
<p><strong>足し算より引き算にするのがコツ</strong>です。「考えられるチェックを全部挙げて」と依頼し、そこから落としていきます。</p>
<p>画面に出すメッセージの文言と、選択リストの値は、それぞれ別の資料に切り出しておくと後の変更が楽になります。</p>
<ul>
<li><a href="https://creativecontentlabtokyo.com/basic-design-application-message-difinition-excel-template/">メッセージ設計書のテンプレート</a></li>
<li><a href="https://creativecontentlabtokyo.com/salesforce-select-list-data-type-definition-excel-template/">選択リスト定義書のテンプレート</a></li>
</ul>
<h3 id="画面間の整合を取る">③ 画面間の整合を取る</h3>
<p>1画面ずつ作っていくと、<strong>画面をまたいだところで必ず矛盾が出ます</strong>。同じデータなのに画面Aでは必須、画面Bでは任意。同じ項目名なのに桁数が違う。</p>
<p>ここでのAIの使い方は、書かせることではなく<strong>突き合わせさせること</strong>です。作成済みの複数画面の項目定義をまとめて渡し、「同じ項目で定義が食い違っているものを挙げて」と聞きます。</p>
<p>この用途は、人がやると見落とすがAIは見落とさない、という典型例です。画面全体の構成は<a href="https://creativecontentlabtokyo.com/screen-list-excel-template/">画面一覧</a>、遷移の流れは<a href="https://creativecontentlabtokyo.com/screen-transition-excel-template/">画面遷移図</a>で管理し、そちらとも突き合わせます。</p>
<h3 id="レビュー観点で自己点検させる">④ レビュー観点で自己点検させる</h3>
<p>提出前に、<strong>レビューする側の視点で自分の成果物を点検させます</strong>。</p>
<p>「この設計書をレビューする立場で、指摘すべき点を挙げて」と依頼するだけです。実際のレビューで出る指摘の何割かは、この時点で潰せます。</p>
<p>観点を明示的に渡すと精度が上がります。何を見るべきかは<a href="https://creativecontentlabtokyo.com/salesforce-design-develop-test-point-of-review/">設計・開発・テストのレビュー観点</a>にまとめています。</p>
<h2 id="aiに任せてはいけないところ">AIに任せてはいけないところ</h2>
<p>ここが本題です。<strong>次の3つを渡すと、成果物の価値そのものが失われます。</strong></p>
<h3 id="業務上の判断">1. 業務上の判断</h3>
<p>「この項目は必須にすべきか」は、技術の問題ではなく<strong>業務の問題</strong>です。必須にすれば入力漏れは防げますが、現場が値を持っていない場面があれば運用が止まります。</p>
<p>AIはこの判断を「一般的にはこうです」で埋めてきます。もっともらしく見えるので、そのまま通ってしまうのがいちばん危険です。</p>
<h3 id="決まっていないことを決めること">2. 決まっていないことを決めること</h3>
<p>仕様が固まっていない箇所をAIに投げると、<strong>決まっていないという事実が消えます</strong>。何かが書かれた設計書は「決まったもの」として下流に流れ、実装され、テストで初めて食い違いが露見します。</p>
<p>未決事項は未決事項として残すのが正解です。空欄のままにする、あるいは「要確認」と明記して、決める場に持ち込みます。</p>
<h3 id="最終的な事実確認">3. 最終的な事実確認</h3>
<p>出力された内容が、実際のデータや既存システムの挙動と一致しているか。ここは必ず現物で確認します。</p>
<p><strong>AIは、それらしい嘘を、正しい文章と同じ自信で書きます。</strong> 設計書は下流の全工程の前提になるため、誤りが1つ紛れ込むと、実装とテストの両方をやり直すことになります。</p>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>項目が創作される</td>
<td>元になるデータを渡していない</td>
<td>既存台帳のヘッダー行など、実物を渡す</td>
</tr>
<tr>
<td>出力形式が毎回変わる</td>
<td>様式を見せていない</td>
<td>テンプレートの見出し行を先に渡す</td>
</tr>
<tr>
<td>一般論しか返ってこない</td>
<td>業務の説明が抜けている</td>
<td>誰がいつ何のために使う画面かを書く</td>
</tr>
<tr>
<td>整形し直す手間が大きい</td>
<td>一度に多くを書かせすぎ</td>
<td>1画面ずつ、項目定義→チェック→表示条件の順に分ける</td>
</tr>
<tr>
<td>レビューで大量に指摘される</td>
<td>手順④を飛ばしている</td>
<td>提出前に観点を渡して自己点検させる</td>
</tr>
</tbody>
</table>
<p>いちばん多いのは1番目です。<strong>入力の質が、そのまま出力の質になります。</strong></p>
<h2 id="この作業で何が変わるか">この作業で何が変わるか</h2>
<p>正直に書くと、<strong>AIを使っても設計書づくりが一瞬で終わるわけではありません</strong>。</p>
<p>変わるのは、時間の使い道です。項目を1つずつ書き写す作業と、様式を整える作業がほぼ無くなります。その分を、<strong>業務上の判断と、未決事項を決める場づくり</strong>に回せます。</p>
<p>設計書の品質を決めているのは、もともと後者です。前者に時間を取られて後者が薄くなっていたのが、多くのプロジェクトの実態でした。そこが入れ替わるというのが、この作業のいちばん大きな効果だと考えています。</p>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>設計書は<strong>元になる情報が必ず存在する</strong>ため、生成AIと相性がよい</li>
<li>入力を4つ揃える。<strong>出力先の様式を先に渡す</strong>と、貼り付けられる形で返ってくる</li>
<li>手順は<strong>項目定義 → チェックと表示条件 → 画面間の整合 → 自己点検</strong>の4ステップ</li>
<li><strong>業務上の判断・未決事項の決定・事実確認は人が持つ。</strong> ここを渡すと成果物の価値が消える</li>
<li>変わるのは総時間より<strong>時間の使い道</strong>。書き写す作業が減り、決める作業に回せる</li>
</ul>
<p>実際にどう指示を組み立てるか、どこまで一度に投げるかは、扱うシステムや体制によって変わります。手を動かしながら身につけたい方は、<a href="https://creativecontentlabtokyo.com/training/">AI開発トレーニング</a>で個別にお伝えしています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>私たちがプレミアムテンプレートを作った理由｜Premium Document Templates の設計思想</title>
		<link>https://creativecontentlabtokyo.com/why-we-built-premium-templates/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 19 Jul 2026 15:16:32 +0000</pubDate>
				<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[PMBOK]]></category>
		<category><![CDATA[デザインシステム]]></category>
		<category><![CDATA[ドキュメントテンプレート]]></category>
		<category><![CDATA[資料作成]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/why-we-built-premium-templates/</guid>

					<description><![CDATA[多くの方にご活用いただいている無料テンプレート。そこに寄せられた3つのご要望から、Premium Document Templates は生まれました。]]></description>
										<content:encoded><![CDATA[<p>「なぜ、わざわざ有料版を作ったのか」——Premium Document Templates の Behind The Scenes として、その全体像をここに記します。</p>
<p>私たちが公開してきた無料ドキュメントテンプレートは、ありがたいことに多くの方に継続的にご活用いただいています。プロジェクト計画書、要件定義書、テスト進捗管理表——IT導入プロジェクトの現場で実際に使う成果物を、工程別に揃えたシリーズです。</p>
<p>うれしい反響をいただくなかで、次第にはっきりしてきたことがありました。<strong>「ここまでできるなら、もう一歩先まで面倒を見てほしい」というご要望</strong>です。</p>
<p>この記事では、そのご要望の中身と、<a href="/templates/premium/">Premium Document Templates</a> をゼロから設計し直すに至った思想を公開します。</p>
<p>なお、無料テンプレートは今も<a href="/templates/">こちら</a>で公開しています。実物を見てから読み進めていただいても構いません。</p>
<h2 id="利用者から寄せられた3つのご要望">利用者から寄せられた、3つのご要望</h2>
<p>反響のなかで繰り返し届いたご要望は、驚くほど共通していました。そしてそのすべてが、<strong>テンプレートというファイルの「外側」に関する話</strong>でした。</p>
<h3 id="ご要望1-何を書くかの指針もほしい">ご要望1: 「何を書くか」の指針もほしい</h3>
<p>最も多かったのがこれです。「スコープ」という枠があっても、そこに何をどの粒度で書けば決裁が通るのか——その判断は、書き手の経験に委ねられます。</p>
<p>「枠は完璧なので、あとは書き方の勘所も一緒に教えてほしい」。裏を返せば、<strong>テンプレートは枠を提供するだけでなく、思考の順序まで導けるはず</strong>というご期待でした。</p>
<h3 id="ご要望2-自社カラーへの反映をもっと速く">ご要望2: 自社カラーへの反映をもっと速く</h3>
<p>「そのまま使っても十分だが、自社のブランドカラーに揃えて提出したい」という声も多くいただきました。</p>
<p>ところが一般的なPPTXは、表紙・章扉・ガント・KPIチャートで色指定が個別になっているため、統一に手間がかかります。<strong>体裁の調整に使う時間を、リスクや体制の検討に回したい</strong>。まっとうなご要望です。</p>
<h3 id="ご要望3-作った後の更新まで楽にしたい">ご要望3: 作った後の更新まで楽にしたい</h3>
<p>そして最も本質的だったのがこれです。計画書は生き物で、スケジュールもリスクも週単位で変わります。</p>
<p>「初版を作るのは速くなった。次は<strong>更新のほうを軽くしてほしい</strong>」。テンプレートの価値を、作成時点だけでなく運用フェーズまで広げてほしいというご要望でした。</p>
<figure class="wp-block-image size-large">
<img src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/template-requests-three-points-1.png" alt="利用者から寄せられた3つのご要望とプレミアム版での回答を示した構成図" class="wp-image-5937" width="1000" height="545" loading="lazy" decoding="async" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/template-requests-three-points-1.png 2000w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/template-requests-three-points-1-300x164.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/template-requests-three-points-1-1024x558.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/template-requests-three-points-1-768x419.png 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/template-requests-three-points-1-1536x837.png 1536w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption class="wp-element-caption">
利用者から寄せられた3つのご要望とプレミアム版での回答を示した構成図<br />
</figcaption></figure>
<h2 id="転換点テンプレートをファイルから仕組みへ">転換点：テンプレートを「ファイル」から「仕組み」へ</h2>
<p>3つのご要望に共通していたのは、<strong>ファイルを1枚渡すだけでは応えきれない</strong>という点でした。より綺麗なファイルを作っても、書き方の指針も、体裁の統一も、更新の軽さも生まれません。</p>
<p>そこで発想を変えました。</p>
<p><strong>完成品のファイルを配るのではなく、成果物を生成するスキルと、その出力先となるテンプレートをセットで届ける。</strong></p>
<p>プレミアムテンプレートは、この転換から生まれています。まず「何を届けるのか」を具体的に説明し、そのあとに設計を支える3つの原則を書きます。</p>
<h2 id="届けるものの中身生成スキル-テンプレート">届けるものの中身：生成スキル + テンプレート</h2>
<p>「仕組み」と書くと抽象的なので、具体的に何をお渡しするのかを書きます。セットは2つの要素で構成されています。</p>
<p><strong>1. 生成スキル</strong></p>
<p>対話しながら必要な情報を引き出し、成果物を出力するスキルです。データを渡せば、体裁の整った成果物がそのまま出てきます。書式の調整も、図の貼り付けも、こちらの仕事です。</p>
<p><strong>2. 出力テンプレート</strong></p>
<p>スキルが出力する先の型です。3テーマの配色・タイポグラフィ・レイアウトで統制済みなので、どのプロジェクトで生成しても品質がぶれません。</p>
<figure class="wp-block-image size-large">
<img src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-skill-template-set-1.png" alt="生成スキルと出力テンプレートのセット構成と、3テーマでの出力を示した図" class="wp-image-5938" width="1000" height="455" loading="lazy" decoding="async" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-skill-template-set-1.png 2000w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-skill-template-set-1-300x137.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-skill-template-set-1-1024x466.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-skill-template-set-1-768x349.png 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-skill-template-set-1-1536x699.png 1536w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption class="wp-element-caption">
生成スキルと出力テンプレートのセット構成と、3テーマでの出力を示した図<br />
</figcaption></figure>
<h3 id="実例lwc画面定義書は23シート構成">実例：LWC画面定義書は23シート構成</h3>
<p>たとえばSalesforceのLWC画面設計書を生成するスキルは、<strong>23シート構成の画面定義書</strong>を出力します。</p>
<p>目次と読み方ガイドに加え、画面概要、LWC構成、コンポーネント公開設定、datatable列定義、DTO・Apex仕様、画面レイアウト、画面項目定義、入力チェック、表示条件、画面入出力処理設計、オブジェクト・SOQL、選択リスト値、メッセージ一覧、権限・FLS、画面遷移、シーケンス・状態遷移、非機能要件、テスト設計、未決事項——実装とレビューに必要な観点を網羅しています。</p>
<p>画面遷移図・シーケンス図・状態遷移図はソースから生成してExcelに貼り込み、実画面のスクリーンショットも自動でキャプチャして配置します。<strong>レビュアがシートを往復しなくても、開いた1枚で意味が通る</strong>ことを設計基準にしました。</p>
<p>もちろんこれも Navy / Graphite / Bordeaux の3テーマで出力できます。スライドもExcelも、同じ配色体系の上に載っています。</p>
<h2 id="設計思想1pmbok第7版に準拠したプロジェクト計画書の構成">設計思想1：PMBOK第7版に準拠したプロジェクト計画書の構成</h2>
<p>プロジェクト計画書テンプレートの全10スライドは、PMBOK第7版とIPA共通フレーム2013の考え方に沿って構成しました。表紙、エグゼクティブサマリー、スコープ、体制、マスタスケジュール、リスク管理、品質管理、コミュニケーション計画、変更管理、クロージング。</p>
<p>重要なのは<strong>順番</strong>です。決裁者が読む順序と、書き手が考える順序を一致させています。スコープが固まってから体制、体制が決まってからスケジュール。現場で有効だった思考の順序を、構造そのものに埋め込みました。</p>
<p>さらに各スライドには「書くべきこと」を明記しています。たとえばスコープなら「やること」だけでなく「<strong>やらないこと</strong>」まで書けるようにする。ここを押さえておくと、後工程の合意形成が驚くほどスムーズになります。</p>
<p>この「やらないことを明記する」という一項目は、私自身が20年以上のプロジェクトで最も多くの手戻りを見てきた場所です。スコープの穴は、要件定義ではなく受入テストのタイミングで牙をむく。だからテンプレートの側で先に問うことにしました。</p>
<p>枠を埋めていけば、自然と論理が通る。これがご要望1への回答です。</p>
<h2 id="設計思想2資料デザインをシステム化し配色を統一する">設計思想2：資料デザインをシステム化し、配色を統一する</h2>
<p>色・フォント・余白を、スライド単位ではなくシステム単位で定義しました。</p>
<ul>
<li><strong>カラー</strong>: テーマごとにベース色・アクセント色・共通のシャンパンゴールドを定義し、全スライドで同一トークンを参照</li>
<li><strong>タイポグラフィ</strong>: Noto Sans JPに統一。和文プロポーショナル詰めまで指定</li>
<li><strong>レイアウト</strong>: 表紙・章扉・本文・図表の4パターンに集約し、例外を作らない</li>
</ul>
<p>たとえば戦略・経営層向けの「Executive Navy」はディープネイビー #003A70 を主役に、スカイブルー #00A3E0 をデータ可視化とCTAの誘導色として使い分けています。</p>
<p>色を「なんとなく綺麗だから」ではなく、<strong>役割で決める</strong>。この設計により、カラートークンを差し替えるだけで全スライドに反映されます。外資コンサル品質を、センスではなく再現性のあるものにする条件でした。ご要望2への回答です。</p>
<figure class="wp-block-image size-large">
<img src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-template-design-system-1.png" alt="カラー・タイポグラフィ・レイアウトを統合したデザインシステムの構成図" class="wp-image-5939" width="1000" height="545" loading="lazy" decoding="async" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-template-design-system-1.png 2000w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-template-design-system-1-300x164.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-template-design-system-1-1024x558.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-template-design-system-1-768x419.png 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/07/premium-template-design-system-1-1536x837.png 1536w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption class="wp-element-caption">
カラー・タイポグラフィ・レイアウトを統合したデザインシステムの構成図<br />
</figcaption></figure>
<h2 id="設計思想3ai駆動でドキュメントを自動生成し更新を軽くする">設計思想3：AI駆動でドキュメントを自動生成し、更新を軽くする</h2>
<p>最後がご要望3への回答です。テンプレートをAI駆動開発の仕組みと接続し、プロジェクト情報を渡すだけで表紙から章扉、ガントチャート、KPIチャートまでを生成できるようにしました。</p>
<p>この方式の価値は、生成が速いことだけではありません。<strong>更新が軽いこと</strong>です。</p>
<p>スケジュールが変われば、変更後のデータを渡し直すだけで資料が最新化される。計画書が、作って終わりの成果物ではなく、プロジェクトと一緒に動く資産になります。</p>
<p>そしてこの仕組みに乗せられるのは、計画書だけではありません。設計書も、進捗報告資料も、同じ設計思想の上に載ります。<strong>成果物の種類が増えても、品質を担保する仕組みは1つで済む</strong>——ここが、単体のテンプレートでは到達できない領域です。</p>
<p>なお、この「データを渡せば資料が生成される仕組み」は、特別なシステムを買わなくても構築できます。一度作ってしまえば、計画書も報告書も議事録も同じ仕組みに乗せられる。資料作成という業務そのものが変わります。</p>
<p>実際に私が構築した手順そのものを、1on1のトレーニングでお伝えしています。</p>
<p>▼ <a href="/training/">AI開発トレーニングで、この仕組みの作り方を学ぶ</a></p>
<h2 id="なぜ3テーマなのか資料の配色が読み手に与える印象">なぜ3テーマなのか｜資料の配色が読み手に与える印象</h2>
<p>もうひとつ、よくいただく質問に答えておきます。なぜ単一テーマではなく3つ用意したのか。</p>
<p>資料の色は、<strong>読み手に与える印象を決める言語</strong>だからです。同じ内容でも、戦略提案と、老舗企業向けの報告と、ラグジュアリーブランドの企画では、適した色が違います。</p>
<ul>
<li><strong>Executive Navy</strong> — 戦略・経営。知性と正統性を象徴する深い青</li>
<li><strong>Executive Graphite</strong> — 落ち着いた信頼感。業種を選ばない中庸なトーン</li>
<li><strong>Vintage Bordeaux</strong> — 伝統・ラグジュアリー。重みと格を伝える深紅</li>
</ul>
<p>3テーマとも共通のシャンパンゴールドをアクセントに持たせ、ブランドファミリーとしての一貫性を保っています。テーマを変えても、品質の水準は変わりません。</p>
<p>▼ <a href="/templates/premium/">3テーマの全スライド（各10枚）を実物で確認する</a></p>
<h2 id="今後のラインナップ">今後のラインナップ</h2>
<p>同じ設計思想で、成果物の種類を順次広げていく予定です。</p>
<ul>
<li><strong>プロジェクト計画書</strong> — PMBOK第7版準拠の10スライド構成</li>
<li><strong>進捗報告資料</strong> — 週次・月次のステータスレポート</li>
<li><strong>設計書</strong> — LWC画面定義書をはじめとする詳細設計ドキュメント</li>
</ul>
<p>いずれも生成スキルと出力テンプレートのセットでの提供を予定しています。提供時期や詳細については、<a href="/contact/">お問い合わせ</a>いただければ個別にご案内します。</p>
<h2 id="この記事を書いた人">この記事を書いた人</h2>
<p>IT業界20年以上、Salesforce を中心としたシステム導入プロジェクトで要件定義からPM・アーキテクト業務まで一貫して担当。ここで公開しているテンプレートは、実案件で自ら作り続けてきた成果物を汎用化したものです。「現場で本当に使われる資料とは何か」を、経験そのものから設計に落とし込んでいます。MENTA でのメンタリング契約は累計36件、評価は★5.0。</p>
<p>▼ <a href="/about/">プロフィール詳細</a></p>
<h2 id="まとめ">まとめ</h2>
<p>無料テンプレートを公開し続けるなかで見えてきたことは、シンプルでした。</p>
<ol type="1">
<li><strong>求められているのは、より綺麗なファイルではなく「書き方の指針・体裁の統一・更新の軽さ」の3点</strong></li>
<li><strong>標準準拠の構造とデザインシステムがあれば、品質は再現できる</strong></li>
<li><strong>生成スキルとテンプレートをセットで届ければ、成果物の種類が増えても品質を担保する仕組みは1つで済む</strong></li>
</ol>
<h3 id="まず実物を見たい方へ">まず実物を見たい方へ</h3>
<p>構造・配色・図表のクオリティは、説明よりスライドを1枚見たほうが早いはずです。3テーマ×全スライドを、そのまま公開しています。</p>
<p>▼ <a href="/templates/premium/">Premium Document Templates を確認する</a></p>
<h3 id="自分で作れるようになりたい方へ">自分で作れるようになりたい方へ</h3>
<p>テンプレートを「使う側」から「作る側」へ。ドキュメント生成の仕組みそのものを構築できるようになる1on1トレーニングです。無料相談も承っています。</p>
<p>▼ <a href="/training/">AI開発トレーニングの詳細を見る</a></p>
<p>ご質問は<a href="/contact/">お問い合わせフォーム</a>からどうぞ。</p>
<h2 id="よくある質問">よくある質問</h2>
<p><strong>Q. 無料テンプレートと有料テンプレートの違いは？</strong></p>
<p>A. 無料版は実務で使える「枠」を提供しています。有料版はそれに加えて、デザインシステムによる体裁の統一と、データからの再生成による更新の軽さを備えています。継続的に資料を作り、更新し続ける立場の方ほど効果が出ます。</p>
<p><strong>Q. 自社のブランドカラーに変えられますか？</strong></p>
<p>A. カラートークンを差し替えるだけで全スライドに反映される設計です。スライドを1枚ずつ直す必要はありません。これがデザインシステム化の目的です。</p>
<p><strong>Q. どのテーマを選べばいいですか？</strong></p>
<p>A. 読み手で決めてください。経営・戦略層への提案ならNavy、業種を選ばず落ち着いた印象にしたいならGraphite、伝統・ラグジュアリー系のブランドならBordeauxが適します。</p>
<p><strong>Q. 「生成スキルとテンプレートのセット」とは具体的に何ですか？</strong></p>
<p>A. 対話しながら成果物を出力する生成スキルと、その出力先となるテンプレート（3テーマの配色・レイアウトで統制済み）の2点セットです。データを渡すと、体裁の整った成果物がそのまま出てきます。</p>
<p><strong>Q. スライドだけでなく、Excelの設計書も対象ですか？</strong></p>
<p>A. 対象です。実例としてLWC画面定義書を23シート構成で生成できます。画面項目定義から権限・FLS、テスト設計まで網羅し、画面遷移図やスクリーンショットの貼り込みまで自動化しています。スライドもExcelも、同じ3テーマの配色体系の上に載っています。</p>
<p><strong>Q. この仕組みを自分で作れるようになりますか？</strong></p>
<p>A. なります。特別なシステムは必要なく、データを渡せば資料が生成される仕組みは自分で構築できます。実際に私が構築した手順を、1on1の<a href="/training/">AI開発トレーニング</a>でそのままお伝えしています。無料相談も承っています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CloudFormGenerator 入門｜SalesforceネイティブでWordテンプレをそのままPDF出力する帳票ジェネレーター</title>
		<link>https://creativecontentlabtokyo.com/sf-cloudformgenerator-intro/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Fri, 08 May 2026 17:42:32 +0000</pubDate>
				<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[LWC]]></category>
		<category><![CDATA[Salesforce]]></category>
		<category><![CDATA[帳票自動化]]></category>
		<category><![CDATA[業務効率化]]></category>
		<category><![CDATA[見積書]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/sf-cloudformgenerator-intro/</guid>

					<description><![CDATA[見積書を発行するたびに、Wordファイルをコピペして数字を手で打ち直していませんか？「商談情報はSalesforceに全部あるのに、なぜ帳票だけ別管理なの？」—…]]></description>
										<content:encoded><![CDATA[<p>見積書を発行するたびに、Wordファイルをコピペして数字を手で打ち直していませんか？「商談情報はSalesforceに全部あるのに、なぜ帳票だけ別管理なの？」——この矛盾が、Salesforce導入済みの中小企業に根深く残っています。</p>
<p>この問題を解決するために開発したのが、<strong>CloudFormGenerator（帳票ジェネレータ）</strong>です。Salesforceネイティブの帳票生成ツールで、社内で長年使ってきたWordテンプレをそのまま活かしながら、商談レコードから1クリックで見積書・請求書・契約書をPDF出力できます。</p>
<p>この記事では、CloudFormGeneratorの全機能と、競合製品との差別化ポイントを解説します。</p>
<hr>
<h2>Salesforce帳票業務の3つの無駄</h2>
<p>Salesforceを導入しても、帳票業務だけ「昔ながらの手作業」が残り続けるのには理由があります。</p>
<p><strong>転記ミスと二重管理。</strong> 商談の金額・顧客名・担当者をSalesforceに入力した後、同じデータをWordファイルにも手で転記します。このダブルエントリーは入力ミスの温床です。</p>
<p><strong>テンプレートの属人化。</strong> 「最新の見積書フォーマット、誰が持ってるんだっけ？」問題です。担当者のPCにばらばらに保存されたWordファイルは、会社の書式が変わるたびに全員への配布作業が発生し、バージョン管理が崩壊します。</p>
<p><strong>IT部門への依存。</strong> 既存の帳票ツールの多くは、WordファイルへのAPIタグ直接記述方式です。業務担当者がWordを開いてコードを書くのは現実的ではなく、テンプレートを変えるたびにIT担当者や外部SIerへの依頼が必要になります。「書式を少し変えたいだけで1ヶ月待ち」という状況が生まれます。</p>
<hr>
<h2>CloudFormGeneratorとは</h2>
<p>CloudFormGeneratorは「SalesforceのデータをそのままPDF帳票にする」に特化したSalesforceネイティブのソリューションです。LWC（Lightning Web Component）とApexのみで構成しており、外部サーバーへのデータ送信は一切不要。Salesforceのシェアリングルール・FLS（項目レベルセキュリティ）がそのまま適用されます。</p>
<p>商談レコードの「帳票出力」ボタンをクリックするだけで、Salesforceに登録済みの顧客名・商品明細・金額・担当者が帳票テンプレートに自動で流し込まれ、PDFとしてダウンロードおよびレコードへの添付ができます。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/05_record-page-button.png" alt="商談レコードの帳票出力ボタン" loading="lazy"><figcaption>商談レコード上部の「帳票出力」ボタンから操作。Salesforceを離れずに帳票が完結する。</figcaption></figure>
<hr>
<h2>主要競合製品と徹底比較</h2>
<p>Salesforce向け帳票ツールの市場には複数の製品（以下、製品A〜Cとします）があります。機能の豊富さには定評がある半面、中小企業での導入にはいくつかの課題があります。</p>
<p><strong>価格の壁。</strong> 製品A（海外系）は10ユーザー想定で月額約¥35,000、製品B（海外系）は約¥28,000、製品C（国内系）は¥30,000〜100,000と、中小企業にとって重い固定費です。CloudFormGeneratorは出力件数無制限。個人開発の低コスト構造により、競合製品を下回る価格帯での提供が可能です。料金はご利用規模に応じて個別にお見積もりいたします。</p>
<p><strong>設定の複雑さ。</strong> 製品A・製品B系は「WordファイルへのAPIタグ直接記述」方式です。<code>{{OpportunityName}}</code>のようなタグをWord上に手書きする必要があり、設定に必ずIT担当者が介在します。CloudFormGeneratorはビジュアルなマッピング画面で、業務担当者がドロップダウンで項目を選ぶだけで設定できます。</p>
<p><strong>Salesforceネイティブかどうか。</strong> 製品A・製品BはSalesforceとの連携に外部API接続が必要です。OAuthトークン管理・エンドポイント設定・セキュリティポリシーの承認など、導入にひと手間かかります。CloudFormGeneratorはSalesforce内で完結するため、情報システム部門の承認を得やすいのも特長です。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/sf-form-generator-architecture.png" alt="CloudFormGenerator システム構成図" loading="lazy"><figcaption>外部サーバー依存なし。LWC+Apexのみで完結するSalesforceネイティブ構成。</figcaption></figure>
<table>
<thead>
<tr>
<th>製品</th>
<th>月額（10U想定）</th>
<th>設定方式</th>
<th>Salesforceネイティブ</th>
<th>印鑑対応</th>
</tr>
</thead>
<tbody>
<tr>
<td>製品A（海外系）</td>
<td>¥35,000〜</td>
<td>Wordタグ直接記述（IT必須）</td>
<td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 外部API</td>
<td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
</tr>
<tr>
<td>製品B（海外系）</td>
<td>¥28,000〜</td>
<td>Wordタグ直接記述（IT必須）</td>
<td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 外部API</td>
<td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
</tr>
<tr>
<td>製品C（国内系）</td>
<td>¥30,000〜</td>
<td>専用エディタ</td>
<td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 外部サーバー</td>
<td>△</td>
</tr>
<tr>
<td><strong>CloudFormGenerator</strong></td>
<td><strong>お見積もり</strong></td>
<td><strong>ビジュアルマッピング（ノーコード）</strong></td>
<td><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> LWC+Apex完結</strong></td>
<td><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> SVG自動生成</strong></td>
</tr>
</tbody>
</table>
<hr>
<h2>5つの差別化ポイント</h2>
<h3>1. 既存WordテンプレをそのままアップロードするだけでOK</h3>
<p>CloudFormGeneratorの最大の特長は、社内で長年使ってきた.docxファイルをそのまま流用できる点です。「ファイルをドロップ」するだけで、テンプレート内の<code>{{顧客名}}</code>や<code>{{合計金額}}</code>といったプレースホルダーを自動検出します。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/02_upload-docx.png" alt="Wordファイルアップロード後の解析完了画面" loading="lazy"><figcaption>「解析完了 — 9件のプレースホルダーを抽出しました」。既存Wordテンプレをアップロードするだけで変数を自動認識する。</figcaption></figure>
<p>会社の書式・フォント・印鑑欄のレイアウト・ロゴ配置はそのまま。「新しいフォーマットに作り直す手間」がありません。白紙から作る場合は「白紙から作成（ページサイズを選択）」モードも選べます。</p>
<h3>2. 直感的なマッピング設定 — ドリルダウンで5階層まで辿れる</h3>
<p>プレースホルダーとSalesforce項目の対応付けは、ドロップダウンで項目を選ぶだけです。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/04_mapping-list.png" alt="マッピング設定画面" loading="lazy"><figcaption>プレースホルダーとSalesforce項目を視覚的に対応付け。フォーマット列で通貨（¥#,##0）・日付（yyyy年MM月dd日）をワンクリック設定できる。</figcaption></figure>
<p><code>{{顧客名}}</code> → <code>Account.Name</code>、<code>{{合計金額}}</code> → <code>Amount</code>（通貨フォーマット：¥#,##0）のように直感的に設定できます。親子リレーションは5階層まで辿れるドリルダウン方式で、<code>Opportunity → Account → Owner.Name</code>のような深い参照も設定可能です。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/04_mapping-drilldown.png" alt="マッピング ドリルダウン選択" loading="lazy"><figcaption>「<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/25b6.png" alt="▶" class="wp-smiley" style="height: 1em; max-height: 1em;" />」をクリックすると親子オブジェクトを辿るドリルダウン選択に切り替わる。標準・カスタムオブジェクトを問わず5階層まで対応。</figcaption></figure>
<h3>3. WYSIWYGレイアウトエディタ — 印鑑・明細テーブルを自由配置</h3>
<p>白紙からテンプレートを作る場合や、既存テンプレートのレイアウトを変更する場合は、3カラム構成の全画面エディタを使います。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/03_editor-overview.png" alt="レイアウトエディタ全体" loading="lazy"><figcaption>左：要素パネル / 中央：帳票キャンバス / 右：プロパティパネル。要素をドラッグ＆ドロップで配置し、リアルタイムでレイアウトを確認できる。</figcaption></figure>
<p>追加できる要素は以下の通りです：</p>
<ul>
<li>固定文字列・セクション見出し・区切り線</li>
<li>ラベル＋値（Salesforce項目の差し込み）</li>
<li>明細テーブル（子レコードを自動展開、ページをまたいでもヘッダーが繰り返し表示、奇数行・偶数行に個別背景色を設定可能）</li>
<li>固定テーブル（静的な表、行を自由に追加・削除）</li>
<li>今日の日付・ページ番号</li>
<li>印鑑（画像印鑑 / テキストからSVG自動生成の文字印鑑）</li>
<li>バーコード / QRコード（6種類対応：Code128・JAN-13・JAN-8・Code39・NW-7・ITF-14。Salesforce項目の値をそのままコード化して帳票に印字）</li>
</ul>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/03_editor-barcode-element.png" alt="バーコード/QRコード要素の設定" loading="lazy"><figcaption>バーコード/QRコード要素を選択した状態。右パネルで差し込むSalesforce項目（URL・管理番号等）とコードタイプを設定できる。</figcaption></figure>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/09_barcode-types.png" alt="対応バーコード6種類" loading="lazy"><figcaption>Code128・JAN-13・JAN-8・Code39・NW-7・ITF-14の6種類に対応。物流・小売・製造の各業種で使われる主要フォーマットをカバーしている。</figcaption></figure>
<p>明細テーブルでは<code>{{CALC(SUM(Row.金額) * 0.1)}}</code>のような計算式で消費税の自動計算にも対応しています。奇数行・偶数行に別々の背景色を設定するゼブラストライプも標準で設定可能で、行数が多い明細表の視認性を高めます。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/08_output-pdf-table-color.png" alt="明細テーブルゼブラストライプ" loading="lazy"><figcaption>奇数行・偶数行にそれぞれ背景色を設定したゼブラストライプの出力例。行数が多い明細でも視認性が高い。</figcaption></figure>
<p>エディタ内の「プレビュー」ボタンで、実際のSalesforceデータを反映した帳票の仕上がりをリアルタイムで確認できます。</p>
<h3>4. 日本市場特化の印鑑機能</h3>
<p>日本企業の帳票に欠かせない「印鑑」に正式対応しています。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/06_stamp-canvas-text.png" alt="印鑑マスタ — テキスト印鑑のSVG生成" loading="lazy"><figcaption>「やまだ」と入力するだけで、縦書き・横書き対応の丸印鑑SVGをリアルタイム生成。手書きモードでは直接キャンバスに描画することも可能。</figcaption></figure>
<p>印鑑マスタで社印・個人印を登録し、テンプレートに配置するだけで、出力PDFに印鑑が自動で入ります。手書きモードではタブレットやマウスで直接描画した印影を登録することも可能です。</p>
<h3>5. PDF出力 — 標準版と大容量対応VF版の2択</h3>
<p>出力形式はPDF一択で2種類を用意しています。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/05_output-modal.png" alt="帳票出力モーダル" loading="lazy"><figcaption>「PDF（標準）」と「PDF（大容量対応・VF版）」の2択。ヒープ6MB制限を超える大きな帳票はVF版で出力可能。添付ファイルとしてレコードに保存するかも選択できる。</figcaption></figure>
<p><strong>PDF（標準）</strong>は通常の帳票に使用します。<strong>PDF（大容量対応・VF版）</strong>は明細行が多い・画像が大きいなど、Apex処理のヒープサイズ6MB制限を超えるケースに対応しています。出力後はSalesforceのメモ＆添付ファイルに自動保存されます。</p>
<h4>フォントの選択肢と出力方式ごとの注意事項</h4>
<p>レイアウトエディタでは、テンプレート全体の既定フォントと各要素個別のフォントを2階層で指定できます。</p>
<table>
<thead>
<tr>
<th>用途</th>
<th>推奨フォント</th>
</tr>
</thead>
<tbody>
<tr>
<td>日本語帳票（PDF標準・VF版 両対応）</td>
<td>ゴシック（標準）= Arial Unicode MS</td>
</tr>
<tr>
<td>日本語帳票（PDF標準のみ使用）</td>
<td>メイリオ、游ゴシック</td>
</tr>
<tr>
<td>公式文書・契約書</td>
<td>游明朝、MS P明朝</td>
</tr>
<tr>
<td>英数字ラベル・フッタ</td>
<td>欧文（サンセリフ）= Arial</td>
</tr>
</tbody>
</table>
<p><strong>PDF（標準）はフォント制限なし。</strong>ブラウザのChromiumエンジンでPDFを生成するため、OSにインストール済みの日本語フォント（メイリオ・游ゴシック・游明朝等）をすべて使用できます。</p>
<p><strong>PDF（大容量VF版）はArial Unicode Msのみ。</strong>SalesforceサーバーサイドのFlying Saucerエンジンで処理するため、使用できるフォントは「ゴシック（標準）= Arial Unicode MS」のみです。大容量対応が必要な帳票でフォントのバリエーションが必要な場合は、テンプレートをPDF（標準）で出力できるサイズに収めることをご検討ください。</p>
<hr>
<h2>帳票出力のフロー — 操作3ステップで完結</h2>
<p>実際の操作は非常にシンプルです。</p>
<p><strong>Step 1</strong>: レコードページの「帳票出力」ボタンをクリック</p>
<p><strong>Step 2</strong>: テンプレートを選択し、PDF標準 or VF版を選択。「このレコードにファイルを添付する」チェックボックスで自動保存も設定可能</p>
<p><strong>Step 3</strong>: 「プレビュー」で確認後、「出力」ボタンでPDFをダウンロード</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/05_output-preview.png" alt="帳票プレビュー画面" loading="lazy"><figcaption>出力前のリアルタイムプレビュー。実際のSalesforceデータが帳票に流し込まれた状態を確認できる。</figcaption></figure>
<p>出力完了後はメモ＆添付ファイルにPDFが自動保存されます。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/05_output-file-attachedpng.png" alt="ファイル添付完了" loading="lazy"><figcaption>「メモ &#038; 添付ファイル(1)」にPDFが自動保存される。ファイル管理の手間がゼロ。</figcaption></figure>
<hr>
<h2>備考の表示位置も自在にコントロール</h2>
<p>備考・注意事項の表示位置を帳票テンプレートごとに設定できます。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/07_output-pdf-remarks-last.png" alt="備考・最終ページ固定" loading="lazy"><figcaption>備考・最終ページ固定パターン：明細行数に関わらず、備考・特記事項を常に最終ページの末尾に固定表示。印刷体裁を整えたい帳票に最適。</figcaption></figure>
<p>ページをまたぐ大量明細の帳票でも、備考や注意事項を「必ず最終ページに表示する」設定が可能です。ページ数が変動する帳票で「備考が途中のページに出てしまう」問題を解消します。</p>
<hr>
<h2>出力帳票サンプル</h2>
<p>実際に出力したPDFの品質を確認してください。</p>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/07_output-pdf.png" alt="御見積書 出力サンプル" loading="lazy"><figcaption>御見積書の出力例（3ページ中の1ページ目）。顧客名・確認済印鑑・見積合計・バーコード/QRコードが自動差し込みされ、商品明細が続く。</figcaption></figure>
<figure><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/05/07_output-pdf-multipage1-2-3.png" alt="明細改頁パターン — 最終ページ" loading="lazy"><figcaption>明細行が多い場合の改頁サンプル（3ページ構成の最終ページ）。ページをまたいでも明細テーブルのヘッダーが自動繰り返しされ、最終ページに合計行が正しく収まる。</figcaption></figure>
<hr>
<h2>こんな組織・担当者におすすめ</h2>
<ul>
<li><strong>中小企業の経理・営業事務</strong> — 見積書・請求書を月50〜500件発行している。ExcelやWordのコピペ作業に限界を感じている</li>
<li><strong>Salesforce管理者</strong> — 開発者なしで帳票テンプレートを運用したい。IT部門への依頼なしに業務担当者が自分で管理できる体制を作りたい</li>
<li><strong>製造業・IT企業のシステム担当</strong> — 印鑑・日本語フォント対応が必要。既存の会社フォーマットをそのまま活かしたい</li>
<li><strong>Salesforce DX推進担当</strong> — 「入力はSalesforceに統一したのに、帳票だけ別管理」という矛盾を解消したい</li>
</ul>
<hr>
<h2>まとめ</h2>
<ul>
<li><strong>既存WordテンプレをそのままPDF帳票に</strong> — アップロードするだけでプレースホルダーを自動検出。書式・印鑑欄の作り直し不要</li>
<li><strong>ビジュアルマッピングでノーコード設定</strong> — IT部門への依頼なし。業務担当者が自分でテンプレートを管理できる</li>
<li><strong>競合製品より低コスト</strong> — 出力件数無制限・ユーザー数課金なし。固定費で予算管理しやすい</li>
<li><strong>Salesforceネイティブで追加サーバー不要</strong> — 外部API接続なし、セキュリティポリシーをそのまま維持</li>
<li><strong>日本市場特化の印鑑機能</strong> — テキスト入力・手書き両対応のSVG印鑑を標準搭載</li>
</ul>
<p>帳票業務の「Salesforceにデータがあるのに手作業」という矛盾を解消する一手として、ぜひCloudFormGeneratorをお試しください。</p>
<p><a href="https://creativecontentlabtokyo.com/form-generator/">CloudFormGenerator 評価版インストール手順はこちら →</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Salesforceが遅い？ speedtest.jspで原因を特定する方法</title>
		<link>https://creativecontentlabtokyo.com/salesforce-speedtest-jsp-guide/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Wed, 15 Apr 2026 06:44:27 +0000</pubDate>
				<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[Lightning Experience]]></category>
		<category><![CDATA[Salesforce]]></category>
		<category><![CDATA[パフォーマンス]]></category>
		<category><![CDATA[管理者向け]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/salesforce-speedtest-jsp-guide/</guid>

					<description><![CDATA[Salesforceが遅いときに使えるspeedtest.jspの全9項目を解説。推奨値・対策・用語解説付き。VPN・VDI環境の落とし穴も。]]></description>
										<content:encoded><![CDATA[<p>「Salesforceの画面遷移が遅い」「Lightning Experienceの読み込みに時間がかかる」——こんな相談を受けたとき、最初に確認すべきツールが <strong>speedtest.jsp</strong> です。Salesforceに標準で搭載されている性能診断ツールで、端末性能・ネットワーク・サーバー状況を一画面で確認できます。</p>
<p>この記事では、speedtest.jspで測定できる全9項目について、推奨値・判断基準・具体的な対策を解説します。</p>
<h2 id="speedtest.jspとは-アクセス方法">speedtest.jspとは — アクセス方法</h2>
<p>speedtest.jspは、Salesforceが標準で提供するクライアントサイドの性能診断ツールです。設定メニューにはリンクがないため「隠れ機能」と呼ばれることもありますが、どのSalesforce組織でも利用できます。</p>
<p><strong>アクセス方法：</strong> Salesforceにログインした状態で、URLを以下に書き換えるだけです。</p>
<pre><code>https://[あなたのドメイン].lightning.force.com/speedtest.jsp</code></pre>
<p>ページが開いたら「Test Speed」ボタンをクリックすると、数十秒で全項目の測定が完了します。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2026/04/salesforce-speedtest-jsp-guide-eyecatch.png"><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-5855" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/04/salesforce-speedtest-jsp-guide-eyecatch.png" alt="" width="1046" height="591" /></a></p>
<h2 id="端末性能の指標-octane-scorehardware-coresframe-rate">端末性能の指標 — Octane Score・Hardware Cores・Frame Rate</h2>
<h3 id="octane-score-javascript実行性能">1. Octane Score — JavaScript実行性能</h3>
<p><a href="https://chromium.github.io/octane/" rel="noopener">Google Octane 2.0</a> ベンチマークで、ブラウザのJavaScript実行速度を数値化したスコアです。</p>
<p>Lightning Experience（Salesforceの現行UI）はクライアント側のJavaScript処理に大きく依存しているため、この値がページの読み込み速度に直結します。<a href="https://trailhead.salesforce.com/content/learn/modules/lightning-experience-performance-optimization/optimize-lightning-experience-performance" rel="noopener">Salesforce公式のTrailhead</a>でも、Octane Scoreがパフォーマンスの最重要指標として紹介されています。</p>
<p>Salesforceは独自のパフォーマンス指標として <strong>EPT（Experience Page Time）</strong> を採用しており、ページの知覚的な読み込み完了時間を計測しています。Octane Scoreが低い端末では、このEPTが大幅に悪化します。AuraフレームワークからLWC（Lightning Web Components）への移行によりレンダリング効率が2〜60%改善された実績がありますが、それでもクライアント側のJS実行性能が基盤であることに変わりありません。</p>
<p><strong>用語解説：</strong> 「ベンチマーク」とは、ハードウェアやソフトウェアの性能を統一基準で測定するテストのことです。Octane 2.0はGoogleが開発したJavaScriptベンチマークで、21種類のテストを実行してスコアを算出します。</p>
<p><strong>補足：</strong> Octane 2.0は <strong>2017年4月にGoogleが正式に非推奨（Retired）としています。</strong> 廃止の理由は「ブラウザベンダーがスコアを不正に最適化できる問題」と「現代のJavaScript利用パターンを反映していない」こと。後継ベンチマークとしてGoogleは <a href="https://browserbench.org/Speedometer3.0/" rel="noopener">Speedometer</a> を推奨しています。ただし、Salesforceのspeedtest.jspでは現在もOctane Scoreを参考指標として採用しているため、Salesforce環境の診断においては依然として有用な指標です。</p>
<table>
<thead>
<tr>
<th>レベル</th>
<th>Octane Score</th>
</tr>
</thead>
<tbody>
<tr>
<td>最低要件（Lightning一般）</td>
<td>15,000以上</td>
</tr>
<tr>
<td>最低要件（コンソールアプリ）</td>
<td>20,000以上</td>
</tr>
<tr>
<td>推奨値</td>
<td>30,000以上</td>
</tr>
<tr>
<td>ハイエンドデバイス</td>
<td>32,000〜40,000以上</td>
</tr>
</tbody>
</table>
<p><a href="https://help.salesforce.com/s/articleView?id=sf.technical_requirements.htm&amp;language=en_US&amp;type=5" rel="noopener">Salesforce公式ドキュメント</a>によると、最低要件の環境では推奨スペックと比較して<strong>ページロード時間が約50%遅くなる</strong>とされています。</p>
<p><strong>対策：</strong> &#8211; ノートPCは<strong>電源に接続する</strong>（バッテリー駆動だと省電力モードでCPU速度が低下する） &#8211; 不要な<strong>ブラウザ拡張機能を削除</strong>する（各拡張機能がJavaScriptリソースを消費する） &#8211; 他のアプリケーションを閉じてCPU/メモリリソースを確保する &#8211; VDI（仮想デスクトップ基盤）環境では、ユーザー密度の見直しやCPU世代の新しいサーバーへの移行が有効</p>
<h3 id="hardware-cores-cpuコア数">2. Hardware Cores — CPUコア数</h3>
<p>端末のCPUコア数（論理プロセッサ数）を表示します。</p>
<p><strong>用語解説：</strong> 「コア」はCPU内部の処理ユニットです。コア数が多いほど同時に処理できるタスクが増えます。「論理プロセッサ」はHyper-Threadingなどの技術で1つの物理コアを2つに見せる仕組みです。8コアと表示されても、物理的には4コア+Hyper-Threadingの場合があります。</p>
<table>
<thead>
<tr>
<th>レベル</th>
<th>コア数</th>
</tr>
</thead>
<tbody>
<tr>
<td>最低要件</td>
<td>4コア以上</td>
</tr>
<tr>
<td>推奨</td>
<td>8コア（十分）</td>
</tr>
</tbody>
</table>
<p>VDI環境では共有CPUにより実効コア数が少なくなるため、1セッションあたりの割当vCPU数をモニタリングすることが重要です。</p>
<h3 id="frame-rate-描画性能">3. Frame Rate — 描画性能</h3>
<p>ブラウザのレンダリング性能をfps（frames per second：1秒あたりのフレーム数）で測定します。UIのアニメーション・ドラッグ操作・スクロールの滑らかさに影響します。</p>
<p><strong>用語解説：</strong> 「fps」は映像の滑らかさを表す単位です。映画は24fps、一般的なモニターは60fpsで表示しています。Webアプリでは、60fpsを維持できていればユーザーはストレスを感じません。</p>
<table>
<thead>
<tr>
<th>レベル</th>
<th>fps</th>
</tr>
</thead>
<tbody>
<tr>
<td>ストレスを感じる</td>
<td>15fps以下</td>
</tr>
<tr>
<td>推奨値</td>
<td>30fps以上</td>
</tr>
<tr>
<td>快適な操作</td>
<td>60fps</td>
</tr>
</tbody>
</table>
<p><strong>対策：</strong> &#8211; ブラウザの<strong>GPUアクセラレーションが有効</strong>か確認する（Chrome: <code>chrome://gpu</code> にアクセス） &#8211; 重いVisualforceページやiframeの埋め込みを減らす &#8211; GPUが統合グラフィックス（Intel UHD Graphics等）の場合、ディスクリートGPU搭載機への更新を検討する</p>
<p><strong>用語解説：</strong> 「GPUアクセラレーション」とは、通常CPUが行う画面描画処理をGPU（画像処理専用チップ）に委任して高速化する技術です。ブラウザの設定で無効になっていると、フレームレートが大幅に低下します。</p>
<h2 id="ネットワーク性能の指標-latencydownloadupload-speed">ネットワーク性能の指標 — Latency・Download/Upload Speed</h2>
<h3 id="latency-ネットワーク遅延">4. Latency — ネットワーク遅延</h3>
<p>端末からSalesforceサーバーまでの<strong>往復遅延時間（RTT：Round Trip Time）</strong> です。ボタンクリックから画面が反応するまでの「もたつき」に直結します。</p>
<table>
<thead>
<tr>
<th>レベル</th>
<th>Latency</th>
</tr>
</thead>
<tbody>
<tr>
<td>快適</td>
<td>100ms以下</td>
</tr>
<tr>
<td>推奨値</td>
<td>150ms以下</td>
</tr>
<tr>
<td>最低要件</td>
<td>200ms以下</td>
</tr>
<tr>
<td>日本→AP（東京）インスタンス</td>
<td>通常 20〜80ms</td>
</tr>
<tr>
<td>日本→NA（北米）インスタンス</td>
<td>150〜300ms</td>
</tr>
</tbody>
</table>
<p>Salesforceの組織（Org）は、AP（アジア太平洋）、NA（北米）、EU（ヨーロッパ）などの<a href="https://www.simplysfdc.com/2020/01/salesforce-lightning-performance.html" rel="noopener">インスタンス</a>に紐づく物理データセンターでホストされています。ユーザーがデータセンターに近いほどレイテンシが低くなります。</p>
<p><strong>用語解説：</strong> 「インスタンス」とは、Salesforceが世界各地に配置しているサーバー群の識別名です。AP26なら東京リージョン、NA135なら北米リージョンに配置されています。自分のOrgのインスタンスは「設定 &gt; 組織情報」で確認できます。</p>
<p><strong>対策：</strong> &#8211; VPN経由のアクセスでルーティングが遠回りになっていないか確認する &#8211; <a href="https://developer.salesforce.com/docs/platform/lwc/guide/perf-cdn.html" rel="noopener">Salesforce CDN</a>を活用して静的コンテンツの初回ロードを高速化する</p>
<p><strong>用語解説：</strong> SalesforceはLightning Componentフレームワークの静的コンテンツ（JavaScript・CSS・画像等）の配信に <strong>Akamai CDN</strong> を使用しています。CDNにより、静的アセットがユーザーに最も近いエッジサーバーからキャッシュ配信されるため、初回ロードが高速化されます。なお、Experience Cloud（コミュニティサイト）はAkamai、Commerce CloudのLWRサイトはCloudflareと、製品ごとにCDNが使い分けられています。 &#8211; ネットワーク管理者に <code>traceroute</code> で経路を解析してもらう &#8211; 日本のユーザーが多い場合は、APxx（東京）インスタンスでの運用が理想</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2026/04/network-latency-analysis.png"><img decoding="async" class="alignnone size-full wp-image-5858" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/04/network-latency-analysis.png" alt="" width="1456" height="720" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2026/04/network-latency-analysis.png 1456w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/04/network-latency-analysis-300x148.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/04/network-latency-analysis-1024x506.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2026/04/network-latency-analysis-768x380.png 768w" sizes="(max-width: 1456px) 100vw, 1456px" /></a></p>
<h3 id="download-speed-ダウンロード速度">5. Download Speed — ダウンロード速度</h3>
<p>Salesforceサーバーからのデータ受信速度です。ページの初回読み込み、レポート表示、ファイルダウンロードの体感速度に影響します。</p>
<table>
<thead>
<tr>
<th>レベル</th>
<th>速度</th>
</tr>
</thead>
<tbody>
<tr>
<td>最低要件</td>
<td>1 Mbps</td>
</tr>
<tr>
<td>推奨値</td>
<td>3 Mbps以上</td>
</tr>
<tr>
<td>快適な業務利用</td>
<td>5 Mbps以上</td>
</tr>
</tbody>
</table>
<p><strong>用語解説：</strong> 「Mbps（メガビット毎秒）」はデータ転送速度の単位です。1 Mbpsなら1秒間に約125KBのデータを転送できます。5 Mbpsあれば、一般的なSalesforceの画面遷移はストレスなく行えます。</p>
<p><strong>対策：</strong> &#8211; 社内LANの帯域やプロキシサーバーのボトルネックを確認する &#8211; 同一ネットワーク上の他のトラフィック（動画ストリーミング等）による帯域圧迫を排除する &#8211; Wi-Fiが不安定な場合は<strong>有線接続</strong>を試す &#8211; プロキシ/ファイアウォールでSalesforce関連ドメインがスロットリング（帯域制限）されていないか確認する</p>
<h3 id="upload-speed-アップロード速度">6. Upload Speed — アップロード速度</h3>
<p>端末からSalesforceサーバーへのデータ送信速度です。レコード保存、ファイルアップロード、添付ファイル操作の体感速度に影響します。</p>
<table>
<thead>
<tr>
<th>レベル</th>
<th>速度</th>
</tr>
</thead>
<tbody>
<tr>
<td>最低限</td>
<td>0.5 Mbps以上</td>
</tr>
<tr>
<td>快適</td>
<td>1 Mbps以上</td>
</tr>
</tbody>
</table>
<p>対策はダウンロード速度と同様のネットワーク最適化が有効です。</p>
<h2 id="サーバー環境情報-your-servertrust-statususer-agent">サーバー・環境情報 — Your Server・Trust Status・User Agent</h2>
<h3 id="your-server-release-接続先情報">7. Your Server / Release — 接続先情報</h3>
<p>接続先のSalesforceインスタンス名（例：AP26、NA135）と、適用されているSalesforceリリースバージョン（例：Spring ’26）を表示します。</p>
<p><strong>活用方法：</strong> Orgのインスタンスが地理的に遠い場合、Salesforceサポートに相談して<strong>インスタンス移行</strong>を検討できます。日本のユーザーが大半なのにNAインスタンスに配置されている場合は、APインスタンスへの移行で大幅なレイテンシ改善が期待できます。</p>
<h3 id="trust-status-サービス稼働状況">8. Trust Status — サービス稼働状況</h3>
<p><a href="https://status.salesforce.com/" rel="noopener">Salesforce Trustサイト</a>の情報と連携して、接続先インスタンスの稼働状況やメンテナンス情報を表示します。</p>
<p>2026年より <strong>My Trust Center</strong> が一般提供（GA）となり、各テナント固有のステータス情報がパーソナライズ表示されるようになりました。特定インスタンスや製品を選んでアラートメールを自己登録することも可能です。</p>
<p><strong>活用方法：</strong> パフォーマンス低下時に、原因が<strong>Salesforce側のインフラ障害なのか自社環境なのかを切り分ける最初の確認ポイント</strong>になります。「遅い」と言われたらまずここを確認しましょう。</p>
<h3 id="user-agent-webgl-ブラウザgpu情報">9. User Agent / WebGL — ブラウザ・GPU情報</h3>
<p>ブラウザの種類・バージョン、OS情報、GPUの種類を表示します。</p>
<p><strong>確認ポイント：</strong> &#8211; <a href="https://help.salesforce.com/s/articleView?id=sf.technical_requirements.htm&amp;language=en_US&amp;type=5" rel="noopener">Salesforce公式</a>が最もパフォーマンスが高いとするのは<strong>Google Chrome</strong> &#8211; GPUが統合グラフィックス（Intel UHD Graphics等）の場合、フレームレートがやや低めになる可能性がある</p>
<p><strong>用語解説：</strong> 「WebGL」はブラウザ上で3Dグラフィックスを描画する技術で、GPUの種類と密接に関連します。「統合グラフィックス」はCPUに内蔵されたGPUで、独立GPU（NVIDIA GeForce等）と比べて描画性能が低い傾向があります。</p>
<h2 id="総合推奨スペックまとめ">総合推奨スペックまとめ</h2>
<table>
<thead>
<tr>
<th>項目</th>
<th>最低要件</th>
<th>推奨値</th>
<th>快適ライン</th>
</tr>
</thead>
<tbody>
<tr>
<td>Octane Score</td>
<td>20,000+</td>
<td>30,000+</td>
<td>35,000+</td>
</tr>
<tr>
<td>Latency</td>
<td>200ms以下</td>
<td>150ms以下</td>
<td>100ms以下</td>
</tr>
<tr>
<td>Download Speed</td>
<td>1 Mbps+</td>
<td>3 Mbps+</td>
<td>5 Mbps+</td>
</tr>
<tr>
<td>Upload Speed</td>
<td>—</td>
<td>0.5 Mbps+</td>
<td>1 Mbps+</td>
</tr>
<tr>
<td>RAM</td>
<td>5GB（SF用2GB）</td>
<td>8GB（SF用3GB）</td>
<td>16GB+</td>
</tr>
<tr>
<td>Frame Rate</td>
<td>—</td>
<td>30fps+</td>
<td>60fps</td>
</tr>
</tbody>
</table>
<h2 id="エンタープライズ環境で特に注意すべき2項目">エンタープライズ環境で特に注意すべき2項目</h2>
<p>エンタープライズ環境（特に金融系・官公庁系プロジェクト）では、以下の2項目がボトルネックになりやすいです。</p>
<p><strong>1. VPN経由のレイテンシ</strong> セキュリティポリシーでVPN必須の環境では、VPNゲートウェイの物理的な位置によってレイテンシが大幅に増加します。東京→海外VPN→東京インスタンスという経路になると、100ms以下で済むはずの遅延が300ms以上になるケースもあります。</p>
<p><strong>2. VDI環境のOctane Score</strong> VDI（仮想デスクトップ基盤）環境では、サーバーのCPUリソースを複数ユーザーで共有するため、Octane Scoreが物理PCの半分以下になることがあります。ユーザー密度（1台のサーバーに何人収容するか）の見直しが有効です。</p>
<p><strong>用語解説：</strong> 「VDI（Virtual Desktop Infrastructure）」とは、サーバー上で仮想的なデスクトップ環境を動かし、端末からリモートで接続する仕組みです。セキュリティが強化される一方、CPUやメモリが共有されるため個々のユーザーのパフォーマンスが低下しやすい特徴があります。</p>
<h2 id="salesforceのパフォーマンス改善でお困りなら">Salesforceのパフォーマンス改善でお困りなら</h2>
<p>speedtest.jspで問題箇所を特定できても、「VPN経路の最適化をどう進めるか」「VDI環境でのチューニングをどこから始めるか」は、環境ごとに事情が異なります。</p>
<p>AI開発実践ラボでは、Salesforce環境のパフォーマンス改善やLightning Experience最適化について、1on1のオンライントレーニングで実践的なノウハウをお伝えしています。</p>
<p>→ <a href="https://creativecontentlabtokyo.com/training/">AI駆動開発トレーニング — 詳細を見る</a></p>
<h2 id="まとめ">まとめ</h2>
<ul>
<li><strong>speedtest.jsp</strong> はSalesforceの標準ツールで、URLを書き換えるだけでアクセスできる</li>
<li><strong>Octane Score 30,000以上・Latency 150ms以下・Download 3Mbps以上</strong> が推奨ライン</li>
<li>エンタープライズ環境では <strong>VPN経由のレイテンシ</strong> と <strong>VDI環境のOctane Score</strong> が課題になりやすい</li>
</ul>
<p>パフォーマンス問題の切り分けの第一歩として、ぜひ活用してみてください。</p>
<hr />
<p><strong>関連リンク:</strong> &#8211; <a href="https://trailhead.salesforce.com/content/learn/modules/lightning-experience-performance-optimization/optimize-lightning-experience-performance" rel="noopener">Salesforce Trailhead — Lightning Experienceパフォーマンス最適化</a> &#8211; <a href="https://status.salesforce.com/" rel="noopener">Salesforce Trust — サービス稼働状況</a> &#8211; <a href="https://creativecontentlabtokyo.com/portfolio/sf-universal-record-form/">ポートフォリオ — AI汎用入力フォームLWC</a>（LWCによるパフォーマンスを考慮したUI設計の実例）</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Salesforce関連の資料作成や設計・開発に役立つ素材・リンク集</title>
		<link>https://creativecontentlabtokyo.com/materials-links-salesforce-related-docs-design-development/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Fri, 04 Jul 2025 06:45:58 +0000</pubDate>
				<category><![CDATA[リソース]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/?p=5604</guid>

					<description><![CDATA[提案やプロジェクト管理資料の作成に役立つ素材集 Lightning Design System2のアイコン Lightning Design System2の公…]]></description>
										<content:encoded><![CDATA[<h2>提案やプロジェクト管理資料の作成に役立つ素材集</h2>
<h4>Lightning Design System2のアイコン</h4>
<ul>
<li>Lightning Design System2の公式サイトから以下のようなアイコンをダウンロード可能。</li>
<li>公式サイトは<a href="https://www.lightningdesignsystem.com/2e1ef8501/p/83309d-icons/b/586464" rel="noopener">こちら</a></li>
</ul>
<p><img decoding="async" class="alignnone wp-image-5605 " src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted.png" width="789" height="107" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted.png 877w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-300x41.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-768x104.png 768w" sizes="(max-width: 789px) 100vw, 789px" /></p>
<h4>Data Cloud ダイアグラム・アイコン</h4>
<ul>
<li>Data Cloudのアーキテクチャや設計で利用すると便利なアイコンやコンテナカード、ダイアグラムなどの素材が公式で提供されています。</li>
<li>Salesforce公式のarchitectsサイト（<a href="https://architect.salesforce.com/diagrams/framework/kit-of-parts" rel="noopener">こちら</a>）を確認。LucidChartやGoogleスライド、PPTXなど複数の形式があります。</li>
</ul>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-5610 " src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-2.png" width="781" height="199" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-2.png 1009w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-2-300x76.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-2-768x196.png 768w" sizes="auto, (max-width: 781px) 100vw, 781px" /><img loading="lazy" decoding="async" class="alignnone wp-image-5615 " src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-3.png" width="809" height="207" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-3.png 1122w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-3-300x77.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-3-1024x262.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-3-768x196.png 768w" sizes="auto, (max-width: 809px) 100vw, 809px" /></p>
<h4>Canva</h4>
<ul>
<li>CANVAは、デザイン経験がない人でも簡単にプロ品質のグラフィックを作成できるオンラインデザインツールです。AIを使った画像生成も可能</li>
<li>豊富なテンプレート、画像、フォントを使って、SNS投稿、プレゼンテーション、ポスター、名刺などを直感的な操作で制作できます。</li>
<li>無料版と有料版があり、個人からビジネスまで幅広く利用されています。ドラッグ&amp;ドロップの簡単操作で、誰でも美しいデザインが作れる点が最大の特徴です。</li>
<li>公式サイトは<a href="https://www.canva.com/" rel="noopener">こちら</a></li>
</ul>
<p><img loading="lazy" decoding="async" width="922" height="278" class="alignnone wp-image-5623 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-4.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-4.png 922w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-4-300x90.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/07/Pasted-4-768x232.png 768w" sizes="auto, (max-width: 922px) 100vw, 922px" /></p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AIエディタを使ったVibe CordingでSalesforceの開発を行う【①用語の理解とツールの説明】</title>
		<link>https://creativecontentlabtokyo.com/develop-salesforce-with-vibe-cording-using-ai-editor/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 22 Jun 2025 05:15:48 +0000</pubDate>
				<category><![CDATA[生成AI（Generative AI）]]></category>
		<category><![CDATA[AIエディタ]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[Cline]]></category>
		<category><![CDATA[Copilot]]></category>
		<category><![CDATA[Salesforce]]></category>
		<category><![CDATA[Vibe coding]]></category>
		<category><![CDATA[VSCode]]></category>
		<category><![CDATA[Windsurf]]></category>
		<category><![CDATA[コーディング]]></category>
		<category><![CDATA[生成AI]]></category>
		<category><![CDATA[開発]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/?p=5506</guid>

					<description><![CDATA[Vibe Codingとは何か（感覚的・直感的なコーディング手法） Vibe Coding（バイブコーディング）とは、従来の詳細な設計書やドキュメントベースの開…]]></description>
										<content:encoded><![CDATA[<h2 class="text-2xl font-bold mt-1 text-text-100">Vibe Codingとは何か（感覚的・直感的なコーディング手法）</h2>
<p class="whitespace-normal break-words">Vibe Coding（バイブコーディング）とは、従来の詳細な設計書やドキュメントベースの開発から脱却し、開発者の直感と感覚、そしてAIの支援を活用した新しいコーディング手法です。</p>
<p class="whitespace-normal break-words">開発者が「こんな機能を作りたい」という漠然としたアイデアや要求を、AIエディタとの対話を通じて具体的なコードに変換していくため、完璧な設計よりもスピードや柔軟性を重視しており、Salesforceの開発と非常に相性がよい手法となります。</p>
<div class="cclt-compat-kaiwa cclt-compat-kaiwa--left"><div class="cclt-compat-kaiwa__icon"><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2024/11/schooldays1.jpg" alt="サポーターさん" loading="lazy" /><span class="cclt-compat-kaiwa__name">サポーターさん</span></div><div class="cclt-compat-kaiwa__bubble" style="background-color:#f4f4e3;"><div class="cclt-compat-kaiwa__text">Vibe Codingを使えば、開発が必要な画面や機能も要件定義の段階でプロトタイプをサクッと作ったり、設計書や開発のコーディングのベースを作成して開発を大幅に効率化できます</div></div></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">従来のSalesforce開発の課題を解消</h3>
<p>Salesforceの開発では、Javaなどの言語は経験があるが、ApexやLWCは経験がないというメンバーがアサインされることもありますが、Vibe codingを行うことで、Salesforce独自の言語（Apex/LWC/Visualforce/SOQL/SOSL）への対応やガバナ―制限への対応もAIが自動的に対応してくれるため、キャッチアップも用意で、開発効率も大幅にアップすることができます。</p>
<p>作成されたソースコードについて仕様や解説もしてくれるしコメントを入れることができるので、処理内容を把握して、要件と異なるところもすぐに検索して修正することができます。</p>
<p>AIエディタで実現できること</p>
<p><img loading="lazy" decoding="async" width="1920" height="1129" class="alignnone wp-image-5521 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140.jpg" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140-300x176.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140-1024x602.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140-768x452.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140-1536x903.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></p>
<h2 class="text-2xl font-bold mt-1 text-text-100">AIエディタとは？</h2>
<p>開発現場で、皆さんが一番利用している生成AIは何でしょうか？実際はコーディング以外の作業もあるのでChatGTPが一番多いかもしれませんね。</p>
<p>コーディングで利用するAI エディター（※1）については、「<span style="color: #0000ff;"><strong>GitHub Copilot</strong></span>」「<span style="color: #0000ff;"><strong>Cline</strong></span>」「<span style="color: #0000ff;"><strong>Cursor</strong></span>」「<span style="color: #0000ff;"><strong>Windsurf</strong></span>」「<span style="color: #0000ff;"><strong>Claude Code</strong></span>」 など数多くのエディタが出てきてますが、それぞれ一長一短があるような印象です。</p>
<p>ちなみに私は、現時点ではClaude Codeが一番のお気に入りです。Salesforceの開発IDEとしてはVisual Studio Codeが一般的になってきてますが、Claude Code はVSCodeの拡張プラグインとして利用することができます。</p>
<p>CursorやWindsurfは、VSCode のフォークエディタの位置づけとなります。</p>
<p>※1.AIエディタとは、AI（人工知能）技術を活用して、文章作成やコード編集などの作業を支援するソフトウェアで、コード補完やエラーチェック、自動生成などの機能を持ちます。</p>
<p>Salesforceの開発ではVSCodeを利用することが多いと思うので、現時点では、VSCodeと相性の良いものを選択するのがいいかもしれません。現在はまだ過渡期なので、特定のエディタというよりは、ChatpGPTやCluade.aiを使ってソースコードを生成して利用するなど組み合わせで進めていくのもよいと思います。</p>
<div class="cclt-compat-kaiwa cclt-compat-kaiwa--left"><div class="cclt-compat-kaiwa__icon"><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/no-img.png" alt="" loading="lazy" /></div><div class="cclt-compat-kaiwa__bubble" style="background-color:#f8f8f8;"><div class="cclt-compat-kaiwa__text">エディタについては、開発者ごとにこだわりが強く表れるので、まずは使ってみて気に入ったものを見つけるところから始めてください</div></div></div>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">主要AIエディタの比較</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">比較表</h3>
<table class="bg-bg-100 min-w-full border-separate border-spacing-0 text-sm leading-[1.88888] whitespace-normal">
<thead class="border-b-border-100/50 border-b-[0.5px] text-left">
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">項目</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">GitHub Copilot</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">Cline</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">Cursor</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">Windsurf</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">Claude Code</th>
</tr>
</thead>
<tbody>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>料金</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">$10/月</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">無料/有料プラン</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">$20/月</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">$15/月</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">無料（プレビュー）</td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>統合性</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">多エディタ対応</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">VS Code専用</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">専用エディタ</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">専用エディタ</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">コマンドライン</td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>Salesforce対応</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>コード補完</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">非常に高精度</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">高精度</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">高精度</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">高精度</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">中程度</td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>ファイル操作</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">限定的</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">可能</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">可能</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">可能</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">可能</td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>学習コスト</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">低</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">中</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">低</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">中</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">高</td>
</tr>
</tbody>
</table>
<div class="cclt-compat-cmemo" style="background-color:#ffebee;color:#000000;border:px solid ;"><span class="cclt-compat-cmemo__icon fa fa-file-text-o" style="color:#ef5350;"></span><div class="cclt-compat-cmemo__text">※料金や機能、Salesforceへの対応状況については日々変化しているため、最新の情報を公式HPやドキュメントで確認するようにしてください。</div></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">GitHub Copilot の詳細分析</h3>
<p><img loading="lazy" decoding="async" width="1373" height="396" class="alignnone wp-image-5513 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138.jpg" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138.jpg 1373w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-300x87.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1024x295.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-768x222.jpg 768w" sizes="auto, (max-width: 1373px) 100vw, 1373px" /></p>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> GitHub Copilotは、OpenAIのCodexモデルをベースとしたAIコーディング支援ツールです。GitHub上の膨大なオープンソースコードで訓練されており、多言語に対応しています。Salesforce開発においては、ApexやLightning Web Componentsのコード補完に優れた性能を発揮します。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における強み</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Apex言語の高精度な補完とコード生成</li>
<li class="whitespace-normal break-words">Lightning Web Componentsのテンプレート自動生成</li>
<li class="whitespace-normal break-words">SOQLクエリの最適化提案</li>
<li class="whitespace-normal break-words">テストクラスの自動生成</li>
<li class="whitespace-normal break-words">Salesforce APIの適切な使用方法提案</li>
</ul>
<div class="cclt-compat-mybutton cclt-compat-mybutton--ref cclt-compat-mybutton--shadow"><a href="https://azure.microsoft.com/ja-jp/products/github/copilot" class="cclt-compat-mybutton__link" style="color:#fff;background-color:#FFD54F;border:1px solid #FFEB3B;border-radius:5px;font-weight:bold;background:linear-gradient(#ffdb69,#FFD54F);" rel="noopener">公式HPはコチラ</a></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Cline の詳細分析</h3>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> ClineはVS Code拡張として動作するAIアシスタントで、ファイル操作やターミナル操作が可能な点が特徴です。Salesforce開発においては、Salesforce CLIとの連携や、複数ファイルにまたがる機能実装に威力を発揮します。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における活用方法</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Salesforce CLIコマンドの自動実行</li>
<li class="whitespace-normal break-words">プロジェクト構造の自動生成</li>
<li class="whitespace-normal break-words">設定ファイルの一括更新</li>
<li class="whitespace-normal break-words">デプロイメントスクリプトの作成</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Cursor の詳細分析</h3>
<p><img loading="lazy" decoding="async" width="1740" height="603" class="alignnone wp-image-5515 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1.jpg" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1.jpg 1740w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1-300x104.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1-1024x355.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1-768x266.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1-1536x532.jpg 1536w" sizes="auto, (max-width: 1740px) 100vw, 1740px" /></p>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> CursorはAI機能を内蔵した専用エディタで、自然言語でのコード編集指示が可能です。コードベース全体を理解した上での提案を行うため、Salesforceの複雑なオブジェクト関係を理解した開発が可能になります。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における強み</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">自然言語でのApexクラス生成指示</li>
<li class="whitespace-normal break-words">オブジェクト関係を考慮したコード提案</li>
<li class="whitespace-normal break-words">Lightning Web Componentの統合的な開発支援</li>
<li class="whitespace-normal break-words">プロジェクト全体の一貫性チェック</li>
</ul>
<div class="cclt-compat-mybutton cclt-compat-mybutton--ref cclt-compat-mybutton--shadow"><a href="https://www.cursor.com/ja" class="cclt-compat-mybutton__link" style="color:#fff;background-color:#FFD54F;border:1px solid #FFEB3B;border-radius:5px;font-weight:bold;background:linear-gradient(#ffdb69,#FFD54F);" rel="noopener">公式HPはコチラ</a></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Windsurf の詳細分析</h3>
<p><img loading="lazy" decoding="async" width="1706" height="453" class="alignnone wp-image-5516 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2.jpg" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2.jpg 1706w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2-300x80.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2-1024x272.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2-768x204.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2-1536x408.jpg 1536w" sizes="auto, (max-width: 1706px) 100vw, 1706px" /></p>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> WindsurfはCodeium社が開発したAI統合開発環境で、マルチファイル編集とプロジェクト全体の理解に優れています。Salesforce開発においては、複雑なビジネスプロセスの実装や、大規模プロジェクトの管理に特に有効です。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における特徴</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">複数のApexクラス間の依存関係管理</li>
<li class="whitespace-normal break-words">Lightning Web Componentとバックエンドの連携設計</li>
<li class="whitespace-normal break-words">カスタムオブジェクトとコードの同期的開発</li>
<li class="whitespace-normal break-words">エンタープライズレベルのアーキテクチャ提案</li>
</ul>
<div class="cclt-compat-mybutton cclt-compat-mybutton--ref cclt-compat-mybutton--shadow"><a href="https://windsurf.com/" class="cclt-compat-mybutton__link" style="color:#fff;background-color:#FFD54F;border:1px solid #FFEB3B;border-radius:5px;font-weight:bold;background:linear-gradient(#ffdb69,#FFD54F);" rel="noopener">公式HPはコチラ</a></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Claude Code の詳細分析</h3>
<p><img loading="lazy" decoding="async" width="1379" height="475" class="alignnone wp-image-5517 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138.png 1379w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-300x103.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1024x353.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-768x265.png 768w" sizes="auto, (max-width: 1379px) 100vw, 1379px" /></p>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> Claude CodeはAnthropic製のコマンドライン型AIツールで、ターミナルから直接Claude AIを活用できます。Salesforce開発においては、複雑なロジック実装や、アーキテクチャレベルの意思決定に強みを発揮します。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における活用シーン</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">複雑なビジネスロジックの設計相談</li>
<li class="whitespace-normal break-words">パフォーマンスチューニング戦略の策定</li>
<li class="whitespace-normal break-words">セキュリティ要件の実装方法検討</li>
<li class="whitespace-normal break-words">大規模データ移行戦略の立案</li>
</ul>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">AIエディタとSalesforce開発の相性</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Salesforce特有の開発要素への対応</h3>
<p class="whitespace-normal break-words"><strong>Apex言語の特殊性</strong> ApexはJavaライクな構文を持ちながら、Salesforceプラットフォーム特有の制約とオブジェクトモデルを持っています。AIエディタは、標準的なJavaの知識を持つ開発者でも、Salesforce特有の書き方（sObjectの操作、SOQL埋め込み、ガバナーリミット対応など）を自然に習得できるよう支援します。</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// AIエディタが提案する効率的なApexコード例</span>
<span class="token">public</span> <span class="token">class</span> <span class="token">ContactProcessor</span> <span class="token">{</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">void</span> <span class="token">updateContactsByAccount</span><span class="token">(</span><span class="token">Set</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> accountIds<span class="token">)</span> <span class="token">{</span>
        <span class="token">// バルク処理を意識したSOQL</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contactsToUpdate <span class="token">=</span> <span class="token sql language-sql">[</span>
                      <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> AccountId</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> LastName 
</span>                      <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Contact 
</span>                      <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> AccountId </span><span class="token sql language-sql">IN</span><span class="token sql language-sql"> :accountIds
</span>                  <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Contact</span> contact <span class="token">:</span> contactsToUpdate<span class="token">)</span> <span class="token">{</span>
            <span class="token">// ビジネスロジックをここに記述</span>
            contact<span class="token">.</span>LastModifiedById <span class="token">=</span> UserInfo<span class="token">.</span><span class="token">getUserId</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">// DML操作もバルク処理</span>
        <span class="token">if</span> <span class="token">(</span><span class="token">!</span>contactsToUpdate<span class="token">.</span><span class="token">isEmpty</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
            Database<span class="token">.</span><span class="token">update</span><span class="token">(</span>contactsToUpdate<span class="token">,</span> <span class="token">false</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>Lightning Web Componentsの複雑性</strong> LWCは、HTML、JavaScript、CSSの組み合わせに加え、Salesforce特有のデコレータやワイヤーサービスの理解が必要です。AIエディタは、これらの複雑な連携を自然な形で提案し、モダンなWeb開発の知識をSalesforceプラットフォームに適用できるよう支援します。</p>
<p class="whitespace-normal break-words"><strong>SOQL/SOSLの最適化</strong> データクエリの最適化は、Salesforce開発において極めて重要です。AIエディタは、パフォーマンスを考慮したクエリの作成、適切なインデックス活用、クエリプランの最適化などを支援します。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">AIエディタによる開発効率化のポイント</h3>
<p class="whitespace-normal break-words"><strong>コンテキスト理解の向上</strong> 最新のAIエディタは、単一ファイルではなくプロジェクト全体のコンテキストを理解し、一貫性のあるコード提案を行います。これにより、Salesforceの複雑なオブジェクト関係やビジネスプロセスを考慮した開発が可能になります。</p>
<p class="whitespace-normal break-words"><strong>リアルタイムコード検証</strong> コーディング中にSalesforceのガバナーリミットやセキュリティルールをチェックし、問題のあるコードパターンを事前に警告します。これにより、デバッグ時間の大幅短縮が実現できます。</p>
<p class="whitespace-normal break-words"><strong>自動テストケース生成</strong> Salesforceでは高いテストカバレッジが求められますが、AIエディタは機能的なテストケースを自動生成し、テスト品質の向上と開発時間の短縮を両立させます。</p>
<p><img loading="lazy" decoding="async" width="2474" height="1396" class="alignnone wp-image-5519 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139.png 2474w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-300x169.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-1024x578.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-768x433.png 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-1536x867.png 1536w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-2048x1156.png 2048w" sizes="auto, (max-width: 2474px) 100vw, 2474px" /></p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">コード品質向上への貢献</h3>
<p class="whitespace-normal break-words"><strong>ベストプラクティスの自動適用</strong> AIエディタは、Salesforce開発のベストプラクティス（トリガーパターン、バルク処理、エラーハンドリングなど）を自動的に適用したコードを提案します。経験の浅い開発者でも、高品質なコードを作成できるようになります。</p>
<p class="whitespace-normal break-words"><strong>セキュリティ強化</strong> CRUD権限チェック、SOQL インジェクション対策、適切な共有設定など、セキュリティに関する考慮事項を自動的に組み込んだコードを生成します。</p>
<p class="whitespace-normal break-words"><strong>保守性の向上</strong> 可読性が高く、拡張しやすいコード構造を提案することで、長期的な保守性を向上させます。また、適切なコメントやドキュメンテーションも自動生成されます。</p>
<p class="whitespace-normal break-words">以下のようなコードとコメントが自動生成されるためSalesforce特有の書き方（sObjectの操作、SOQL埋め込み、ガバナーリミット対応など）を自然に習得することができます。</p>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">実践的なVibe Coding手法</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">AIエディタを活用した具体的な開発フロー</h3>
<p class="whitespace-normal break-words"><strong>ステップ1: 要件の自然言語化</strong></p>
<p class="whitespace-normal break-words">従来の詳細設計書の代わりに、実現したい機能を自然言語で記述します。この段階では、技術的な詳細よりもビジネス価値に焦点を当てます。</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>例：「顧客からの問い合わせメールを受信したときに、自動的にケースを作成し、
適切な担当者にアサインし、顧客に自動返信を送信する機能を実装したい」</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ2: AIとの対話による要件精緻化</strong></p>
<p class="whitespace-normal break-words">AIエディタとの対話を通じて、曖昧な要件を具体的な技術要件に変換します。</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>開発者: "メール受信時の自動ケース作成機能を実装したい"
AI: "Email-to-Caseの機能実装ですね。以下の要素が必要です：
1. インバウンドメール処理のApexクラス
2. ケース作成とアサインメントロジック
3. 自動返信のEmailテンプレート
4. エラーハンドリングとログ機能

どの部分から開始しますか？"</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ3: 段階的な実装</strong></p>
<p class="whitespace-normal break-words">AIの提案に基づいて、機能を小さな単位に分割して段階的に実装します。</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// ステップ3-1: 基本的なメール処理クラス</span>
<span class="token">global</span> <span class="token">class</span> <span class="token">EmailToCaseHandler</span> <span class="token">implements</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailHandler</span> <span class="token">{</span>
    <span class="token">global</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span> <span class="token">handleInboundEmail</span><span class="token">(</span>
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmail</span> email<span class="token">,</span> 
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEnvelope</span> envelope
    <span class="token">)</span> <span class="token">{</span>
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span> result <span class="token">=</span> <span class="token">new</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">try</span> <span class="token">{</span>
            <span class="token">Case</span> newCase <span class="token">=</span> <span class="token">createCaseFromEmail</span><span class="token">(</span>email<span class="token">)</span><span class="token">;</span>
            <span class="token">assignCaseToAgent</span><span class="token">(</span>newCase<span class="token">)</span><span class="token">;</span>
            <span class="token">sendAutoReply</span><span class="token">(</span>email<span class="token">.</span>fromAddress<span class="token">,</span> newCase<span class="token">.</span>CaseNumber<span class="token">)</span><span class="token">;</span>
            result<span class="token">.</span>success <span class="token">=</span> <span class="token">true</span><span class="token">;</span>
        <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
            <span class="token">logError</span><span class="token">(</span>e<span class="token">,</span> email<span class="token">)</span><span class="token">;</span>
            result<span class="token">.</span>success <span class="token">=</span> <span class="token">false</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">return</span> result<span class="token">;</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ4: AIによる継続的改善</strong></p>
<p class="whitespace-normal break-words">実装したコードをAIがレビューし、改善提案を行います。</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// AIが提案する改善版</span>
<span class="token">global</span> <span class="token">class</span> <span class="token">EmailToCaseHandler</span> <span class="token">implements</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailHandler</span> <span class="token">{</span>
    <span class="token">// 設定値の外部化</span>
    <span class="token">private</span> <span class="token">static</span> <span class="token">final</span> <span class="token">EmailToCaseSettings__c</span> settings <span class="token">=</span> EmailToCaseSettings__c<span class="token">.</span><span class="token">getInstance</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
    
    <span class="token">global</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span> <span class="token">handleInboundEmail</span><span class="token">(</span>
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmail</span> email<span class="token">,</span> 
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEnvelope</span> envelope
    <span class="token">)</span> <span class="token">{</span>
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span> result <span class="token">=</span> <span class="token">new</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">try</span> <span class="token">{</span>
            <span class="token">// バリデーション追加</span>
            <span class="token">if</span> <span class="token">(</span><span class="token">!</span><span class="token">isValidEmail</span><span class="token">(</span>email<span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                <span class="token">throw</span> <span class="token">new</span> <span class="token">EmailValidationException</span><span class="token">(</span><span class="token">'Invalid email format'</span><span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
            
            <span class="token">Case</span> newCase <span class="token">=</span> <span class="token">createCaseFromEmail</span><span class="token">(</span>email<span class="token">)</span><span class="token">;</span>
            <span class="token">assignCaseToAgent</span><span class="token">(</span>newCase<span class="token">)</span><span class="token">;</span>
            
            <span class="token">// 非同期での自動返信（ガバナーリミット対策）</span>
            <span class="token">System</span><span class="token">.</span><span class="token">enqueueJob</span><span class="token">(</span><span class="token">new</span> <span class="token">AutoReplyQueueable</span><span class="token">(</span>email<span class="token">.</span>fromAddress<span class="token">,</span> newCase<span class="token">.</span>CaseNumber<span class="token">)</span><span class="token">)</span><span class="token">;</span>
            
            result<span class="token">.</span>success <span class="token">=</span> <span class="token">true</span><span class="token">;</span>
        <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
            <span class="token">logError</span><span class="token">(</span>e<span class="token">,</span> email<span class="token">)</span><span class="token">;</span>
            result<span class="token">.</span>success <span class="token">=</span> <span class="token">false</span><span class="token">;</span>
            result<span class="token">.</span>message <span class="token">=</span> <span class="token">'Error processing email: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">return</span> result<span class="token">;</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h2 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">プロンプトエンジニアリングのコツ</h2>
<p class="whitespace-normal break-words"><strong>効果的なプロンプトの構造</strong></p>
<ol class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7">
<li class="whitespace-normal break-words"><strong>コンテキストの明確化</strong></li>
</ol>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"Salesforceの本番環境で使用する、エンタープライズレベルのApexトリガーを作成してください。
ガバナーリミットとセキュリティを考慮した実装が必要です。"</code></pre>
</div>
</div>
<ol class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7" start="2">
<li class="whitespace-normal break-words"><strong>具体的な制約条件の提示</strong></li>
</ol>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"以下の制約を満たすLightning Web Componentを作成してください：
- 10,000件以上のレコードを効率的に表示
- モバイル対応（レスポンシブデザイン）
- Lightning Design Systemに準拠
- アクセシビリティ要件（WCAG 2.1 AA）を満たす"</code></pre>
</div>
</div>
<ol class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7" start="3">
<li class="whitespace-normal break-words"><strong>期待する出力形式の指定</strong></li>
</ol>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"以下の形式でコードを生成してください：
1. クラス全体のコード
2. 重要な部分の解説コメント
3. 使用方法の例
4. テストクラスの実装
5. 注意点とベストプラクティス"</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>反復的改善のためのプロンプト例</strong></p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"先ほど生成したApexクラスを以下の観点で改善してください：
1. パフォーマンス最適化（特にSOQL実行回数の削減）
2. エラーハンドリングの強化
3. ログ出力の改善
4. コードの可読性向上
5. 単体テストカバレッジの向上"</code></pre>
</div>
</div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">ベストプラクティス</h3>
<p class="whitespace-normal break-words"><strong>1. 段階的な開発アプローチ</strong> 一度に完璧なコードを求めるのではなく、動作する最小限の実装から始めて、段階的に機能を追加していきます。</p>
<p class="whitespace-normal break-words"><strong>2. AIの提案の検証</strong> AIが生成したコードは必ず動作確認を行い、Salesforceの制約やセキュリティ要件を満たしているかチェックします。</p>
<p class="whitespace-normal break-words"><strong>3. チーム知識の共有</strong> 効果的だったプロンプトや手法は、チーム内で共有し、組織全体のVibe Coding能力を向上させます。</p>
<p class="whitespace-normal break-words"><strong>4. 継続的学習</strong> AIエディタの新機能や改善されたプロンプト技術を継続的に学習し、開発手法をアップデートしていきます。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Salesofrceの開発に関するユースケース</h3>
<div class="cclt-compat-card st-no-shadow cclt-compat-card--text"><span class="cclt-compat-card__label" style="background-color:#cccccc;color:#ffffff;">参考</span><a href="https://creativecontentlabtokyo.com/development-use-case-vibe-coding/" class="cclt-compat-card__link"><div class="cclt-compat-card__thumb"><img decoding="async" width="300" height="169" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-300x169.jpg" class="attachment-medium size-medium wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-300x169.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-1024x576.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-768x432.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-1536x864.jpg 1536w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース.jpg 1920w" sizes="auto, (max-width: 300px) 100vw, 300px" /></div><div class="cclt-compat-card__body"><div class="cclt-compat-card__title">AIエディタを使ったVibe codingの実際の開発事例（ユースケース）</div><div class="cclt-compat-card__excerpt">AIエディタを使ったVibe codingの実際の開発事例（ユースケース） Li…</div><span class="cclt-compat-card__readmore">続きを読む</span></div></a></div>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">まとめ</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Vibe Codingがもたらす開発パラダイムの変化</h3>
<p class="whitespace-normal break-words">AIエディタを活用したVibe Codingは、Salesforce開発において従来の課題を大幅に解決し、新しい開発体験を提供しています。詳細な設計書に依存した開発から、直感的で創造的な開発へのシフトが可能になり、開発者はより高次元のビジネス価値創出に集中できるようになります。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">技術トレンドとの統合</h3>
<p class="whitespace-normal break-words"><strong>ローコード・ノーコード開発との融合</strong> AIエディタによるVibe Codingは、Salesforceのローコード・ノーコード機能と相互補完的な関係にあります。Flow Builder、Process Builder、Lightning App Builderなどの宣言的開発ツールとAIエディタを組み合わせることで、より柔軟で強力な開発環境が実現できます。</p>
<p class="whitespace-normal break-words"><strong>DevOpsとの統合</strong> CI/CDパイプライン、自動テスト、デプロイメント自動化などのDevOpsプラクティスとAIエディタを統合することで、コード生成から本番環境への展開まで一貫した自動化が可能になります。</p>
<p class="whitespace-normal break-words"><strong>アジャイル開発手法との親和性</strong> Vibe Codingの反復的で柔軟なアプローチは、アジャイル開発やスクラム手法と非常に相性が良く、スプリント内での迅速な機能開発と改善が可能になります。</p>
<h2 class="whitespace-normal break-words">続き</h2>
<p>本記事では、AIエディタやVibe codingについての用語や概念について説明してきました。AIエディタの種類やそれぞれの特徴についても理解いただけたと思います。</p>
<p>環境構築については、別の記事で紹介したいと思います。</p>
<div class="cclt-compat-kaiwa cclt-compat-kaiwa--left"><div class="cclt-compat-kaiwa__icon"><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2024/11/schooldays1.jpg" alt="サポーターさん" loading="lazy" /><span class="cclt-compat-kaiwa__name">サポーターさん</span></div><div class="cclt-compat-kaiwa__bubble" style="background-color:#f4f4e3;"><div class="cclt-compat-kaiwa__text">実際に環境を構築して、AIエディタを利用できるようにしていきましょう。</div></div></div>
<p>&nbsp;</p>
<h2>関連記事</h2>
<div class="cclt-compat-catgroup"><ul class="cclt-compat-catgroup__list"><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/develop-salesforce-with-vibe-cording-using-ai-editor/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-Vibe-coding-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-Vibe-coding-150x150.jpg 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-Vibe-coding-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">AIエディタを使ったVibe CordingでSalesforceの開発を行う【①用語の理解とツールの説明】</span><time class="cclt-compat-catgroup__date" datetime="2025-06-22T14:15:48+09:00">2025年6月22日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/development-use-case-vibe-coding/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-150x150.jpg 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">AIエディタを使ったVibe codingの実際の開発事例（ユースケース）</span><time class="cclt-compat-catgroup__date" datetime="2025-06-22T14:14:11+09:00">2025年6月22日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/2025-napkinai-guidance/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/napkin.ai_-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="napkin.ai" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/napkin.ai_-150x150.jpg 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/napkin.ai_-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">【2025年最新】Napkin AI完全ガイド-生成AIを使って効率的に資料やスライド用の文章や図解を作成しよう</span><time class="cclt-compat-catgroup__date" datetime="2025-06-08T17:32:11+09:00">2025年6月8日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/generative-ai-business-guide-for-salesforce/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/ビジネスを変革する生成AI活用-150x150.png" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/ビジネスを変革する生成AI活用-150x150.png 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/ビジネスを変革する生成AI活用-100x100.png 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">ビジネスを変革する生成AI「ジェネレーティブAI（Generative AI）」活用ガイド</span><time class="cclt-compat-catgroup__date" datetime="2025-06-03T13:38:22+09:00">2025年6月3日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/what-is-generative-ai/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2021/10/eye-catching-picture-work-3-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2021/10/eye-catching-picture-work-3-150x150.jpg 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2021/10/eye-catching-picture-work-3-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">生成AIとは？初心者向け完全ガイド：基本から活用方法まで徹底解説</span><time class="cclt-compat-catgroup__date" datetime="2025-06-02T19:16:16+09:00">2025年6月2日</time></div></a></li></ul></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AIエディタを使ったVibe codingの実際の開発事例（ユースケース）</title>
		<link>https://creativecontentlabtokyo.com/development-use-case-vibe-coding/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 22 Jun 2025 05:14:11 +0000</pubDate>
				<category><![CDATA[生成AI（Generative AI）]]></category>
		<category><![CDATA[AIエディタ]]></category>
		<category><![CDATA[Apex]]></category>
		<category><![CDATA[LWC]]></category>
		<category><![CDATA[Vibe coding]]></category>
		<category><![CDATA[コーディング]]></category>
		<category><![CDATA[ユースケース]]></category>
		<category><![CDATA[生成AI]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/?p=5524</guid>

					<description><![CDATA[AIエディタを使ったVibe codingの実際の開発事例（ユースケース） Lightning Web Componentの開発例 要件：顧客管理ダッシュボード…]]></description>
										<content:encoded><![CDATA[<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">AIエディタを使ったVibe codingの実際の開発事例（ユースケース）</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Lightning Web Componentの開発例</h3>
<p class="whitespace-normal break-words"><strong>要件：顧客管理ダッシュボードの作成</strong></p>
<p class="whitespace-normal break-words">自然言語での要求：</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"取引先の情報を表示し、関連する商談と取引先責任者を
タブ形式で切り替えて表示できるダッシュボードコンポーネントを作成したい。
リアルタイムでデータを更新し、Excel出力機能も必要。"</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>AIエディタによる段階的実装</strong></p>
<p class="whitespace-normal break-words"><strong>ステップ1: 基本構造の生成</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">html</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-html"><span class="token">&lt;!-- accountDashboard.html --&gt;</span>
<span class="token">&lt;</span><span class="token">template</span><span class="token">&gt;</span>
    <span class="token">&lt;</span><span class="token">lightning-card</span> <span class="token">title</span><span class="token">=</span><span class="token">"</span><span class="token">顧客管理ダッシュボード</span><span class="token">"</span> <span class="token">icon-name</span><span class="token">=</span><span class="token">"</span><span class="token">standard:account</span><span class="token">"</span><span class="token">&gt;</span>
        <span class="token">&lt;</span><span class="token">div</span> <span class="token">slot</span><span class="token">=</span><span class="token">"</span><span class="token">actions</span><span class="token">"</span><span class="token">&gt;</span>
            <span class="token">&lt;</span><span class="token">lightning-button</span> 
                <span class="token">label</span><span class="token">=</span><span class="token">"</span><span class="token">Excel出力</span><span class="token">"</span> 
                <span class="token special-attr">onclick</span><span class="token special-attr">=</span><span class="token special-attr javascript language-javascript">{</span><span class="token special-attr javascript language-javascript">exportToExcel</span><span class="token special-attr javascript language-javascript">}</span>
                <span class="token">variant</span><span class="token">=</span><span class="token">"</span><span class="token">brand</span><span class="token">"</span><span class="token">&gt;</span>
            <span class="token">&lt;/</span><span class="token">lightning-button</span><span class="token">&gt;</span>
        <span class="token">&lt;/</span><span class="token">div</span><span class="token">&gt;</span>
        
        <span class="token">&lt;</span><span class="token">lightning-tabset</span><span class="token">&gt;</span>
            <span class="token">&lt;</span><span class="token">lightning-tab</span> <span class="token">label</span><span class="token">=</span><span class="token">"</span><span class="token">取引先情報</span><span class="token">"</span> <span class="token">value</span><span class="token">=</span><span class="token">"</span><span class="token">account</span><span class="token">"</span><span class="token">&gt;</span>
                <span class="token">&lt;</span><span class="token">c-account-detail</span> <span class="token">account-id</span><span class="token">=</span><span class="token">{accountId}</span><span class="token">&gt;</span><span class="token">&lt;/</span><span class="token">c-account-detail</span><span class="token">&gt;</span>
            <span class="token">&lt;/</span><span class="token">lightning-tab</span><span class="token">&gt;</span>
            
            <span class="token">&lt;</span><span class="token">lightning-tab</span> <span class="token">label</span><span class="token">=</span><span class="token">"</span><span class="token">商談</span><span class="token">"</span> <span class="token">value</span><span class="token">=</span><span class="token">"</span><span class="token">opportunities</span><span class="token">"</span><span class="token">&gt;</span>
                <span class="token">&lt;</span><span class="token">c-opportunity-list</span> <span class="token">account-id</span><span class="token">=</span><span class="token">{accountId}</span><span class="token">&gt;</span><span class="token">&lt;/</span><span class="token">c-opportunity-list</span><span class="token">&gt;</span>
            <span class="token">&lt;/</span><span class="token">lightning-tab</span><span class="token">&gt;</span>
            
            <span class="token">&lt;</span><span class="token">lightning-tab</span> <span class="token">label</span><span class="token">=</span><span class="token">"</span><span class="token">取引先責任者</span><span class="token">"</span> <span class="token">value</span><span class="token">=</span><span class="token">"</span><span class="token">contacts</span><span class="token">"</span><span class="token">&gt;</span>
                <span class="token">&lt;</span><span class="token">c-contact-list</span> <span class="token">account-id</span><span class="token">=</span><span class="token">{accountId}</span><span class="token">&gt;</span><span class="token">&lt;/</span><span class="token">c-contact-list</span><span class="token">&gt;</span>
            <span class="token">&lt;/</span><span class="token">lightning-tab</span><span class="token">&gt;</span>
        <span class="token">&lt;/</span><span class="token">lightning-tabset</span><span class="token">&gt;</span>
    <span class="token">&lt;/</span><span class="token">lightning-card</span><span class="token">&gt;</span>
<span class="token">&lt;/</span><span class="token">template</span><span class="token">&gt;</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ2: JavaScriptコントローラーの実装</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">javascript</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-javascript"><span class="token">// accountDashboard.js</span>
<span class="token module">import</span> <span class="token imports">{</span> <span class="token imports maybe-class-name">LightningElement</span><span class="token imports">,</span><span class="token imports"> api</span><span class="token imports">,</span><span class="token imports"> wire</span><span class="token imports">,</span><span class="token imports"> track </span><span class="token imports">}</span> <span class="token module">from</span> <span class="token">'lwc'</span><span class="token">;</span>
<span class="token module">import</span> <span class="token imports">{</span><span class="token imports"> refreshApex </span><span class="token imports">}</span> <span class="token module">from</span> <span class="token">'@salesforce/apex'</span><span class="token">;</span>
<span class="token module">import</span> <span class="token imports">getAccountData</span> <span class="token module">from</span> <span class="token">'@salesforce/apex/AccountDashboardController.getAccountData'</span><span class="token">;</span>
<span class="token module">import</span> <span class="token imports">exportAccountData</span> <span class="token module">from</span> <span class="token">'@salesforce/apex/AccountDashboardController.exportAccountData'</span><span class="token">;</span>
<span class="token module">import</span> <span class="token imports">{</span> <span class="token imports maybe-class-name">ShowToastEvent</span> <span class="token imports">}</span> <span class="token module">from</span> <span class="token">'lightning/platformShowToastEvent'</span><span class="token">;</span>

<span class="token module">export</span> <span class="token module">default</span> <span class="token">class</span> <span class="token">AccountDashboard</span> <span class="token">extends</span> <span class="token">LightningElement</span> <span class="token">{</span>
    @api accountId<span class="token">;</span>
    @track accountData<span class="token">;</span>
    wiredAccountData<span class="token">;</span>

    @<span class="token">wire</span><span class="token">(</span>getAccountData<span class="token">,</span> <span class="token">{</span> <span class="token literal-property">accountId</span><span class="token">:</span> <span class="token">'$accountId'</span> <span class="token">}</span><span class="token">)</span>
    <span class="token">wireAccountData</span><span class="token">(</span><span class="token parameter">result</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">this</span><span class="token">.</span><span class="token property-access">wiredAccountData</span> <span class="token">=</span> result<span class="token">;</span>
        <span class="token control-flow">if</span> <span class="token">(</span>result<span class="token">.</span><span class="token property-access">data</span><span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span><span class="token property-access">accountData</span> <span class="token">=</span> result<span class="token">.</span><span class="token property-access">data</span><span class="token">;</span>
        <span class="token">}</span> <span class="token control-flow">else</span> <span class="token control-flow">if</span> <span class="token">(</span>result<span class="token">.</span><span class="token property-access">error</span><span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'エラー'</span><span class="token">,</span> result<span class="token">.</span><span class="token property-access">error</span><span class="token">.</span><span class="token property-access">body</span><span class="token">.</span><span class="token property-access">message</span><span class="token">,</span> <span class="token">'error'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token">async</span> <span class="token">handleRefresh</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token control-flow">try</span> <span class="token">{</span>
            <span class="token control-flow">await</span> <span class="token">refreshApex</span><span class="token">(</span><span class="token">this</span><span class="token">.</span><span class="token property-access">wiredAccountData</span><span class="token">)</span><span class="token">;</span>
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'成功'</span><span class="token">,</span> <span class="token">'データが更新されました'</span><span class="token">,</span> <span class="token">'success'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span> <span class="token control-flow">catch</span> <span class="token">(</span>error<span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'エラー'</span><span class="token">,</span> <span class="token">'データの更新に失敗しました'</span><span class="token">,</span> <span class="token">'error'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token">async</span> <span class="token">exportToExcel</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token control-flow">try</span> <span class="token">{</span>
            <span class="token">const</span> result <span class="token">=</span> <span class="token control-flow">await</span> <span class="token">exportAccountData</span><span class="token">(</span><span class="token">{</span> <span class="token literal-property">accountId</span><span class="token">:</span> <span class="token">this</span><span class="token">.</span><span class="token property-access">accountId</span> <span class="token">}</span><span class="token">)</span><span class="token">;</span>
            <span class="token">// ファイルダウンロード処理</span>
            <span class="token">const</span> link <span class="token">=</span> <span class="token dom">document</span><span class="token">.</span><span class="token method property-access">createElement</span><span class="token">(</span><span class="token">'a'</span><span class="token">)</span><span class="token">;</span>
            link<span class="token">.</span><span class="token property-access">href</span> <span class="token">=</span> <span class="token">'data:application/vnd.ms-excel;base64,'</span> <span class="token">+</span> result<span class="token">;</span>
            link<span class="token">.</span><span class="token property-access">download</span> <span class="token">=</span> <span class="token template-string template-punctuation">`</span><span class="token template-string">account_</span><span class="token template-string interpolation">${</span><span class="token template-string interpolation">this</span><span class="token template-string interpolation">.</span><span class="token template-string interpolation property-access">accountId</span><span class="token template-string interpolation">}</span><span class="token template-string">_data.xlsx</span><span class="token template-string template-punctuation">`</span><span class="token">;</span>
            link<span class="token">.</span><span class="token method property-access">click</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
            
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'成功'</span><span class="token">,</span> <span class="token">'Excelファイルをダウンロードしました'</span><span class="token">,</span> <span class="token">'success'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span> <span class="token control-flow">catch</span> <span class="token">(</span>error<span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'エラー'</span><span class="token">,</span> <span class="token">'Excel出力に失敗しました'</span><span class="token">,</span> <span class="token">'error'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token">showToast</span><span class="token">(</span><span class="token parameter">title</span><span class="token parameter">,</span><span class="token parameter"> message</span><span class="token parameter">,</span><span class="token parameter"> variant</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">this</span><span class="token">.</span><span class="token method property-access">dispatchEvent</span><span class="token">(</span><span class="token">new</span> <span class="token">ShowToastEvent</span><span class="token">(</span><span class="token">{</span>
            <span class="token literal-property">title</span><span class="token">:</span> title<span class="token">,</span>
            <span class="token literal-property">message</span><span class="token">:</span> message<span class="token">,</span>
            <span class="token literal-property">variant</span><span class="token">:</span> variant
        <span class="token">}</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ3: Apexコントローラーの実装</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">public</span> <span class="token">with sharing</span> <span class="token">class</span> <span class="token">AccountDashboardController</span> <span class="token">{</span>
    
    <span class="token annotation">@AuraEnabled</span><span class="token">(</span>cacheable<span class="token">=</span><span class="token">true</span><span class="token">)</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">AccountDataWrapper</span> <span class="token">getAccountData</span><span class="token">(</span><span class="token">Id</span> accountId<span class="token">)</span> <span class="token">{</span>
        <span class="token">try</span> <span class="token">{</span>
            <span class="token">if</span> <span class="token">(</span><span class="token">!</span>Schema<span class="token">.</span>sObjectType<span class="token">.</span>Account<span class="token">.</span><span class="token">isAccessible</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'取引先への読み取り権限がありません'</span><span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>

            <span class="token">Account</span> account <span class="token">=</span> <span class="token sql language-sql">[</span>
                <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> BillingAddress</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Phone</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Website</span><span class="token sql language-sql">,</span> 
<span class="token sql language-sql">                       AnnualRevenue</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> NumberOfEmployees</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Industry
</span>                <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Account 
</span>                <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :accountId 
</span>                <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
            <span class="token sql language-sql">]</span><span class="token">;</span>

            <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> opportunities <span class="token">=</span> <span class="token sql language-sql">[</span>
                <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> StageName</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Amount</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> CloseDate
</span>                <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>                <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> AccountId </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :accountId 
</span>                <span class="token sql language-sql">ORDER</span> <span class="token sql language-sql">BY</span><span class="token sql language-sql"> CloseDate </span><span class="token sql language-sql">DESC</span>
                <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">10</span>
            <span class="token sql language-sql">]</span><span class="token">;</span>

            <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contacts <span class="token">=</span> <span class="token sql language-sql">[</span>
                <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Email</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Phone</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Title
</span>                <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Contact 
</span>                <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> AccountId </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :accountId 
</span>                <span class="token sql language-sql">ORDER</span> <span class="token sql language-sql">BY</span><span class="token sql language-sql"> LastModifiedDate </span><span class="token sql language-sql">DESC</span>
                <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">20</span>
            <span class="token sql language-sql">]</span><span class="token">;</span>

            <span class="token">return</span> <span class="token">new</span> <span class="token">AccountDataWrapper</span><span class="token">(</span>account<span class="token">,</span> opportunities<span class="token">,</span> contacts<span class="token">)</span><span class="token">;</span>
            
        <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
            <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'データの取得に失敗しました: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token annotation">@AuraEnabled</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">String</span> <span class="token">exportAccountData</span><span class="token">(</span><span class="token">Id</span> accountId<span class="token">)</span> <span class="token">{</span>
        <span class="token">try</span> <span class="token">{</span>
            <span class="token">AccountDataWrapper</span> data <span class="token">=</span> <span class="token">getAccountData</span><span class="token">(</span>accountId<span class="token">)</span><span class="token">;</span>
            
            <span class="token">// Excel生成ロジック（簡略化）</span>
            <span class="token">String</span> csvData <span class="token">=</span> <span class="token">generateCSVData</span><span class="token">(</span>data<span class="token">)</span><span class="token">;</span>
            <span class="token">return</span> EncodingUtil<span class="token">.</span><span class="token">base64Encode</span><span class="token">(</span><span class="token">Blob</span><span class="token">.</span><span class="token">valueOf</span><span class="token">(</span>csvData<span class="token">)</span><span class="token">)</span><span class="token">;</span>
            
        <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
            <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'Excel出力に失敗しました: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token">private</span> <span class="token">static</span> <span class="token">String</span> <span class="token">generateCSVData</span><span class="token">(</span><span class="token">AccountDataWrapper</span> data<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">String</span><span class="token">&gt;</span> csvLines <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">String</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// ヘッダー</span>
        csvLines<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">'タイプ,名前,ステージ/タイトル,金額/メール,完了日/電話'</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 取引先データ</span>
        csvLines<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">String</span><span class="token">.</span><span class="token">format</span><span class="token">(</span><span class="token">'取引先,{0},{1},{2},{3}'</span><span class="token">,</span> 
            <span class="token">new</span> <span class="token">String</span><span class="token">[</span><span class="token">]</span><span class="token">{</span>
                data<span class="token">.</span>account<span class="token">.</span>Name<span class="token">,</span>
                data<span class="token">.</span>account<span class="token">.</span>Industry<span class="token">,</span>
                <span class="token">String</span><span class="token">.</span><span class="token">valueOf</span><span class="token">(</span>data<span class="token">.</span>account<span class="token">.</span>AnnualRevenue<span class="token">)</span><span class="token">,</span>
                data<span class="token">.</span>account<span class="token">.</span>Phone
            <span class="token">}</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 商談データ</span>
        <span class="token">for</span> <span class="token">(</span><span class="token">Opportunity</span> opp <span class="token">:</span> data<span class="token">.</span>opportunities<span class="token">)</span> <span class="token">{</span>
            csvLines<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">String</span><span class="token">.</span><span class="token">format</span><span class="token">(</span><span class="token">'商談,{0},{1},{2},{3}'</span><span class="token">,</span> 
                <span class="token">new</span> <span class="token">String</span><span class="token">[</span><span class="token">]</span><span class="token">{</span>
                    opp<span class="token">.</span>Name<span class="token">,</span>
                    opp<span class="token">.</span>StageName<span class="token">,</span>
                    <span class="token">String</span><span class="token">.</span><span class="token">valueOf</span><span class="token">(</span>opp<span class="token">.</span>Amount<span class="token">)</span><span class="token">,</span>
                    <span class="token">String</span><span class="token">.</span><span class="token">valueOf</span><span class="token">(</span>opp<span class="token">.</span>CloseDate<span class="token">)</span>
                <span class="token">}</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">return</span> <span class="token">String</span><span class="token">.</span><span class="token">join</span><span class="token">(</span>csvLines<span class="token">,</span> <span class="token">'\n'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>

    <span class="token">public</span> <span class="token">class</span> <span class="token">AccountDataWrapper</span> <span class="token">{</span>
        <span class="token annotation">@AuraEnabled</span> <span class="token">public</span> <span class="token">Account</span> account <span class="token">{</span> <span class="token">get</span><span class="token">;</span> <span class="token">set</span><span class="token">;</span> <span class="token">}</span>
        <span class="token annotation">@AuraEnabled</span> <span class="token">public</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> opportunities <span class="token">{</span> <span class="token">get</span><span class="token">;</span> <span class="token">set</span><span class="token">;</span> <span class="token">}</span>
        <span class="token annotation">@AuraEnabled</span> <span class="token">public</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contacts <span class="token">{</span> <span class="token">get</span><span class="token">;</span> <span class="token">set</span><span class="token">;</span> <span class="token">}</span>
        
        <span class="token">public</span> <span class="token">AccountDataWrapper</span><span class="token">(</span><span class="token">Account</span> acc<span class="token">,</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> opps<span class="token">,</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> cons<span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span>account <span class="token">=</span> acc<span class="token">;</span>
            <span class="token">this</span><span class="token">.</span>opportunities <span class="token">=</span> opps<span class="token">;</span>
            <span class="token">this</span><span class="token">.</span>contacts <span class="token">=</span> cons<span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Apex クラスの実装例</h3>
<p class="whitespace-normal break-words"><strong>要件：複雑な承認プロセスの自動化</strong></p>
<p class="whitespace-normal break-words">自然言語での要求：</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"商談の金額に応じて、異なる承認者ルートを自動設定し、
承認状況をリアルタイムで追跡できるシステムを実装したい。
承認者の不在時は代理承認者に自動エスカレーションする機能も必要。"</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>AIエディタによる実装</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">public</span> <span class="token">class</span> <span class="token">OpportunityApprovalManager</span> <span class="token">{</span>
    
    <span class="token">// 承認ルール設定</span>
    <span class="token">private</span> <span class="token">static</span> <span class="token">final</span> <span class="token">Map</span><span class="token">&lt;</span><span class="token">Decimal</span><span class="token">,</span> <span class="token">String</span><span class="token">&gt;</span> APPROVAL_RULES <span class="token">=</span> <span class="token">new</span> <span class="token">Map</span><span class="token">&lt;</span><span class="token">Decimal</span><span class="token">,</span> <span class="token">String</span><span class="token">&gt;</span><span class="token">{</span>
        <span class="token">100000</span> <span class="token">=</span><span class="token">&gt;</span> <span class="token">'MANAGER_APPROVAL'</span><span class="token">,</span>
        <span class="token">500000</span> <span class="token">=</span><span class="token">&gt;</span> <span class="token">'DIRECTOR_APPROVAL'</span><span class="token">,</span>
        <span class="token">1000000</span> <span class="token">=</span><span class="token">&gt;</span> <span class="token">'VP_APPROVAL'</span><span class="token">,</span>
        <span class="token">5000000</span> <span class="token">=</span><span class="token">&gt;</span> <span class="token">'EXECUTIVE_APPROVAL'</span>
    <span class="token">}</span><span class="token">;</span>
    
    <span class="token annotation">@InvocableMethod</span><span class="token">(</span>label<span class="token">=</span><span class="token">'承認プロセス開始'</span><span class="token">)</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> <span class="token">initiateApprovalProcess</span><span class="token">(</span><span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalResult</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">ApprovalRequest</span> request <span class="token">:</span> requests<span class="token">)</span> <span class="token">{</span>
            <span class="token">try</span> <span class="token">{</span>
                <span class="token">ApprovalResult</span> result <span class="token">=</span> <span class="token">processOpportunityApproval</span><span class="token">(</span>request<span class="token">.</span>opportunityId<span class="token">)</span><span class="token">;</span>
                results<span class="token">.</span><span class="token">add</span><span class="token">(</span>result<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
                <span class="token">ApprovalResult</span> errorResult <span class="token">=</span> <span class="token">new</span> <span class="token">ApprovalResult</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
                errorResult<span class="token">.</span>success <span class="token">=</span> <span class="token">false</span><span class="token">;</span>
                errorResult<span class="token">.</span>message <span class="token">=</span> <span class="token">'エラー: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
                errorResult<span class="token">.</span>opportunityId <span class="token">=</span> request<span class="token">.</span>opportunityId<span class="token">;</span>
                results<span class="token">.</span><span class="token">add</span><span class="token">(</span>errorResult<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
        
        <span class="token">return</span> results<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">ApprovalResult</span> <span class="token">processOpportunityApproval</span><span class="token">(</span><span class="token">Id</span> opportunityId<span class="token">)</span> <span class="token">{</span>
        <span class="token">// 商談データの取得</span>
        <span class="token">Opportunity</span> opp <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Amount</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> OwnerId</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> StageName</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Account</span><span class="token sql language-sql">.</span><span class="token sql language-sql">OwnerId
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :opportunityId 
</span>            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">// 承認レベルの決定</span>
        <span class="token">String</span> approvalLevel <span class="token">=</span> <span class="token">determineApprovalLevel</span><span class="token">(</span>opp<span class="token">.</span>Amount<span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 承認者の特定</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> approvers <span class="token">=</span> <span class="token">getApprovers</span><span class="token">(</span>opp<span class="token">,</span> approvalLevel<span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 承認プロセスの作成</span>
        <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessSubmitRequest</span> req <span class="token">=</span> <span class="token">new</span> <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessSubmitRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setComments</span><span class="token">(</span><span class="token">'システムによる自動承認申請'</span><span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setObjectId</span><span class="token">(</span>opportunityId<span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setSubmitterId</span><span class="token">(</span>UserInfo<span class="token">.</span><span class="token">getUserId</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setProcessDefinitionNameOrId</span><span class="token">(</span><span class="token">'OpportunityApprovalProcess'</span><span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setSkipEntryCriteria</span><span class="token">(</span><span class="token">false</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 承認申請の実行</span>
        <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessResult</span> result <span class="token">=</span> Approval<span class="token">.</span><span class="token">process</span><span class="token">(</span>req<span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 結果の作成</span>
        <span class="token">ApprovalResult</span> approvalResult <span class="token">=</span> <span class="token">new</span> <span class="token">ApprovalResult</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        approvalResult<span class="token">.</span>success <span class="token">=</span> result<span class="token">.</span><span class="token">isSuccess</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        approvalResult<span class="token">.</span>opportunityId <span class="token">=</span> opportunityId<span class="token">;</span>
        approvalResult<span class="token">.</span>processInstanceId <span class="token">=</span> result<span class="token">.</span><span class="token">getInstanceId</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        approvalResult<span class="token">.</span>message <span class="token">=</span> result<span class="token">.</span><span class="token">isSuccess</span><span class="token">(</span><span class="token">)</span> <span class="token">?</span> 
            <span class="token">'承認プロセスが開始されました'</span> <span class="token">:</span> 
            <span class="token">'承認プロセスの開始に失敗しました: '</span> <span class="token">+</span> <span class="token">String</span><span class="token">.</span><span class="token">join</span><span class="token">(</span>result<span class="token">.</span><span class="token">getErrors</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">', '</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 承認状況の追跡レコード作成</span>
        <span class="token">createApprovalTracking</span><span class="token">(</span>opp<span class="token">,</span> approvers<span class="token">,</span> result<span class="token">.</span><span class="token">getInstanceId</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">return</span> approvalResult<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">String</span> <span class="token">determineApprovalLevel</span><span class="token">(</span><span class="token">Decimal</span> amount<span class="token">)</span> <span class="token">{</span>
        <span class="token">if</span> <span class="token">(</span>amount <span class="token">==</span> <span class="token">null</span><span class="token">)</span> <span class="token">return</span> <span class="token">'MANAGER_APPROVAL'</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Decimal</span><span class="token">&gt;</span> thresholds <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Decimal</span><span class="token">&gt;</span><span class="token">(</span>APPROVAL_RULES<span class="token">.</span><span class="token">keySet</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        thresholds<span class="token">.</span><span class="token">sort</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Decimal</span> threshold <span class="token">:</span> thresholds<span class="token">)</span> <span class="token">{</span>
            <span class="token">if</span> <span class="token">(</span>amount <span class="token">&lt;=</span> threshold<span class="token">)</span> <span class="token">{</span>
                <span class="token">return</span> APPROVAL_RULES<span class="token">.</span><span class="token">get</span><span class="token">(</span>threshold<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
        
        <span class="token">return</span> <span class="token">'EXECUTIVE_APPROVAL'</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> <span class="token">getApprovers</span><span class="token">(</span><span class="token">Opportunity</span> opp<span class="token">,</span> <span class="token">String</span> approvalLevel<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> approvers <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// ユーザーの役職情報を取得</span>
        <span class="token">User</span> owner <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> ManagerId</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Department
</span>            <span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :opp</span><span class="token sql language-sql">.</span><span class="token sql language-sql">OwnerId 
</span>            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">switch</span> <span class="token">on</span> approvalLevel <span class="token">{</span>
            <span class="token">when</span> <span class="token">'MANAGER_APPROVAL'</span> <span class="token">{</span>
                <span class="token">if</span> <span class="token">(</span>owner<span class="token">.</span>ManagerId <span class="token">!=</span> <span class="token">null</span><span class="token">)</span> <span class="token">{</span>
                    approvers<span class="token">.</span><span class="token">add</span><span class="token">(</span>owner<span class="token">.</span>ManagerId<span class="token">)</span><span class="token">;</span>
                <span class="token">}</span>
            <span class="token">}</span>
            <span class="token">when</span> <span class="token">'DIRECTOR_APPROVAL'</span> <span class="token">{</span>
                <span class="token">// 部門ディレクターを検索</span>
                <span class="token">List</span><span class="token">&lt;</span><span class="token">User</span><span class="token">&gt;</span> directors <span class="token">=</span> <span class="token sql language-sql">[</span>
                    <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
                    <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%Director%'</span> 
                    <span class="token sql language-sql">AND</span><span class="token sql language-sql"> Department </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :owner</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Department 
</span>                    <span class="token sql language-sql">AND</span><span class="token sql language-sql"> IsActive </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">true</span>
                    <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">3</span>
                <span class="token sql language-sql">]</span><span class="token">;</span>
                <span class="token">for</span> <span class="token">(</span><span class="token">User</span> director <span class="token">:</span> directors<span class="token">)</span> <span class="token">{</span>
                    approvers<span class="token">.</span><span class="token">add</span><span class="token">(</span>director<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
                <span class="token">}</span>
            <span class="token">}</span>
            <span class="token">when</span> <span class="token">'VP_APPROVAL'</span> <span class="token">{</span>
                <span class="token">// VP以上の役職者を検索</span>
                <span class="token">List</span><span class="token">&lt;</span><span class="token">User</span><span class="token">&gt;</span> vps <span class="token">=</span> <span class="token sql language-sql">[</span>
                    <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
                    <span class="token sql language-sql">WHERE</span> <span class="token sql language-sql">(</span><span class="token sql language-sql">UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%VP%'</span> <span class="token sql language-sql">OR</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%Vice President%'</span><span class="token sql language-sql">)</span>
                    <span class="token sql language-sql">AND</span><span class="token sql language-sql"> IsActive </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">true</span>
                    <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">5</span>
                <span class="token sql language-sql">]</span><span class="token">;</span>
                <span class="token">for</span> <span class="token">(</span><span class="token">User</span> vp <span class="token">:</span> vps<span class="token">)</span> <span class="token">{</span>
                    approvers<span class="token">.</span><span class="token">add</span><span class="token">(</span>vp<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
                <span class="token">}</span>
            <span class="token">}</span>
            <span class="token">when</span> <span class="token">'EXECUTIVE_APPROVAL'</span> <span class="token">{</span>
                <span class="token">// 役員クラスを検索</span>
                <span class="token">List</span><span class="token">&lt;</span><span class="token">User</span><span class="token">&gt;</span> executives <span class="token">=</span> <span class="token sql language-sql">[</span>
                    <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
                    <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%Executive%'</span> 
                    <span class="token sql language-sql">OR</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%CEO%'</span>
                    <span class="token sql language-sql">OR</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%President%'</span>
                    <span class="token sql language-sql">AND</span><span class="token sql language-sql"> IsActive </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">true</span>
                    <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">5</span>
                <span class="token sql language-sql">]</span><span class="token">;</span>
                <span class="token">for</span> <span class="token">(</span><span class="token">User</span> exec <span class="token">:</span> executives<span class="token">)</span> <span class="token">{</span>
                    approvers<span class="token">.</span><span class="token">add</span><span class="token">(</span>exec<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
                <span class="token">}</span>
            <span class="token">}</span>
        <span class="token">}</span>
        
        <span class="token">return</span> approvers<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">void</span> <span class="token">createApprovalTracking</span><span class="token">(</span><span class="token">Opportunity</span> opp<span class="token">,</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> approvers<span class="token">,</span> <span class="token">Id</span> processInstanceId<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalTracking__c</span><span class="token">&gt;</span> trackingRecords <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalTracking__c</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Id</span> approverId <span class="token">:</span> approvers<span class="token">)</span> <span class="token">{</span>
            <span class="token">ApprovalTracking__c</span> tracking <span class="token">=</span> <span class="token">new</span> <span class="token">ApprovalTracking__c</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
            tracking<span class="token">.</span>Opportunity__c <span class="token">=</span> opp<span class="token">.</span>Id<span class="token">;</span>
            tracking<span class="token">.</span>Approver__c <span class="token">=</span> approverId<span class="token">;</span>
            tracking<span class="token">.</span>ProcessInstanceId__c <span class="token">=</span> processInstanceId<span class="token">;</span>
            tracking<span class="token">.</span>Status__c <span class="token">=</span> <span class="token">'Pending'</span><span class="token">;</span>
            tracking<span class="token">.</span>CreatedDate__c <span class="token">=</span> <span class="token">System</span><span class="token">.</span><span class="token">now</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
            trackingRecords<span class="token">.</span><span class="token">add</span><span class="token">(</span>tracking<span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">if</span> <span class="token">(</span><span class="token">!</span>trackingRecords<span class="token">.</span><span class="token">isEmpty</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
            <span class="token">insert</span> trackingRecords<span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>
    
    <span class="token">// 代理承認者への自動エスカレーション</span>
    <span class="token annotation">@future</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">void</span> <span class="token">checkForEscalation</span><span class="token">(</span><span class="token">Set</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> processInstanceIds<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ProcessInstance</span><span class="token">&gt;</span> processes <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span> <span class="token sql language-sql">Status</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> CreatedDate</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> TargetObjectId
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> ProcessInstance 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">IN</span><span class="token sql language-sql"> :processInstanceIds
</span>            <span class="token sql language-sql">AND</span> <span class="token sql language-sql">Status</span> <span class="token sql language-sql">=</span> <span class="token sql language-sql">'Pending'</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">ProcessInstance</span> process <span class="token">:</span> processes<span class="token">)</span> <span class="token">{</span>
            <span class="token">// 24時間経過した場合のエスカレーション</span>
            <span class="token">if</span> <span class="token">(</span>process<span class="token">.</span>CreatedDate<span class="token">.</span><span class="token">addHours</span><span class="token">(</span><span class="token">24</span><span class="token">)</span> <span class="token">&lt;</span> <span class="token">System</span><span class="token">.</span><span class="token">now</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                <span class="token">escalateToDelegate</span><span class="token">(</span>process<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">void</span> <span class="token">escalateToDelegate</span><span class="token">(</span><span class="token">Id</span> processInstanceId<span class="token">)</span> <span class="token">{</span>
        <span class="token">// 現在の承認者を取得</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ProcessInstanceWorkitem</span><span class="token">&gt;</span> workitems <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> ActorId</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> ProcessInstanceId
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> ProcessInstanceWorkitem 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> ProcessInstanceId </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :processInstanceId
</span>        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">ProcessInstanceWorkitem</span> workitem <span class="token">:</span> workitems<span class="token">)</span> <span class="token">{</span>
            <span class="token">// 代理承認者を検索</span>
            <span class="token">List</span><span class="token">&lt;</span><span class="token">User</span><span class="token">&gt;</span> delegates <span class="token">=</span> <span class="token sql language-sql">[</span>
                <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
                <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> ManagerId </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :workitem</span><span class="token sql language-sql">.</span><span class="token sql language-sql">ActorId 
</span>                <span class="token sql language-sql">AND</span><span class="token sql language-sql"> IsActive </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">true</span>
                <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
            <span class="token sql language-sql">]</span><span class="token">;</span>
            
            <span class="token">if</span> <span class="token">(</span><span class="token">!</span>delegates<span class="token">.</span><span class="token">isEmpty</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                <span class="token">// 代理承認者に再アサイン</span>
                <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessWorkitemRequest</span> req <span class="token">=</span> <span class="token">new</span> <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessWorkitemRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
                req<span class="token">.</span><span class="token">setComments</span><span class="token">(</span><span class="token">'自動エスカレーション: 代理承認者へのアサイン'</span><span class="token">)</span><span class="token">;</span>
                req<span class="token">.</span><span class="token">setAction</span><span class="token">(</span><span class="token">'Reassign'</span><span class="token">)</span><span class="token">;</span>
                req<span class="token">.</span><span class="token">setWorkitemId</span><span class="token">(</span>workitem<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
                req<span class="token">.</span><span class="token">setNewActorIds</span><span class="token">(</span><span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span><span class="token">{</span>delegates<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>Id<span class="token">}</span><span class="token">)</span><span class="token">;</span>
                
                Approval<span class="token">.</span><span class="token">process</span><span class="token">(</span>req<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
    <span class="token">}</span>
    
    <span class="token">// データクラス</span>
    <span class="token">public</span> <span class="token">class</span> <span class="token">ApprovalRequest</span> <span class="token">{</span>
        <span class="token annotation">@InvocableVariable</span><span class="token">(</span>required<span class="token">=</span><span class="token">true</span><span class="token">)</span>
        <span class="token">public</span> <span class="token">Id</span> opportunityId<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">public</span> <span class="token">class</span> <span class="token">ApprovalResult</span> <span class="token">{</span>
        <span class="token annotation">@InvocableVariable</span>
        <span class="token">public</span> <span class="token">Boolean</span> success<span class="token">;</span>
        <span class="token annotation">@InvocableVariable</span>
        <span class="token">public</span> <span class="token">String</span> message<span class="token">;</span>
        <span class="token annotation">@InvocableVariable</span>
        <span class="token">public</span> <span class="token">Id</span> opportunityId<span class="token">;</span>
        <span class="token annotation">@InvocableVariable</span>
        <span class="token">public</span> <span class="token">Id</span> processInstanceId<span class="token">;</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">テストコードの自動生成</h3>
<p class="whitespace-normal break-words"><strong>AIエディタによるテストクラスの生成</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token annotation">@isTest</span>
<span class="token">public</span> <span class="token">class</span> <span class="token">OpportunityApprovalManagerTest</span> <span class="token">{</span>
    
    <span class="token annotation">@TestSetup</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">setupTestData</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">// テスト用のユーザー作成</span>
        <span class="token">Profile</span> profile <span class="token">=</span> <span class="token sql language-sql">[</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Profile </span><span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">'Standard User'</span> <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span><span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">User</span> manager <span class="token">=</span> <span class="token">new</span> <span class="token">User</span><span class="token">(</span>
            FirstName <span class="token">=</span> <span class="token">'Test'</span><span class="token">,</span>
            LastName <span class="token">=</span> <span class="token">'Manager'</span><span class="token">,</span>
            Email <span class="token">=</span> <span class="token">'testmanager@example.com'</span><span class="token">,</span>
            Username <span class="token">=</span> <span class="token">'testmanager@example.com.test'</span><span class="token">,</span>
            Alias <span class="token">=</span> <span class="token">'tmgr'</span><span class="token">,</span>
            ProfileId <span class="token">=</span> profile<span class="token">.</span>Id<span class="token">,</span>
            TimeZoneSidKey <span class="token">=</span> <span class="token">'Asia/Tokyo'</span><span class="token">,</span>
            LocaleSidKey <span class="token">=</span> <span class="token">'ja_JP'</span><span class="token">,</span>
            EmailEncodingKey <span class="token">=</span> <span class="token">'UTF-8'</span><span class="token">,</span>
            LanguageLocaleKey <span class="token">=</span> <span class="token">'ja'</span>
        <span class="token">)</span><span class="token">;</span>
        <span class="token">insert</span> manager<span class="token">;</span>
        
        <span class="token">User</span> salesUser <span class="token">=</span> <span class="token">new</span> <span class="token">User</span><span class="token">(</span>
            FirstName <span class="token">=</span> <span class="token">'Test'</span><span class="token">,</span>
            LastName <span class="token">=</span> <span class="token">'Sales'</span><span class="token">,</span>
            Email <span class="token">=</span> <span class="token">'testsales@example.com'</span><span class="token">,</span>
            Username <span class="token">=</span> <span class="token">'testsales@example.com.test'</span><span class="token">,</span>
            Alias <span class="token">=</span> <span class="token">'tsales'</span><span class="token">,</span>
            ProfileId <span class="token">=</span> profile<span class="token">.</span>Id<span class="token">,</span>
            ManagerId <span class="token">=</span> manager<span class="token">.</span>Id<span class="token">,</span>
            TimeZoneSidKey <span class="token">=</span> <span class="token">'Asia/Tokyo'</span><span class="token">,</span>
            LocaleSidKey <span class="token">=</span> <span class="token">'ja_JP'</span><span class="token">,</span>
            EmailEncodingKey <span class="token">=</span> <span class="token">'UTF-8'</span><span class="token">,</span>
            LanguageLocaleKey <span class="token">=</span> <span class="token">'ja'</span>
        <span class="token">)</span><span class="token">;</span>
        <span class="token">insert</span> salesUser<span class="token">;</span>
        
        <span class="token">// テスト用の取引先作成</span>
        <span class="token">Account</span> testAccount <span class="token">=</span> <span class="token">new</span> <span class="token">Account</span><span class="token">(</span>
            Name <span class="token">=</span> <span class="token">'テスト取引先'</span><span class="token">,</span>
            OwnerId <span class="token">=</span> salesUser<span class="token">.</span>Id
        <span class="token">)</span><span class="token">;</span>
        <span class="token">insert</span> testAccount<span class="token">;</span>
        
        <span class="token">// テスト用の商談作成</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> opportunities <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 小額商談（マネージャー承認）</span>
        opportunities<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">new</span> <span class="token">Opportunity</span><span class="token">(</span>
            Name <span class="token">=</span> <span class="token">'テスト商談 - 小額'</span><span class="token">,</span>
            AccountId <span class="token">=</span> testAccount<span class="token">.</span>Id<span class="token">,</span>
            Amount <span class="token">=</span> <span class="token">50000</span><span class="token">,</span>
            CloseDate <span class="token">=</span> <span class="token">Date</span><span class="token">.</span><span class="token">today</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token">addDays</span><span class="token">(</span><span class="token">30</span><span class="token">)</span><span class="token">,</span>
            StageName <span class="token">=</span> <span class="token">'Prospecting'</span><span class="token">,</span>
            OwnerId <span class="token">=</span> salesUser<span class="token">.</span>Id
        <span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 中額商談（ディレクター承認）</span>
        opportunities<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">new</span> <span class="token">Opportunity</span><span class="token">(</span>
            Name <span class="token">=</span> <span class="token">'テスト商談 - 中額'</span><span class="token">,</span>
            AccountId <span class="token">=</span> testAccount<span class="token">.</span>Id<span class="token">,</span>
            Amount <span class="token">=</span> <span class="token">300000</span><span class="token">,</span>
            CloseDate <span class="token">=</span> <span class="token">Date</span><span class="token">.</span><span class="token">today</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token">addDays</span><span class="token">(</span><span class="token">30</span><span class="token">)</span><span class="token">,</span>
            StageName <span class="token">=</span> <span class="token">'Prospecting'</span><span class="token">,</span>
            OwnerId <span class="token">=</span> salesUser<span class="token">.</span>Id
        <span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 高額商談（VP承認）</span>
        opportunities<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">new</span> <span class="token">Opportunity</span><span class="token">(</span>
            Name <span class="token">=</span> <span class="token">'テスト商談 - 高額'</span><span class="token">,</span>
            AccountId <span class="token">=</span> testAccount<span class="token">.</span>Id<span class="token">,</span>
            Amount <span class="token">=</span> <span class="token">800000</span><span class="token">,</span>
            CloseDate <span class="token">=</span> <span class="token">Date</span><span class="token">.</span><span class="token">today</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token">addDays</span><span class="token">(</span><span class="token">30</span><span class="token">)</span><span class="token">,</span>
            StageName <span class="token">=</span> <span class="token">'Prospecting'</span><span class="token">,</span>
            OwnerId <span class="token">=</span> salesUser<span class="token">.</span>Id
        <span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">insert</span> opportunities<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testManagerApprovalProcess</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">Opportunity</span> smallOpp <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">'テスト商談 - 小額'</span> 
            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
            <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        request<span class="token">.</span>opportunityId <span class="token">=</span> smallOpp<span class="token">.</span>Id<span class="token">;</span>
        requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 結果の検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">1</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'結果が1件返されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">true</span><span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>success<span class="token">,</span> <span class="token">'承認プロセスが成功すること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span>smallOpp<span class="token">.</span>Id<span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>opportunityId<span class="token">,</span> <span class="token">'商談IDが正しく設定されること'</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 追跡レコードの確認</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalTracking__c</span><span class="token">&gt;</span> trackings <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Status__c 
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> ApprovalTracking__c 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Opportunity__c </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :smallOpp</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Id
</span>        <span class="token sql language-sql">]</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertNotEquals</span><span class="token">(</span><span class="token">0</span><span class="token">,</span> trackings<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'追跡レコードが作成されること'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testDirectorApprovalProcess</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">Opportunity</span> mediumOpp <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">'テスト商談 - 中額'</span> 
            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
            <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        request<span class="token">.</span>opportunityId <span class="token">=</span> mediumOpp<span class="token">.</span>Id<span class="token">;</span>
        requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 結果の検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">1</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'結果が1件返されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span>mediumOpp<span class="token">.</span>Id<span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>opportunityId<span class="token">,</span> <span class="token">'商談IDが正しく設定されること'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testVPApprovalProcess</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">Opportunity</span> largeOpp <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">'テスト商談 - 高額'</span> 
            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
            <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        request<span class="token">.</span>opportunityId <span class="token">=</span> largeOpp<span class="token">.</span>Id<span class="token">;</span>
        requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 結果の検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">1</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'結果が1件返されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span>largeOpp<span class="token">.</span>Id<span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>opportunityId<span class="token">,</span> <span class="token">'商談IDが正しく設定されること'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testErrorHandling</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
            <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        request<span class="token">.</span>opportunityId <span class="token">=</span> <span class="token">null</span><span class="token">;</span> <span class="token">// 不正なID</span>
        requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// エラーハンドリングの検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">1</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'結果が1件返されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">false</span><span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>success<span class="token">,</span> <span class="token">'エラーが正しく処理されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assert</span><span class="token">(</span>results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>message<span class="token">.</span><span class="token">contains</span><span class="token">(</span><span class="token">'エラー'</span><span class="token">)</span><span class="token">,</span> <span class="token">'エラーメッセージが設定されること'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testBulkProcessing</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> allOpps <span class="token">=</span> <span class="token sql language-sql">[</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity</span><span class="token sql language-sql">]</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Opportunity</span> opp <span class="token">:</span> allOpps<span class="token">)</span> <span class="token">{</span>
            <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
                <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
            request<span class="token">.</span>opportunityId <span class="token">=</span> opp<span class="token">.</span>Id<span class="token">;</span>
            requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// バルク処理の検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span>allOpps<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'全ての商談が処理されること'</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span> result <span class="token">:</span> results<span class="token">)</span> <span class="token">{</span>
            <span class="token">System</span><span class="token">.</span><span class="token">assertNotEquals</span><span class="token">(</span><span class="token">null</span><span class="token">,</span> result<span class="token">.</span>opportunityId<span class="token">,</span> <span class="token">'商談IDが設定されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">6. 注意点と課題</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">セキュリティ考慮事項</h3>
<p class="whitespace-normal break-words"><strong>AIエディタ使用時のセキュリティリスク</strong></p>
<p class="whitespace-normal break-words"><strong>1. 機密情報の漏洩リスク</strong> AIエディタにコードを送信する際、顧客情報や機密データが含まれる可能性があります。以下の対策が必要です：</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">実際の顧客データを含むコードをAIエディタに送信しない</li>
<li class="whitespace-normal break-words">テストデータやサンプルデータを使用してコード生成を行う</li>
<li class="whitespace-normal break-words">社内のデータ分類ポリシーに従った利用ガイドラインの策定</li>
<li class="whitespace-normal break-words">AIエディタの利用ログの監査と定期的なレビュー</li>
</ul>
<p class="whitespace-normal break-words"><strong>2. 生成されたコードのセキュリティ脆弱性</strong> AIが生成したコードには、セキュリティ上の問題が含まれる可能性があります：</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// 危険な例：SQLインジェクション脆弱性</span>
<span class="token">public</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Account</span><span class="token">&gt;</span> <span class="token">searchAccounts</span><span class="token">(</span><span class="token">String</span> searchTerm<span class="token">)</span> <span class="token">{</span>
    <span class="token">// AIが生成した危険なコード例</span>
    <span class="token">String</span> query <span class="token">=</span> <span class="token">'SELECT Id, Name FROM Account WHERE Name LIKE \'%'</span> <span class="token">+</span> searchTerm <span class="token">+</span> <span class="token">'%\''</span><span class="token">;</span>
    <span class="token">return</span> Database<span class="token">.</span><span class="token">query</span><span class="token">(</span>query<span class="token">)</span><span class="token">;</span> <span class="token">// SQLインジェクション脆弱性</span>
<span class="token">}</span>

<span class="token">// 安全な実装例</span>
<span class="token">public</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Account</span><span class="token">&gt;</span> <span class="token">searchAccountsSafe</span><span class="token">(</span><span class="token">String</span> searchTerm<span class="token">)</span> <span class="token">{</span>
    <span class="token">String</span> safeSearchTerm <span class="token">=</span> <span class="token">'%'</span> <span class="token">+</span> <span class="token">String</span><span class="token">.</span><span class="token">escapeSingleQuotes</span><span class="token">(</span>searchTerm<span class="token">)</span> <span class="token">+</span> <span class="token">'%'</span><span class="token">;</span>
    <span class="token">return</span> <span class="token sql language-sql">[</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Account </span><span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">LIKE</span><span class="token sql language-sql"> :safeSearchTerm</span><span class="token sql language-sql">]</span><span class="token">;</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>3. 権限とアクセス制御</strong> AIが生成するコードが適切な権限チェックを含んでいるか確認が必要です：</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// 権限チェックを含む安全なコード例</span>
<span class="token">public</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Account</span><span class="token">&gt;</span> <span class="token">getAccounts</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
    <span class="token">// オブジェクトレベルの権限チェック</span>
    <span class="token">if</span> <span class="token">(</span><span class="token">!</span>Schema<span class="token">.</span>sObjectType<span class="token">.</span>Account<span class="token">.</span><span class="token">isAccessible</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'取引先への読み取り権限がありません'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">// フィールドレベルの権限チェック</span>
    <span class="token">if</span> <span class="token">(</span><span class="token">!</span>Schema<span class="token">.</span>sObjectType<span class="token">.</span>Account<span class="token">.</span>fields<span class="token">.</span>Name<span class="token">.</span><span class="token">isAccessible</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'取引先名フィールドへの読み取り権限がありません'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">return</span> <span class="token sql language-sql">[</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Account </span><span class="token sql language-sql">WITH</span><span class="token sql language-sql"> SECURITY_ENFORCED </span><span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">100</span><span class="token sql language-sql">]</span><span class="token">;</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">コード品質の担保方法</h3>
<p class="whitespace-normal break-words"><strong>1. AIによるコード生成後の必須チェック項目</strong></p>
<p class="whitespace-normal break-words"><strong>Salesforce固有の制約チェック</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">ガバナーリミット（SOQL実行回数、DML操作回数、ヒープサイズなど）への対応</li>
<li class="whitespace-normal break-words">バルク処理の実装</li>
<li class="whitespace-normal break-words">適切な例外処理の実装</li>
<li class="whitespace-normal break-words">トランザクション管理の考慮</li>
</ul>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// 良い例：ガバナーリミットを考慮したコード</span>
<span class="token">public</span> <span class="token">class</span> <span class="token">ContactProcessor</span> <span class="token">{</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">void</span> <span class="token">processContacts</span><span class="token">(</span><span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contacts<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contactsToUpdate <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// バルク処理でSOQL実行回数を最小化</span>
        <span class="token">Map</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">,</span><span class="token"> Account</span><span class="token">&gt;</span> accountMap <span class="token">=</span> <span class="token">new</span> <span class="token">Map</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">,</span><span class="token"> Account</span><span class="token">&gt;</span><span class="token">(</span><span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Industry 
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Account 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">IN</span> <span class="token sql language-sql">(</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> AccountId </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Contact </span><span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">IN</span><span class="token sql language-sql"> :contacts</span><span class="token sql language-sql">)</span>
        <span class="token sql language-sql">]</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Contact</span> contact <span class="token">:</span> contacts<span class="token">)</span> <span class="token">{</span>
            <span class="token">if</span> <span class="token">(</span>accountMap<span class="token">.</span><span class="token">containsKey</span><span class="token">(</span>contact<span class="token">.</span>AccountId<span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                contact<span class="token">.</span>Industry__c <span class="token">=</span> accountMap<span class="token">.</span><span class="token">get</span><span class="token">(</span>contact<span class="token">.</span>AccountId<span class="token">)</span><span class="token">.</span>Industry<span class="token">;</span>
                contactsToUpdate<span class="token">.</span><span class="token">add</span><span class="token">(</span>contact<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
        
        <span class="token">// バルクDML操作</span>
        <span class="token">if</span> <span class="token">(</span><span class="token">!</span>contactsToUpdate<span class="token">.</span><span class="token">isEmpty</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
            <span class="token">try</span> <span class="token">{</span>
                Database<span class="token">.</span><span class="token">update</span><span class="token">(</span>contactsToUpdate<span class="token">,</span> <span class="token">false</span><span class="token">)</span><span class="token">;</span>
            <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">DmlException</span> e<span class="token">)</span> <span class="token">{</span>
                <span class="token">System</span><span class="token">.</span><span class="token">debug</span><span class="token">(</span><span class="token">'DML Error: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
                <span class="token">// 適切なエラーハンドリング</span>
            <span class="token">}</span>
        <span class="token">}</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>2. 静的コード解析ツールの活用</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">PMD for Salesforce</li>
<li class="whitespace-normal break-words">SonarQube Salesforce Plugin</li>
<li class="whitespace-normal break-words">Salesforce Code Analyzer</li>
</ul>
<p class="whitespace-normal break-words"><strong>3. コードレビュープロセスの強化</strong> AIが生成したコードについては、特に以下の観点でのレビューを強化：</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">ビジネスロジックの正確性</li>
<li class="whitespace-normal break-words">パフォーマンスの最適化</li>
<li class="whitespace-normal break-words">セキュリティ要件の満足</li>
<li class="whitespace-normal break-words">保守性とテスタビリティ</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">チーム開発での運用ポイント</h3>
<p class="whitespace-normal break-words"><strong>1. AIエディタ利用のガイドライン策定</strong></p>
<p class="whitespace-normal break-words"><strong>利用ルールの明文化</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">markdown</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-markdown"><span class="token">##</span><span class="token"> AIエディタ利用ガイドライン</span>

<span class="token">###</span><span class="token"> 基本方針</span>
<span class="token">1.</span> 本番データを含むコードをAIエディタに送信しない
<span class="token">2.</span> 生成されたコードは必ず動作確認とセキュリティチェックを行う
<span class="token">3.</span> AIの提案をそのまま採用せず、チームの規約に合わせて調整する

<span class="token">###</span><span class="token"> 利用可能な範囲</span>
<span class="token">-</span> ボイラープレートコードの生成
<span class="token">-</span> テストコードの初期実装
<span class="token">-</span> リファクタリングの提案
<span class="token">-</span> ドキュメンテーションの作成

<span class="token">###</span><span class="token"> 利用禁止事項</span>
<span class="token">-</span> 本番環境の機密データを含むコードの送信
<span class="token">-</span> 未検証のコードの直接的な本番環境への適用
<span class="token">-</span> ライセンスが不明なコードの利用</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>2. 品質基準の統一</strong></p>
<p class="whitespace-normal break-words"><strong>コード品質チェックリスト</strong></p>
<ul class="contains-task-list">
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> Salesforceガバナーリミットへの対応</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> 適切な例外処理の実装</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> セキュリティ要件の満足</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> テストカバレッジ75%以上</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> コメントとドキュメンテーションの充実</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> チームのコーディング規約への準拠</li>
</ul>
<p class="whitespace-normal break-words"><strong>3. 知識共有とベストプラクティスの蓄積</strong></p>
<p class="whitespace-normal break-words"><strong>効果的なプロンプトの共有</strong> チーム内で効果的だったプロンプトや手法を共有し、組織全体のVibe Coding能力を向上させます。</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">markdown</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-markdown"><span class="token">##</span><span class="token"> 有効なプロンプト例集</span>

<span class="token">###</span><span class="token"> Apexクラス生成</span>
「Salesforceのガバナーリミットを考慮し、バルク処理に対応した
[機能名]のApexクラスを作成してください。エラーハンドリングと
ログ出力も含めて実装してください。」

<span class="token">###</span><span class="token"> テストクラス生成</span>
「先ほど作成したApexクラスに対して、以下の条件を満たす
テストクラスを作成してください：
<span class="token">-</span> 正常系・異常系の両方をテスト
<span class="token">-</span> バルク処理のテスト
<span class="token">-</span> 75%以上のカバレッジ確保」</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>4. 継続的な改善プロセス</strong></p>
<p class="whitespace-normal break-words"><strong>定期的な振り返り</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">月次でのAIエディタ利用状況のレビュー</li>
<li class="whitespace-normal break-words">問題点や改善点の特定と対策の検討</li>
<li class="whitespace-normal break-words">新機能や新しい手法の評価と導入検討</li>
</ul>
<p class="whitespace-normal break-words"><strong>メトリクスの計測</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">開発速度の向上度</li>
<li class="whitespace-normal break-words">コード品質の指標（バグ発生率、レビュー指摘事項数）</li>
<li class="whitespace-normal break-words">開発者の満足度</li>
<li class="whitespace-normal break-words">学習コストの変化</li>
</ul>
<h2>関連記事</h2>
<div class="cclt-compat-catgroup"><ul class="cclt-compat-catgroup__list"><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/develop-salesforce-with-vibe-cording-using-ai-editor/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-Vibe-coding-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-Vibe-coding-150x150.jpg 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-Vibe-coding-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">AIエディタを使ったVibe CordingでSalesforceの開発を行う【①用語の理解とツールの説明】</span><time class="cclt-compat-catgroup__date" datetime="2025-06-22T14:15:48+09:00">2025年6月22日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/development-use-case-vibe-coding/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-150x150.jpg 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">AIエディタを使ったVibe codingの実際の開発事例（ユースケース）</span><time class="cclt-compat-catgroup__date" datetime="2025-06-22T14:14:11+09:00">2025年6月22日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/2025-napkinai-guidance/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/napkin.ai_-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="napkin.ai" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/napkin.ai_-150x150.jpg 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/napkin.ai_-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">【2025年最新】Napkin AI完全ガイド-生成AIを使って効率的に資料やスライド用の文章や図解を作成しよう</span><time class="cclt-compat-catgroup__date" datetime="2025-06-08T17:32:11+09:00">2025年6月8日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/generative-ai-business-guide-for-salesforce/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/ビジネスを変革する生成AI活用-150x150.png" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/ビジネスを変革する生成AI活用-150x150.png 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/ビジネスを変革する生成AI活用-100x100.png 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">ビジネスを変革する生成AI「ジェネレーティブAI（Generative AI）」活用ガイド</span><time class="cclt-compat-catgroup__date" datetime="2025-06-03T13:38:22+09:00">2025年6月3日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/what-is-generative-ai/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2021/10/eye-catching-picture-work-3-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2021/10/eye-catching-picture-work-3-150x150.jpg 150w, https://creativecontentlabtokyo.com/wp-content/uploads/2021/10/eye-catching-picture-work-3-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">生成AIとは？初心者向け完全ガイド：基本から活用方法まで徹底解説</span><time class="cclt-compat-catgroup__date" datetime="2025-06-02T19:16:16+09:00">2025年6月2日</time></div></a></li></ul></div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
