<?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エディタ &#8211; AI開発実践ラボ</title>
	<atom:link href="https://creativecontentlabtokyo.com/tag/ai%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/feed/" rel="self" type="application/rss+xml" />
	<link>https://creativecontentlabtokyo.com</link>
	<description>AIで、作る力を手に入れる。</description>
	<lastBuildDate>Sat, 04 Apr 2026 21:09:22 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<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 fetchpriority="high" 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="(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 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="(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);">公式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 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="(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);">公式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);">公式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>
		<div class="wpulike wpulike-animated-heart " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="いいねボタン"
					data-ulike-id="5506"
					data-ulike-nonce="20f9ebb95d"
					data-ulike-type="post"
					data-ulike-template="wpulike-animated-heart"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					data-ulike-append="&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop one&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop two&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop three&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop four&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop five&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop six&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop seven&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop eight&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop nine&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_5506"><svg class="wpulike-svg-heart wpulike-svg-heart-icon" viewBox="0 -28 512.00002 512" xmlns="http://www.w3.org/2000/svg"><path
						d="m471.382812 44.578125c-26.503906-28.746094-62.871093-44.578125-102.410156-44.578125-29.554687 0-56.621094 9.34375-80.449218 27.769531-12.023438 9.300781-22.917969 20.679688-32.523438 33.960938-9.601562-13.277344-20.5-24.660157-32.527344-33.960938-23.824218-18.425781-50.890625-27.769531-80.445312-27.769531-39.539063 0-75.910156 15.832031-102.414063 44.578125-26.1875 28.410156-40.613281 67.222656-40.613281 109.292969 0 43.300781 16.136719 82.9375 50.78125 124.742187 30.992188 37.394531 75.535156 75.355469 127.117188 119.3125 17.613281 15.011719 37.578124 32.027344 58.308593 50.152344 5.476563 4.796875 12.503907 7.4375 19.792969 7.4375 7.285156 0 14.316406-2.640625 19.785156-7.429687 20.730469-18.128907 40.707032-35.152344 58.328125-50.171876 51.574219-43.949218 96.117188-81.90625 127.109375-119.304687 34.644532-41.800781 50.777344-81.4375 50.777344-124.742187 0-42.066407-14.425781-80.878907-40.617188-109.289063zm0 0" /></svg></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="0"></span>			</div></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>
		<div class="wpulike wpulike-animated-heart " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="いいねボタン"
					data-ulike-id="5524"
					data-ulike-nonce="249627c646"
					data-ulike-type="post"
					data-ulike-template="wpulike-animated-heart"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					data-ulike-append="&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop one&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop two&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop three&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop four&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop five&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop six&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop seven&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop eight&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;&lt;svg class=&quot;wpulike-svg-heart wpulike-svg-heart-pop nine&quot; viewBox=&quot;0 0 32 29.6&quot;&gt;&lt;path d=&quot;M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z&quot;/&gt;&lt;/svg&gt;"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_5524"><svg class="wpulike-svg-heart wpulike-svg-heart-icon" viewBox="0 -28 512.00002 512" xmlns="http://www.w3.org/2000/svg"><path
						d="m471.382812 44.578125c-26.503906-28.746094-62.871093-44.578125-102.410156-44.578125-29.554687 0-56.621094 9.34375-80.449218 27.769531-12.023438 9.300781-22.917969 20.679688-32.523438 33.960938-9.601562-13.277344-20.5-24.660157-32.527344-33.960938-23.824218-18.425781-50.890625-27.769531-80.445312-27.769531-39.539063 0-75.910156 15.832031-102.414063 44.578125-26.1875 28.410156-40.613281 67.222656-40.613281 109.292969 0 43.300781 16.136719 82.9375 50.78125 124.742187 30.992188 37.394531 75.535156 75.355469 127.117188 119.3125 17.613281 15.011719 37.578124 32.027344 58.308593 50.152344 5.476563 4.796875 12.503907 7.4375 19.792969 7.4375 7.285156 0 14.316406-2.640625 19.785156-7.429687 20.730469-18.128907 40.707032-35.152344 58.328125-50.171876 51.574219-43.949218 96.117188-81.90625 127.109375-119.304687 34.644532-41.800781 50.777344-81.4375 50.777344-124.742187 0-42.066407-14.425781-80.878907-40.617188-109.289063zm0 0" /></svg></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="0"></span>			</div></div>
	]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
