<?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>LWC &#8211; AI開発実践ラボ</title>
	<atom:link href="https://creativecontentlabtokyo.com/tag/lwc/feed/" rel="self" type="application/rss+xml" />
	<link>https://creativecontentlabtokyo.com</link>
	<description>AIで、作る力を手に入れる。</description>
	<lastBuildDate>Fri, 08 May 2026 17:42:32 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>CloudFormGenerator 入門｜SalesforceネイティブでWordテンプレをそのままPDF出力する帳票ジェネレーター</title>
		<link>https://creativecontentlabtokyo.com/sf-cloudformgenerator-intro/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Fri, 08 May 2026 17:42:32 +0000</pubDate>
				<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[LWC]]></category>
		<category><![CDATA[Salesforce]]></category>
		<category><![CDATA[帳票自動化]]></category>
		<category><![CDATA[業務効率化]]></category>
		<category><![CDATA[見積書]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/sf-cloudformgenerator-intro/</guid>

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

					<description><![CDATA[本記事では、Creative Content Lab Tokyo（クリエイティブコンテンツラボトウキョウ）が作成したSalesforceの開発コーディング規約（…]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">本記事では、Creative Content Lab Tokyo（クリエイティブコンテンツラボトウキョウ）が作成したSalesforceの開発コーディング規約（Lightning Web Component）のテンプレートをご提供しております。</p>
<p class="whitespace-normal break-words">モダンなSalesforce開発において、Lightning Web Component（LWC）は欠かせない技術要素となっています。しかし、多くの開発チームが「どのようなコーディング規約を設ければよいのか」「チーム全体で一貫したコードスタイルを維持するにはどうすればよいのか」といった課題を抱えています。</p>
<p class="whitespace-normal break-words">本記事では、SalesforceのApexコーディング規約の考え方を参考にしながら、LWC開発における実践的なコーディング規約の策定と活用方法について詳しく解説します。品質の高いLWCアプリケーションを開発するために、ぜひ本ガイドを参考にして、あなたのプロジェクトに最適なコーディング規約を構築してください。</p>
<p class="whitespace-normal break-words">本記事では、このテンプレートの特徴と効果的な活用方法について詳しく解説します。</p>
<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">1. フロントエンド開発の複雑性への対応</h3>
<p class="whitespace-normal break-words">LWC開発では、JavaScript、HTML、CSS、そしてSalesforceのメタデータが複雑に絡み合います。統一されたコーディング規約がないと、以下のような問題が発生します：</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">JavaScript のパフォーマンスの劣化</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">2. Salesforceプラットフォーム特有の制約</h3>
<p class="whitespace-normal break-words">LWC開発では、一般的なWebフロントエンド開発とは異なる独特の制約があります：</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">Locker Service によるセキュリティ制約</li>
<li class="whitespace-normal break-words">Lightning Data Service の効率的な活用</li>
<li class="whitespace-normal break-words">イベント伝播とコンポーネント間通信</li>
<li class="whitespace-normal break-words">レスポンシブデザインとLightning Design System（SLDS）の準拠</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">3. 長期保守性の確保</h3>
<p class="whitespace-normal break-words">LWCコンポーネントは、Salesforceの組織内で長期間にわたって使用されます。初期開発から数年後の機能拡張や修正を考慮した、保守しやすいコード構造を保つことが重要です。</p>
<h2>1.テーラリングガイド</h2>
<h3>１．目次サンプル</h3>
<p><img fetchpriority="high" decoding="async" width="1446" height="1001" class="alignnone wp-image-5297 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-79.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-79.png 1446w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-79-300x208.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-79-1024x709.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-79-768x532.png 768w" sizes="(max-width: 1446px) 100vw, 1446px" /></p>
<p>目次<br />1 はじめに <br />　1.1 本書の目的 7<br />　1.1.1 利用者 7<br />1.2 記号 7<br />　1.2.1 本書で使用する記号についての説明 7<br />1.3 用語の定義 7<br />　1.3.1 本書で使用する記号についての説明 7<br />2 基本方針 8<br />　2.1 可読性の優先 8<br />　2.2 保守性の確保 8<br />　2.3 Lightning固有の考慮事項 8<br />3 命名規則 8<br />　3.1 コンポーネント名 8<br />　3.2 メソッド名 9<br />　3.3 定数名 10<br />4 ファイル構造とフォーマット 11<br />　4.1 ファイル構成 11<br />　4.2 インデント 11<br />　4.3 行の長さ 12<br />5 Javascript設計 13<br />　5.1 クラス構造の順序 13<br />　5.2 プロパティ設計 15<br />6 HTMLテンプレート設計 17<br />　6.1 テンプレート構造 17<br />　6.2 イベントハンドリング 18<br />7 CSSスタイル設計 21<br />　7.1 SLDS準拠 21<br />　7.2 CSSカスタムプロパティ 22<br />8 データアクセスとAPIコール 22<br />　8.1 Lightning Data Service (LDS) 22<br />　8.2 Apexメソッド呼び出し 24<br />9 イベント設計 25<br />　9.1 カスタムイベント 25<br />　9.2 プラットフォームイベント 27<br />10 テスト設計 28<br />　10.1 Jestテスト 28<br />　10.2 テストデータファクトリ 31<br />11 セキュリティとベストプラクティス 33<br />　11.1 セキュリティ考慮事項 33<br />　11.2 パフォーマンス最適化 34<br />12 国際化対応 36<br />　12.1 カスタムラベル使用 36<br />　12.2 日付・通貨・数値フォーマット 38<br />13 エラーハンドリング 40<br />　13.1 統一的なエラーハンドリング 40<br />　13.2 バリデーションエラー 43<br />14 デバッグとトラブルシューティング 45<br />　14.1 ログ出力 45<br />　14.2 パフォーマンス監視 46<br />15 コンポーネント設計パターン 48<br />　15.1 コンポーネント間通信 48<br />　15.2 コンポーネント間通信 50<br />16 メタデータ設計 53<br />　16.1 コンポーネントメタデータ 53<br />17 運用保守 55<br />　17.1 コードレビューチェックリスト 55</p>
<h3>２.基本方針（可読性・保守性の重視）</h3>
<p class="whitespace-normal break-words">テンプレートでは、「可読性の優先」「保守性の確保」「Salesforce固有の考慮事項」の3つを基本方針として掲げています。これらの方針は、長期的な開発・運用を見据えた重要な指針となります。</p>
<p><img decoding="async" width="1440" height="999" class="alignnone wp-image-5298 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-80.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-80.png 1440w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-80-300x208.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-80-1024x710.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-80-768x533.png 768w" sizes="(max-width: 1440px) 100vw, 1440px" /></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">コードは書く時間よりも読む時間の方が長いことを念頭に置く</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>
</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>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">３.命名規則の統一</h3>
<p class="whitespace-normal break-words">3.1 コンポーネント名<br />規則:<br />• kebab-case（小文字、単語間はハイフン）<br />• 意味のある名前を使用<br />• 業務領域を表現する接頭辞を付ける</p>
<p>3.2 メソッド名<br />規則:<br />• camelCase（最初は小文字、以降の単語は大文字開始）<br />• 意味のある名前を使用<br />• Boolean型はis、has、canで開始</p>
<p>3.3 定数名<br />規則:<br />• UPPER_SNAKE_CASE（全て大文字、単語間はアンダースコア）<br />• 意味を明確に表現</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5"><br />4.ファイル構造とフォーマット</h3>
<p><img decoding="async" width="1438" height="996" class="alignnone wp-image-5301 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-83.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-83.png 1438w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-83-300x208.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-83-1024x709.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-83-768x532.png 768w" sizes="(max-width: 1438px) 100vw, 1438px" /></p>
<p>4.1 ファイル構成</p>
<p><strong>my-component/</strong></p>
<p><strong>├── my-component.js         // Javascript </strong><strong>ロジック</strong></p>
<p><strong>├── my-component.html       // HTML </strong><strong>テンプレート</strong></p>
<p><strong>├── my-component.css        // CSS </strong><strong>スタイル</strong></p>
<p><strong>├── my-component.js-meta.xml // </strong><strong>メタデータ</strong></p>
<p><strong>└── __tests__/</strong></p>
<p><strong>    └── my-component.test.js // </strong><strong>テストファイル</strong></p>
<p>4.2 インデント</p>
<p><strong>規則:</strong></p>
<ul>
<li>2スペースインデント（タブ文字は使用しない）</li>
<li>一貫したインデントレベルを維持</li>
</ul>
<p>4.3 行の長さ</p>
<p><strong>規則:</strong></p>
<ul>
<li>1行120文字以内を推奨</li>
<li>長い行は適切な位置で改行</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">5.Javascript設計</h3>
<p class="whitespace-normal break-words">クラス構造体の順序、ﾌﾟﾛﾊﾟﾃｨ設計の規則と例を記述しています。</p>
<p><img loading="lazy" decoding="async" width="1432" height="995" class="alignnone wp-image-5303 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-85.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-85.png 1432w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-85-300x208.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-85-1024x712.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-85-768x534.png 768w" sizes="auto, (max-width: 1432px) 100vw, 1432px" /></p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">6.HTMLテンプレート設計</h3>
<p class="whitespace-normal break-words">テンプレート構造、イベントハンドリングについての規約と例文について解説しています。</p>
<p><img loading="lazy" decoding="async" width="1438" height="999" class="alignnone wp-image-5304 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-86.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-86.png 1438w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-86-300x208.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-86-1024x711.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-86-768x534.png 768w" sizes="auto, (max-width: 1438px) 100vw, 1438px" /></p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">7.CSSスタイル設計</h3>
<p class="whitespace-normal break-words">CSSスタイル設計のSLDS準拠について、CSSカスタムプロパティの利用方法について解説しています。</p>
<p><img loading="lazy" decoding="async" width="1431" height="1004" class="alignnone wp-image-5305 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-87.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-87.png 1431w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-87-300x210.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-87-1024x718.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-87-768x539.png 768w" sizes="auto, (max-width: 1431px) 100vw, 1431px" /></p>
<h3>8 データアクセスとAPIコール</h3>
<p>Lightning Data ServiceやApexメソッドの呼び出しに関する規則について解説しています。</p>
<p><img loading="lazy" decoding="async" width="1436" height="998" class="alignnone wp-image-5308 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-88.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-88.png 1436w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-88-300x208.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-88-1024x712.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-88-768x534.png 768w" sizes="auto, (max-width: 1436px) 100vw, 1436px" /></p>
<p>8.1 Lightning Data Service (LDS) <br />規則:<br />• 単一レコード操作にはLDSを優先的に使用<br />• @wireでリアクティブなデータバインディング<br />• エラーハンドリングを適切に実装</p>
<p>8.2 Apexメソッド呼び出し<br />規則:<br />• @wireで自動データバインディング<br />• imperative callで手動データ取得<br />• 適切なエラーハンドリング</p>
<h3>9.イベント設計</h3>
<p>カスタムイベント、プラットフォームイベントについて解説</p>
<p><img loading="lazy" decoding="async" width="1429" height="996" class="alignnone wp-image-5313 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-90.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-90.png 1429w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-90-300x209.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-90-1024x714.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-90-768x535.png 768w" sizes="auto, (max-width: 1429px) 100vw, 1429px" /></p>
<h3>10.テスト設計</h3>
<p>Jestテスト、テストデータファクトリについて解説</p>
<p><img loading="lazy" decoding="async" width="1426" height="995" class="alignnone wp-image-5314 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-91.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-91.png 1426w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-91-300x209.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-91-1024x715.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-91-768x536.png 768w" sizes="auto, (max-width: 1426px) 100vw, 1426px" /></p>
<h3>11.セキュリティとベストプラクティス</h3>
<p><img loading="lazy" decoding="async" width="1425" height="988" class="alignnone wp-image-5316 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-93.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-93.png 1425w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-93-300x208.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-93-1024x710.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-93-768x532.png 768w" sizes="auto, (max-width: 1425px) 100vw, 1425px" /></p>
<p>11.1 セキュリティ考慮事項<br />規則:<br />• ユーザー入力は常にサニタイズ<br />• lightning-formatted-textでXSS対策<br />• CRUD/FLS権限を考慮</p>
<h3>その他</h3>
<p>テンプレートを参照ください。</p>
<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">1. プロジェクト開始時の規約策定</h3>
<p class="whitespace-normal break-words">新しいSalesforceプロジェクトを開始する際、このテンプレートをベースとして、プロジェクト固有の要件に合わせてカスタマイズすることで、短時間で実用的なコーディング規約を策定できます。</p>
<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">テンプレートをダウンロードし、開発チーム全体で内容を確認</li>
<li class="whitespace-normal break-words">プロジェクトの特性に応じて、必要な項目を追加・修正</li>
<li class="whitespace-normal break-words">チーム内での合意形成とドキュメント化</li>
</ol>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">2. 既存プロジェクトの品質改善</h3>
<p class="whitespace-normal break-words">既に進行中のプロジェクトでも、段階的にコーディング規約を導入することで品質向上を図ることができます。</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"><strong>第1段階</strong>: 新規開発コードから規約適用開始</li>
<li class="whitespace-normal break-words"><strong>第2段階</strong>: 既存コードの修正時に規約に合わせてリファクタリング</li>
<li class="whitespace-normal break-words"><strong>第3段階</strong>: 重要なモジュールから順次全面的な規約適用</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">3. コードレビューの効率化</h3>
<p class="whitespace-normal break-words">テンプレートに含まれるチェックリストを活用することで、コードレビューの観点が明確になり、見落としを防ぐことができます。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">4. 新人教育・オンボーディング</h3>
<p class="whitespace-normal break-words">新しくチームに参加する開発者に対して、このテンプレートを教育資料として使用することで、Salesforce開発のベストプラクティスを効率的に伝えることができます。</p>
<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">段階的な導入を心がける</h3>
<p class="whitespace-normal break-words">すべての規約を一度に導入しようとすると、開発チームに大きな負担をかけてしまいます。重要度の高い項目から順次導入し、チーム全体が慣れてから次の項目に進むことが重要です。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">ツールを活用した自動化</h3>
<p class="whitespace-normal break-words">可能な限り、IDE（Salesforce CLI、VS Code）の設定やCI/CDパイプラインを活用して、規約チェックを自動化しましょう。手動でのチェックに頼りすぎると、継続が困難になります。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">定期的な見直しと改善</h3>
<p class="whitespace-normal break-words">プロジェクトの進行に伴い、新たな課題や改善点が見つかることがあります。定期的に規約を見直し、チームの成長とプロジェクトの変化に応じてアップデートしていくことが大切です。</p>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">テンプレートに含まれる実践的なコード例</h2>
<p class="whitespace-normal break-words">このテンプレートの大きな特徴の一つは、豊富な実装例が含まれていることです。抽象的な説明だけでなく、具体的なコード例を通じて「良い例」と「悪い例」を明示しているため、開発者が実際のコーディング時に迷うことなく適用できます。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">SLDSの活用例</h3>
<pre class=""><code class="language-apex code_break">(css)
/* <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 良い例 - SLDS準拠 */
.account-container {
  padding: var(--lwc-spacing-medium);
}

.header {
  margin-bottom: var(--lwc-spacing-large);
}

.content {
  display: flex;
  flex-direction: column;
  gap: var(--lwc-spacing-medium);
}

.empty-state {
  text-align: center;
  padding: var(--lwc-spacing-x-large);
  color: var(--lwc-color-text-weak);
}

.error-message {
  color: var(--lwc-color-text-error);
  padding: var(--lwc-spacing-small);
  border: 1px solid var(--lwc-color-border-error);
  border-radius: var(--lwc-border-radius-medium);
  background-color: var(--lwc-color-background-error);
}

/* レスポンシブ対応 */
@media (max-width: 768px) {
  .content {
    padding: var(--lwc-spacing-small);
  }
}
</code></pre>

<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">継続的な品質向上のために</h2>
<p class="whitespace-normal break-words">コーディング規約の導入は、ゴールではなくスタートラインです。継続的に品質を向上させるために、以下の取り組みを推奨します：</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">定期的なコードレビュー会の実施</h3>
<p class="whitespace-normal break-words">チーム全体でコードレビューを行う時間を定期的に設け、規約の適用状況や新たな課題について議論します。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">メトリクス測定と改善</h3>
<p class="whitespace-normal break-words">テストカバレッジ、複雑度、規約違反数などのメトリクスを測定し、定量的な改善を図ります。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">知識共有とベストプラクティスの蓄積</h3>
<p class="whitespace-normal break-words">チーム内で発見されたベストプラクティスを規約に反映し、組織の知見として蓄積していきます。</p>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">まとめ</h2>
<p class="whitespace-normal break-words">今回公開したSalesforce Apexコーディング規約テンプレートは、実際の開発現場での経験を基に作成された実践的なドキュメントです。このテンプレートを活用することで、開発チームは以下のメリットを得ることができます：</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"><strong>開発効率の向上</strong>: 統一されたコーディングスタイルにより、コードレビューや保守作業が効率化</li>
<li class="whitespace-normal break-words"><strong>品質の向上</strong>: Salesforce特有の制約を考慮したベストプラクティスにより、バグの削減と性能向上を実現</li>
<li class="whitespace-normal break-words"><strong>チーム力の強化</strong>: 共通の規約により、チーム内でのコミュニケーションと協力が促進</li>
<li class="whitespace-normal break-words"><strong>スケーラビリティの確保</strong>: 将来の機能拡張や保守作業に対応しやすいコード構造の実現</li>
</ul>
<p class="whitespace-normal break-words">Salesforce開発の品質向上を目指すすべてのチームに、このテンプレートを積極的に活用していただき、より良いシステム開発を実現していただければと思います。</p>
<h2>資料のダウンロード</h2>
<p class="whitespace-normal break-words">テンプレートのダウンロードは、Creative Content Lab Tokyoの公式サイトから無料で行えます。ぜひ、あなたのプロジェクトでもご活用ください。</p>
<p>資料のダウンロードおよびご利用に関しては、本サイトのコンテンツ利用規約に同意される場合のみ利用可能となります。</p>
<div class="cclt-compat-mybutton cclt-compat-mybutton--ref cclt-compat-mybutton--shadow"><a href="https://creativecontentlabtokyo.com/terms/" class="cclt-compat-mybutton__link" style="color:#fff;background-color:#e53935;border:1px solid #e57373;border-radius:5px;font-weight:bold;background:linear-gradient(#f44336,#e53935);" target="_blank" rel="noopener noreferrer">ダウンロード前に利用規約を必ずお読みください。</a></div>
<h3>一般公開資料</h3>
<p><span class="huto">開発コーディング規約のダウンロード</span></p>
<div class="cclt-compat-mybutton cclt-compat-mybutton--ref cclt-compat-mybutton--shadow"><a href="https://docs.google.com/uc?export=download&#038;id=1qqGSUPYIXZNCIuwTw2CuN0i4g0V4v7k9" class="cclt-compat-mybutton__link" style="color:#fff;background-color:#43A047;border:1px solid #81C784;border-radius:5px;font-weight:bold;font-size:bold;background:linear-gradient(#66BB6A,#43A047);" target="_blank" rel="noopener noreferrer">ダウンロード <i class="fa fa-angle-right"></i></a></div>
<p><strong>※クリックして資料のダウンロードが開始されるまで少し時間がかかる場合がありますので、そのままお待ちください。</strong></p>
<p><strong>もしダウンロードが開始されない場合、ブラウザでポップアップブロックされている可能性があるのでご確認ください。</strong></p>
<h2>最後に</h2>
<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">テンプレートのご利用に関して不明な点があればお問い合わせください。また、テンプレートに対しての要望がありましたらご意見ください。 皆様の役に立つように改善していきたいと思います。</div></div></div>
<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">ブログランキングに参加しましたので、ご支援していただけると幸いです。</div></div></div>
<p><a href="https://it.blogmura.com/ranking/in?p_cid=11084904" target="_blank" rel="noopener noreferrer"><img loading="lazy" decoding="async" src="https://b.blogmura.com/banner-blogmura-portfolio.svg" alt="にほんブログ村 IT技術ブログへ" width="88" height="31" border="0" /></a><br /><a href="https://it.blogmura.com/ranking/in?p_cid=11084904" rel="noopener">にほんブログ村</a></p>
		<div class="wpulike wpulike-animated-heart " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="いいねボタン"
					data-ulike-id="5286"
					data-ulike-nonce="c81c07c177"
					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_5286"><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（ChatGPT）を使ったSaleforce開発（自動コード生成）</title>
		<link>https://creativecontentlabtokyo.com/saleforce-development-using-ai-chatgpt-automatic-code-generation/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Mon, 20 Feb 2023 06:27:32 +0000</pubDate>
				<category><![CDATA[Tips集]]></category>
		<category><![CDATA[製品・サービス]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Apex]]></category>
		<category><![CDATA[Bard]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Lightning web component]]></category>
		<category><![CDATA[LWC]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[コード生成]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/?p=4605</guid>

					<description><![CDATA[今回は、今話題の文章生成AI（ChatGPT）を使ってSalesforceの開発が現状どこまでできるのか検証してみた結果の記事となります。 過去にAIの機能を使…]]></description>
										<content:encoded><![CDATA[<p>今回は、今話題の文章生成AI（ChatGPT）を使ってSalesforceの開発が現状どこまでできるのか検証してみた結果の記事となります。</p>
<p>過去にAIの機能を使ったことがある人は、「結局AIといっても大したことはできないし、やっぱり人間が必要」というイメージを持っている人も多くいると思いますが、そのイメージは捨てたほうがいいかもしれません。</p>
<p>ChatGPTの登場により、既に特定の分野では完全にAIだけで仕事ができるレベルに到達してきているようです。（人が作業するよりも精度が高く、もちろん作業スピードも高速）</p>
<p>本記事では、ChatGPTの概要や出来ることについて説明するとともに、Salesforceなどシステム開発でどのように利用するかを説明していきたいと思います。</p>
<h2>ChatGPTとは</h2>
<p>まずは、ChatGPTについて簡単に概要を説明したいと思います。</p>
<p>ChatGPT（チャットジーピーティー）とは、OpenAI社（※工知能の研究開発を行う非営利団体）が開発したGPT-3という大規模言語モデルを使った文章生成AIとなります。</p>
<p>※公式サイトURL：<a href="https://openai.com/" rel="noopener">https://openai.com/</a>　（ChatGPTを利用するためには登録が必要です。</p>
<p>ChatGPTは、従来のAI（人工知能）に対するイメージを完全に覆す超ハイレベルなAIとなっています。OpenAI社は、SpaceXやテスラ、そしてTwitter買収で有名なイーロンマスク氏が共同設立した会社です。</p>
<p>現在は、イーロンマスク氏は会社を離れていて、Microsoft社が出資し、MicrosoftのBING（検索エンジン）に組み込んで利用できるようになってきています。※Chromeの拡張機能なども提供され始めています。</p>
<p>最近では、ペンシルベニア大学のMBAの期末試験の解答をChatGPTで行ったところ、B判定（優秀）となり話題になっていました。今後は、Googleの検索が不要になり、調べたいことはなんでもChatGPTに聞けば、全世界の膨大なデータ量から自動で検索して、それを要約して精度の高い回答を得ることができるようになるのではと言われています。</p>
<p>これに対して、GoogleはBardという会話型AIを発表しています。ただし現時点ではChatGPTの方が優れていると評価しているユーザが多いようです。どちらにしても今後近い将来、このAIの分野が目覚ましい進歩をして仕事の中で普通に使われるようになるものと思われます。</p>
<p>特にChatGPTは、文章の生成だけではなく、翻訳、プログラミング（コーディング）までできる優れもののため、今日からすぐに仕事に活かして作業効率を上げることができます。</p>
<p>文章は、英語だけではなく日本語にも対応しており、チャットに対して質問や依頼を入力すると、自然な文章で要約された精度の高い回答を得ることができます。</p>
<p>料金体系については、無料版と有料版を提供されています。まずは無料版で試しに使ってみるとよいと思います。</p>
<p>以上が概要となりますが、詳細な情報について知りたい方は後半でご紹介するYoutubeの動画を見ることをお勧めします。</p>
<h2>ChatGPTで実現可能なこと</h2>
<p>現時点で、ChatGPTでできることは以下のような内容となります。</p>
<ol>
<li>検索やQ&amp;A（質問に対して、要約された回答が返ってくる）</li>
<li>精度の高い文章作成（メール本文、感想文、論文など高度なものまで）</li>
<li>翻訳（英語から日本語など幅広い言語に対して精度の高い翻訳を行うことができる）</li>
<li>計算（数学の問題などに対して、答えや計算の過程を説明してくれる）</li>
<li>ブログ記事の作成や最適SEOのキーワードの提案など</li>
<li>プログラミングのソースコード生成（HTML、Javascript、CSS、PHPなど様々）</li>
<li>ソースコードのバグ解析（ソースコードに対してレビューを行い、バグを発見）</li>
<li>その他（作詞など）</li>
</ol>
<p>上記のように様々なことができるようになっています。しかも生成されるのはかなり高度（高品質）なものとなっています。</p>
<p>ちなみにChatGPTに対して、「ChatGPTにはどのような機能がありますか」と質問したところ以下の結果が返ってきました。</p>
<p><div class="cclt-compat-cmemo st-text-guide st-text-guide-sankou" style="background-color:#fafafa;color:#000000;border:px solid ;"><span class="cclt-compat-cmemo__icon fa fa-file-text-o" style="color:#919191;"></span><div class="cclt-compat-cmemo__text"></p>
<p>ChatGPTは、自然言語処理技術を用いて、以下のような機能を持っています。</p>
<ol>
<li>質問応答：ユーザーからの質問に対して適切な回答を返します。一般的な知識や専門知識に関する質問に対して、高い精度で回答を提供します。</li>
<li>チャットボット：ユーザーと対話し、問題解決や情報提供を行います。あいさつやおしゃべりから、予約や注文などのタスクまで、幅広い場面で活躍します。</li>
<li>翻訳：複数の言語間での翻訳を行います。日本語から英語や中国語、スペイン語など、多言語に対応しています。</li>
<li>要約：長文を要約し、要点を把握できるようにします。ニュース記事や論文などの長文を短くまとめたり、複数の文章をまとめて要約したりします。</li>
<li>自然言語生成：指定された条件に合わせて文章を生成します。文章の体裁や内容、トーンなどを指定して、自動的に文章を生成します。</li>
<li>感情分析：文章から感情を判断し、ポジティブ・ネガティブなどの評価を行います。商品レビューやSNSの投稿など、様々なテキストデータに対して感情分析を行います。</li>
<li>知識ベース検索：あるトピックに関する情報をまとめた知識ベースを検索し、適切な情報を提供します。例えば、医療や法律、ビジネスなどの分野に特化した知識ベースを構築し、適切な情報を提供します。</li>
</ol>
<p>などがあります。</p>
<p></div></div></p>
<p>以下、実際のChatGPTを利用したイメージ画像</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTにはどのような機能がありますか.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4615" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTにはどのような機能がありますか.jpg" alt="" width="1920" height="1388" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTにはどのような機能がありますか.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTにはどのような機能がありますか-300x217.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTにはどのような機能がありますか-1024x740.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTにはどのような機能がありますか-768x555.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTにはどのような機能がありますか-1536x1110.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>文章（文字列を解析）してのAIとなるため、苦手な分野もありますが、それらの分野でも別のAIのサービスが出てきています。</p>
<p>例えば、画像生成AIであれば、「DreamStudio（<a href="https://beta.dreamstudio.ai/home" rel="noopener">https://beta.dreamstudio.ai/home</a>）」や「Mage（<a href="https://www.mage.space/" target="_blank" rel="nofollow noopener">https://www.mage.space/</a>）」などがあります。</p>
<p>テキスト入力すると、キーワードから自動で画像を生成してくれます。</p>
<p>以下は、DreamStudioを使って、<span class="Y2IQFc" lang="ja">魅力的なビジュアルストアディスプレイと入力して生成した画像の例</span></p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-dreamstudioでショップレイアウト生成例.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4613" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-dreamstudioでショップレイアウト生成例.jpg" alt="" width="1920" height="1097" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-dreamstudioでショップレイアウト生成例.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-dreamstudioでショップレイアウト生成例-300x171.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-dreamstudioでショップレイアウト生成例-1024x585.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-dreamstudioでショップレイアウト生成例-768x439.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-dreamstudioでショップレイアウト生成例-1536x878.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>こちらは、キーワード「猫型ロボットのうさぎみみ」などで生成した例</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-DreamStudio猫型ロボットうさぎみみ.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4617" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-DreamStudio猫型ロボットうさぎみみ.jpg" alt="" width="1920" height="1098" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-DreamStudio猫型ロボットうさぎみみ.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-DreamStudio猫型ロボットうさぎみみ-300x172.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-DreamStudio猫型ロボットうさぎみみ-1024x586.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-DreamStudio猫型ロボットうさぎみみ-768x439.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-DreamStudio猫型ロボットうさぎみみ-1536x878.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></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>
<h2>ChatGPTを使ったSalesforceのLightning web component開発</h2>
<p>では、さっそく本題のChatGPTを使って、Salesforceのプログラミング（ソースコード自動生成）を試してみたいと思います。</p>
<p>ChatGPTには、次の内容を入力しました。</p>
<p>「SalesforceのLightning web componentでお問い合わせフォームを作成する場合のコードを教えて」</p>
<p>すると以下3つ（HTML、Javascript、CSS）のコードが生成されました。</p>
<p>①生成されたHTMLファイル（ContactForm.html）</p>
<pre class=""><code class="language-apex code_break">&lt;template&gt;
&lt;div class="slds-m-around_medium"&gt;
&lt;lightning-card title="お問い合わせフォーム"&gt;
&lt;div class="slds-m-around_medium"&gt;
&lt;lightning-input type="text" label="お名前" required value={name} onchange={handleNameChange}&gt;&lt;/lightning-input&gt;
&lt;lightning-input type="email" label="メールアドレス" required value={email} onchange={handleEmailChange}&gt;&lt;/lightning-input&gt;
&lt;lightning-input type="text" label="件名" required value={subject} onchange={handleSubjectChange}&gt;&lt;/lightning-input&gt;
&lt;lightning-textarea label="メッセージ" required value={message} onchange={handleMessageChange}&gt;&lt;/lightning-textarea&gt;
&lt;/div&gt;
&lt;div class="slds-m-around_medium"&gt;
&lt;lightning-button variant="brand" label="送信" onclick={handleSubmit}&gt;&lt;/lightning-button&gt;
&lt;/div&gt;
&lt;/lightning-card&gt;
&lt;/div&gt;
&lt;/template&gt;
</code></pre>
<p>実際のChatGPTの画像（ContactForm.html）</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4619" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成.jpg" alt="" width="1920" height="1105" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成-300x173.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成-1024x589.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成-768x442.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成-1536x884.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>②生成されたJavaScriptファイル (contactForm.js)</p>
<pre class=""><code class="language-apex code_break">&lt;template&gt;

import { LightningElement, track } from 'lwc';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';

export default class ContactForm extends LightningElement {
@track name = '';
@track email = '';
@track subject = '';
@track message = '';

handleNameChange(event) {
this.name = event.target.value;
}

handleEmailChange(event) {
this.email = event.target.value;
}

handleSubjectChange(event) {
this.subject = event.target.value;
}

handleMessageChange(event) {
this.message = event.target.value;
}

handleSubmit() {
// フォームの入力内容を検証
if (this.name === '' || this.email === '' || this.subject === '' || this.message === '') {
const event = new ShowToastEvent({
title: '入力エラー',
message: '必須項目を入力してください。',
variant: 'error'
});
this.dispatchEvent(event);
return;
}

// フォームを送信
// TODO: サーバーサイドの処理を実装する
const event = new ShowToastEvent({
title: '送信完了',
message: 'お問い合わせを受け付けました。',
variant: 'success'
});
this.dispatchEvent(event);
}
}
</code></pre>
<p>実際のChatGPTの画像（②ContactForm.js）</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成JavaScript.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4621" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成JavaScript.jpg" alt="" width="1920" height="1103" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成JavaScript.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成JavaScript-300x172.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成JavaScript-1024x588.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成JavaScript-768x441.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成JavaScript-1536x882.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>③生成されたCSSファイル (contactForm.css):</p>
<pre class=""><code class="language-apex code_break">
.slds-m-around_medium {
margin: 20px;
}
</code></pre>
<p>実際のChatGPTの画像（ContactForm.css）</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成CSS2.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4623" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成CSS2.jpg" alt="" width="1920" height="1099" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成CSS2.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成CSS2-300x172.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成CSS2-1024x586.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成CSS2-768x440.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceのLWCを自動生成CSS2-1536x879.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>では、Visual Studio Codeを使って、上記の生成されたコードをコピペして実際にLWCを作成してみます。</p>
<p>VSCを起動して、新規Lightning web componentを作成します。※名前はcontactForm</p>
<p>続いて、VSCで作成されたcontactForm.htmlを開いて、ChatGPTで生成されたソースコードをコピーして貼り付けます。</p>
<p>まずはcontactForm.html</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコードを自動生成.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4620" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコードを自動生成.jpg" alt="" width="1920" height="1196" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコードを自動生成.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコードを自動生成-300x187.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコードを自動生成-1024x638.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコードを自動生成-768x478.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコードを自動生成-1536x957.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>続いて、ContactForm.jsに張り付け</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCJavaScriptをVSCで実行.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4624" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCJavaScriptをVSCで実行.jpg" alt="" width="1920" height="1191" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCJavaScriptをVSCで実行.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCJavaScriptをVSCで実行-300x186.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCJavaScriptをVSCで実行-1024x635.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCJavaScriptをVSCで実行-768x476.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCJavaScriptをVSCで実行-1536x953.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>続いてContactForm.cssにソースコードを張り付け　※CSSファイルがない場合、自分で作成しておきます。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCCSSをVSCで実行.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4625" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCCSSをVSCで実行.jpg" alt="" width="1920" height="1236" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCCSSをVSCで実行.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCCSSをVSCで実行-300x193.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCCSSをVSCで実行-1024x659.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCCSSをVSCで実行-768x494.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCCSSをVSCで実行-1536x989.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>最後にXMLファイルを以下のように修正し、ホーム画面などにコンポーネントを配置可能としておきます。</p>
<pre class=""><code class="language-apex code_break">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"&gt;
&lt;apiVersion&gt;56.0&lt;/apiVersion&gt;
&lt;isExposed&gt;true&lt;/isExposed&gt;
&lt;targets&gt;
&lt;!-- コンポーネントの配置先を指定 --&gt;
&lt;target&gt;lightning__AppPage&lt;/target&gt;
&lt;target&gt;lightning__RecordPage&lt;/target&gt;
&lt;target&gt;lightning__HomePage&lt;/target&gt;
&lt;/targets&gt;
&lt;/LightningComponentBundle&gt;
</code></pre>
<p>ソースの修正が完了したら最後にコンポーネントをデプロイします。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCをVSCでデプロイ.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4626" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCをVSCでデプロイ.jpg" alt="" width="1920" height="1198" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCをVSCでデプロイ.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCをVSCでデプロイ-300x187.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCをVSCでデプロイ-1024x639.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCをVSCでデプロイ-768x479.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCをVSCでデプロイ-1536x958.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<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">デプロイはうまくいったけど、画面はちゃんと表示されるの？と疑ってる方もいると思いますが、実際にSalesforceでコンポーネントを配置して確認してみましょう。</div></div></div></p>
<p>では、ここからはSalesforce組織側の設定となります。</p>
<p>まずは、Salesforceにログインして、ホーム画面のページ編集を行います。ここで、先ほど作成したContactFormのカスタムコンポーネントを好きな場所へ配置します。例では、右上に配置しています。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントの配置設定.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4631" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントの配置設定.jpg" alt="" width="1920" height="1107" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントの配置設定.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントの配置設定-300x173.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントの配置設定-1024x590.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントの配置設定-768x443.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントの配置設定-1536x886.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>もしここでコンポーネントが配置されない場合、XMLファイルの指定が間違っている可能性があるので確認してください。</p>
<p>コンポーネントを配置して、保存が終了したら戻ってホーム画面を表示します。</p>
<p>以下のようにお問い合わせフォームが表示されます！！</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントを表示2.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4632" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントを表示2.jpg" alt="" width="1920" height="1104" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントを表示2.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントを表示2-300x173.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントを表示2-1024x589.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントを表示2-768x442.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceお問い合わせフォームのLWCコンポーネントを表示2-1536x883.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>では動作のほうも確認してみましょう。</p>
<p>以下のようにテキストを入力して実行してみます。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCに入力.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4629" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCに入力.jpg" alt="" width="1920" height="1058" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCに入力.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCに入力-300x165.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCに入力-1024x564.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCに入力-768x423.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCに入力-1536x846.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>送信ボタンを押すと、JavaScriptで定義した「ShowToastEvent()」が処理され、以下のメッセージが表示されています。</p>
<p>送信完了　お問い合わせを受け付けました。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCを実行.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4628" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCを実行.jpg" alt="" width="1920" height="1116" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCを実行.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCを実行-300x174.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCを実行-1024x595.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCを実行-768x446.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTで生成したお問い合わせフォームのLWCを実行-1536x893.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>ChatGPTの最後のメッセージには次のように記載されています。</p>
<p>「このコードでは、フォームが送信される前にJavaScriptでフォームの入力内容を検証しています。また、入力内容が不足している場合はエラーメッセージを表示し、送信が成功した場合は成功メッセージを表示しています。ただし、サーバーサイドのフォーム処理については、実際のシステムに合わせて変更する必要があります。また、CSSでフォームのスタイルを設定する」</p>
<p>この内容の通り、もちろんサーバサイド側の処理（Apexクラス）は別途作成する必要がありますが、プロトタイプで項目や操作イメージをレビューするのには十分な品質ではないでしょうか。（ここまでの作業をすべてやった場合でも、慣れれば5分程度でできます）</p>
<p>要件定義工程でプロトタイプ作成のSEやPGの要員を削減することができる場合も出てくるでしょう。</p>
<p>このスピード間で作業するのは普通にコーディングしていたら無理だと思います。品質についてもバグなしでこの品質をサクッと作れるというのは凄すぎますね。</p>
<p>実際私もやってみるまでは、「たぶんデプロイでエラーが発生して何回か修正しながらやる必要があるかな。。」と思っていましたが、全く不要でした。（感想）</p>
<h3>【補足】さらに品質をあげるために</h3>
<p>簡単なフォームならChatGPTでもいいかもしれないけど、これじゃ項目も少ないし、デザインもいまいちだし。。。となにかとChatGPTの欠点やあらさがしをしてしまう方もいるでしょう。</p>
<p>そんな方に向けて、ChatGPTの凄さはもちろんこれだけでは終わらないのです。</p>
<p>例えば、フォームに会社名の項目を追加したい場合には、次のように入力してみます。</p>
<p>「SalesforceのLightning web componentでお問い合わせフォームを作成する場合のコードを教えて、会社名の項目も必要です」</p>
<p>すると、、、以下のようにちゃんとテキストで会社名の項目が追加されています。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでLWCお問い合わせフォームに会社名を追加する.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4635" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでLWCお問い合わせフォームに会社名を追加する.jpg" alt="" width="1880" height="1464" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでLWCお問い合わせフォームに会社名を追加する.jpg 1880w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでLWCお問い合わせフォームに会社名を追加する-300x234.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでLWCお問い合わせフォームに会社名を追加する-1024x797.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでLWCお問い合わせフォームに会社名を追加する-768x598.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでLWCお問い合わせフォームに会社名を追加する-1536x1196.jpg 1536w" sizes="auto, (max-width: 1880px) 100vw, 1880px" /></a></p>
<p>このように一度作成したものをどんどん改良していくことが簡単にできてしまうのです。</p>
<h2>そのほかChatGPTを使ったインプリや開発について</h2>
<p>ChatGPTを開発現場でどのように利用していくか、他の用途を考えてみました。</p>
<h3>Apexのコーディング</h3>
<p>Apexのコーディングはどうなのだろうと思った方も多いはず。試しにやってみました</p>
<p>ChatGPTには、「Salesforceの取引先の取引先名をXXに更新するApexトリガーを作成してください」とお願いしました。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先名を更新Apex.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4640" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先名を更新Apex.jpg" alt="" width="1920" height="1235" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先名を更新Apex.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先名を更新Apex-300x193.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先名を更新Apex-1024x659.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先名を更新Apex-768x494.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先名を更新Apex-1536x988.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>上記の通り、簡単な内容ですが、しっかりとトリガーが作成されました。</p>
<p>しかもソースコードにコメントもちゃんとついてますし、トリガーについての説明も丁寧に記載されています。（素晴らしい）</p>
<h3>コードレビュー</h3>
<p>ソースコードが出来上がったら、コードとあわせてChatGPTに「コードのバグをチェックしてください」とお願いしてみましょう。</p>
<p>すると以下の結果が返ってきます。例では簡単なApexクラスの処理を読み込ませています。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビュー2.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4646" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビュー2.jpg" alt="" width="1920" height="1420" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビュー2.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビュー2-300x222.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビュー2-1024x757.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビュー2-768x568.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビュー2-1536x1136.jpg 1536w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビュー2-343x254.jpg 343w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビュー2-202x150.jpg 202w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>バグがないというチェックだけではなく、良いプログラミングの実践のためのアドバイスや、補足説明などもしてくれています。</p>
<p>つぎに、バグがある場合にもちゃんとチェックされるのかということで、Insert文で指定する変数を削除して、再度レビュー依頼してみました。以下がChatGPTからの回答です。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4644" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）.jpg" alt="" width="1900" height="1508" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）.jpg 1900w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）-300x238.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）-1024x813.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）-768x610.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）-1536x1219.jpg 1536w" sizes="auto, (max-width: 1900px) 100vw, 1900px" /></a></p>
<p>ちゃんとバグを見つけてくれました。ちゃんとコメントで修正が必要な内容が書かれています！</p>
<p>さらに以下のように修正されたコードまで提示してくれる神仕様となっております。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）レビュー説明.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4643" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）レビュー説明.jpg" alt="" width="1920" height="1100" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）レビュー説明.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）レビュー説明-300x172.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）レビュー説明-1024x587.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）レビュー説明-768x440.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでApexコードレビューInsertの後ろを削除）レビュー説明-1536x880.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>いかがでしょうか。。もうコードレビューはChatGPTに頼ればいいですね。。</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">コードレビューの工数も削減できますね。どんどん人が不要になる時代。。</div></div></div></p>
<h3>Salesforceのインプリ設定の調査</h3>
<p>例えばSalesforceのインプリ設定を依頼されたときに使ったことがない機能の場合は、どのような手順で設定するか調べると思いますが、それもChatGPTなら簡単にできてしまいます。</p>
<p>ChatGPTに「Salesforceの承認プロセスはどのように設定しますか」と聞いてみます。すると。。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの承認プロセス手順を質問.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4641" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの承認プロセス手順を質問.jpg" alt="" width="1920" height="1368" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの承認プロセス手順を質問.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの承認プロセス手順を質問-300x214.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの承認プロセス手順を質問-1024x730.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの承認プロセス手順を質問-768x547.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの承認プロセス手順を質問-1536x1094.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>といった感じです。これをきれいに章立てしてまとめるとマニュアルとして利用することもできますね。</p>
<p>ということで、操作マニュアルの生成もかなりの作業効率化が見込まれます。もちろんスクリーンショットなどは自分で取得しないといけませんが、、、（現時点では）</p>
<h3>セールスフォースの用語集作成</h3>
<p>例えば、Salesforce関連の用語集など作成したい場合は、以下のようにChatGPTに依頼してみます。</p>
<p>「次のセールスフォース用語について用語集を作成してください。ロール、プロファイル、権限セット」</p>
<p>すると以下のように要約された内容が返ってきました。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4637" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成.jpg" alt="" width="1855" height="1234" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成.jpg 1855w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成-300x200.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成-1024x681.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成-768x511.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成-1536x1022.jpg 1536w" sizes="auto, (max-width: 1855px) 100vw, 1855px" /></a></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">どうですか。この精度の内容をさくっと作ってくれます。もう用語集作成担当は不要ですね（笑）</div></div></div></p>
<p>さらに、以下のように調べた用語について表にまとめるようなことも簡単にやってくれます。</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成（表形式で）.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4636" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成（表形式で）.jpg" alt="" width="1909" height="698" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成（表形式で）.jpg 1909w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成（表形式で）-300x110.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成（表形式で）-1024x374.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成（表形式で）-768x281.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでセールスフォース用語集作成（表形式で）-1536x562.jpg 1536w" sizes="auto, (max-width: 1909px) 100vw, 1909px" /></a></p>
<h3>オブジェクト項目のAPI参照名を確認</h3>
<p>「Salesforceの取引先の全ての項目のAPI参照名をおしえてください」とChatGPTに依頼してみました結果</p>
<p><a href="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先のAPI参照名を表示.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4638" src="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先のAPI参照名を表示.jpg" alt="" width="1920" height="1470" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先のAPI参照名を表示.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先のAPI参照名を表示-300x230.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先のAPI参照名を表示-1024x784.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先のAPI参照名を表示-768x588.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2023/02/saleforce-development-using-ai-chatgpt-automatic-code-generation-ChatGPTでSalesforceの取引先のAPI参照名を表示-1536x1176.jpg 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /></a></p>
<p>あっさりと出てきました。。</p>
<p>そのほかにもオブジェクト項目の翻訳なども一括で行い、結果を表にまとめるような場合にも利用できますね。</p>
<p>まだまだアイデアはたくさんありますが、、、検証ができたら記事にしていきたいと思います。</p>
<h2>SalesforceとChatGPTの連携について</h2>
<p>これまでの検証はChatGPTのフリーのバージョンを使って行ってきましたが、ChatGPTの有償版ではAPIを利用することができます。</p>
<p>そのためChatGPTのAPIを利用すれば、SalesforceのApexからChatGPTのAPIをコールして、その結果をSalesforceに表示したりナレッジに蓄積したりするようなことができそうです。（未検証ですが）</p>
<p>このあたりは、SalesforceのAI（Einstein）との兼ね合いもあるので、外部システムのAIを利用すべきかどうかは検討が必要だと思います。</p>
<h2>ChatGPTについての参考リンク</h2>
<p>まずお勧めなのが中田敦彦さんのYoutube。こちらでChatGPTやGoogleのBardなどについての概要が非常にわかりやすく説明されています。</p>
<p>[youtube id=YNEb3EK4rNY]</p>
<p>続いてもYoutubeの動画となりますが、「2030年の未来予測@広島弁フューチャリスト友村普」さんで「ChatGPTの使い方を初心者にもわかりやすく解説。ChatGPTの活用方法は？【openAIのChatGPTとBard】AIが世界を変える？中田敦彦さんもとりあげたチャットGPTとは？」となります。</p>
<p>[youtube id=JtSGYfPAu4Q]</p>
<p>こちらの動画では、どのように文章を生成するのかを実際にChatGPTを使って説明しています。非表示具体的でわかりやすい手順の説明をされています。</p>
<h2>まとめ</h2>
<p>今回は、ChatGPTを使ったSalesforceの開発について説明しました。</p>
<p>今後ChatGPT以外もAIがさらに進化して、どんどん作業効率化が進んでいくでしょう。</p>
<p>AIをどのように使いこなすかが問われる時代になりますね。自分の価値をどこで出すか本気で考えていく必要がありそうです。</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">ブログランキングに参加しましたので、ご支援していただけると幸いです。</div></div></div></p>
<p><a href="https://it.blogmura.com/ranking/in?p_cid=11084904" target="_blank" rel="noopener noreferrer"><img loading="lazy" decoding="async" src="https://b.blogmura.com/banner-blogmura-portfolio.svg" alt="にほんブログ村 IT技術ブログへ" width="88" height="31" border="0" /></a><br />
<a href="https://it.blogmura.com/ranking/in?p_cid=11084904" rel="noopener">にほんブログ村</a></p>
		<div class="wpulike wpulike-animated-heart " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="いいねボタン"
					data-ulike-id="4605"
					data-ulike-nonce="4b3888c285"
					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_4605"><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="+4"></span>			</div></div>
	]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
