エンジニア向け Salesforce 研修
システム開発経験はあるがSalesforce未経験のエンジニア向けの研修資料です。
5日間のカリキュラムで、弊社のSalesforce開発に参加できる状態を目指します。
必須
5日間
SF未経験OK
ハンズオン有
課題有
2025年版
5
研修日数
6
主要セクション
5
実践課題
30+
参考リンク
対象者: エンジニア(SF未経験)
ゴール: 弊社のSalesforce開発に参加できる状態になる
ゴール: 弊社のSalesforce開発に参加できる状態になる
1日目
SF基礎・前提知識
2日目
宣言的開発
3日目
プログラム的開発
4日目
リリース・弊社環境
5日目
弊社OP・実践
課題
実践課題5問
📅 研修スケジュール
| 日程 | テーマ | 内容 |
|---|---|---|
| 1日目 | SF基礎・前提知識 | 画面操作、オブジェクト、項目、入力規則、プロファイル等 |
| 2日目 | 宣言的開発 | ワークフロー、プロセスビルダー、フロー、データ投入 |
| 3日目 | プログラム的開発 | Apex、SOQL、トリガー、バッチ、ガバナ制限 |
| 4日目 | リリース・弊社環境 | 変更セット、テストクラス、弊社環境構成、必須設定 |
| 5日目 | 弊社OP・実践 | 開発プロセス、課題実施 |
📚 1. SF基礎・前提知識(1日目)
1.1 Salesforceの基本概念
| 概念 | 説明 |
|---|---|
| マルチテナント | 複数の顧客が同一インフラを共有 |
| メタデータ駆動 | 設定やカスタマイズがメタデータとして保存 |
| 宣言的 vs プログラム的 | ノーコード(Flow等)とコード(Apex等)の使い分け |
開発アプローチの選択基準
| アプローチ | 使用場面 | 例 |
|---|---|---|
| 宣言的 | 標準機能で実現可能な場合 | Flow、入力規則、数式項目 |
| プログラム的 | 複雑なロジック、外部連携 | Apex、LWC、トリガー |
原則: 宣言的 → プログラム的 の順で検討する
1.2 画面操作
Setup(設定画面)
アクセス方法
歯車アイコン → Setup
主要な設定場所:
- Object Manager: オブジェクト・項目の管理
- Users: ユーザー管理
- Profiles / Permission Sets: 権限管理
- Flows: フロー管理
- Apex Classes / Triggers: コード管理
1.3 カスタムオブジェクト・カスタム項目
オブジェクトの種類
| 種類 | 説明 | 例 |
|---|---|---|
| 標準オブジェクト | Salesforceが提供 | Account, Contact, Opportunity |
| カスタムオブジェクト | 独自に作成(__cサフィックス) | MoveIn__c, ServiceGuide__c |
項目の種類
| 項目型 | 説明 | 用途 |
|---|---|---|
| Text | テキスト | 名前、コード等 |
| Number | 数値 | 金額、数量等 |
| Date / DateTime | 日付 | 期日、タイムスタンプ |
| Checkbox | 真偽値 | フラグ |
| Picklist | 選択リスト | ステータス、カテゴリ |
| Lookup | 参照関係 | 他オブジェクトへの参照 |
| Master-Detail | 主従関係 | 親子関係(連鎖削除あり) |
| Formula | 数式 | 計算値、参照値 |
| Roll-Up Summary | 積み上げ集計 | 子レコードの集計(Master-Detailのみ) |
リレーションの違い
| 関係 | Lookup | Master-Detail |
|---|---|---|
| 必須 | 任意 | 必須 |
| 削除時 | 参照先は残る | 連鎖削除 |
| 共有設定 | 独立 | 親に従う |
| 積み上げ集計 | 不可 | 可能 |
数式項目の例
Formula
// 税込金額の計算 Price__c * 1.1 // 条件分岐 IF(Status__c = '契約済', '完了', '未完了') // 日付計算 TODAY() - CreatedDate
1.4 入力規則
データの品質を保つためのバリデーション機能。条件式(エラーとなる条件)を数式で記述します。
入力規則の例
// 電話番号が空の場合にエラー AND( ISBLANK(Phone), ISPICKVAL(Status__c, '契約済') ) // エラーメッセージ: 契約済みの場合、電話番号は必須です
1.5 プロファイル
ユーザーの権限を制御する基本単位。
| 権限 | 説明 |
|---|---|
| オブジェクト権限 | CRUD(作成・参照・更新・削除) |
| 項目レベルセキュリティ(FLS) | 項目の参照・編集可否 |
| タブ表示設定 | タブの表示・非表示 |
| アプリケーションアクセス | 使用可能なアプリ |
🔧 2. 宣言的開発(2日目)
2.1 開発手段の選定基準
選定の順序
入力規則
→
フロー
→
Apex
レコード操作を起点とするソリューション比較
| 手段 | 実行速度 | 他レコード操作 | 注意点 |
|---|---|---|---|
| Apex トリガ | 早い | ほぼ全て可 | テストクラス必要 |
| フロー | 遅い | ほぼ全て可 | 複雑な処理で重くなる可能性 |
| プロセスビルダー | 遅い | 主従関係のみ | ※廃止予定 |
| ワークフロー | 早い | 主従関係のみ | ※廃止予定 |
2.2 Sandbox について
本番環境のコピーで、開発・テストを行う環境。
| 種類 | データ | 更新頻度 | 用途 |
|---|---|---|---|
| Developer | メタデータのみ | 1日1回 | 開発 |
| Developer Pro | メタデータのみ | 1日1回 | 大規模開発 |
| Partial Copy | 一部データ含む | 5日に1回 | テスト |
| Full | 全データ | 29日に1回 | 本番検証 |
2.3 フロー
フローの種類
| 種類 | 起動タイミング | 用途 |
|---|---|---|
| 画面フロー | ユーザー操作 | ウィザード形式の入力画面 |
| レコードトリガーフロー | レコード操作時 | トリガーの代替 |
| スケジュールトリガーフロー | 定期実行 | バッチ処理の代替 |
| 自動起動フロー | 他から呼び出し | 再利用可能な処理 |
レコードトリガーフローの実行タイミング
| タイミング | 説明 | 用途 |
|---|---|---|
| Before Save | 保存前(高速) | 項目値の設定 |
| After Save | 保存後 | 関連レコード操作、外部連携 |
2日目 ハンズオン課題
- フローの作成
- レコードトリガーフロー: 取引先作成時に関連レコードを自動作成
- 画面フロー: 複数項目を入力してレコードを作成
- データローダーでのインポート
- CSVファイルからレコードを一括作成
💻 3. プログラム的開発(3日目)
注意: SQLではなくSOQL。構文は似ているがSalesforce専用のクエリ言語です。
3.1 SOQL
SOQL
-- 基本構文 SELECT Id, Name, CreatedDate FROM Account WHERE CreatedDate = THIS_YEAR ORDER BY Name LIMIT 100 -- 親オブジェクトの参照(リレーション名を使用) SELECT Id, Name, Account.Name FROM Contact WHERE Account.Industry = 'Technology' -- 子オブジェクトの取得(サブクエリ) SELECT Id, Name, (SELECT Id, LastName FROM Contacts) FROM Account -- 集計関数 SELECT COUNT(Id), SUM(Amount), AVG(Amount) FROM Opportunity WHERE StageName = 'Closed Won' GROUP BY AccountId
3.2 Apex トリガー
レコードの作成・更新・削除時に自動実行されるApexコード。
トリガーコンテキスト
| コンテキスト | タイミング | 用途 |
|---|---|---|
| before insert | 保存前(新規) | 値の設定、入力検証 |
| before update | 保存前(更新) | 値の設定、入力検証 |
| after insert | 保存後(新規) | 関連レコード作成、外部連携 |
| after update | 保存後(更新) | 関連レコード更新、外部連携 |
| before delete | 削除前 | 削除検証 |
| after delete | 削除後 | 関連レコード処理 |
トリガーの基本構文
Apex Trigger
trigger AccountTrigger on Account (before insert, before update, after insert, after update) {
if (Trigger.isBefore) {
if (Trigger.isInsert) {
// before insert の処理
}
if (Trigger.isUpdate) {
// before update の処理
}
}
if (Trigger.isAfter) {
// after の処理
}
}
3.3 ガバナ制限
Salesforceはマルチテナント環境のため、1つのトランザクションで使用できるリソースに制限があります。
| 制限項目 | 同期 | 非同期 | 解決策 |
|---|---|---|---|
| SOQLクエリ数 | 100 | 200 | ループ内SOQL禁止 |
| SOQL取得行数 | 50,000 | 50,000 | LIMIT句を付ける |
| DMLステートメント数 | 150 | 150 | Listでまとめて実行 |
| DML処理行数 | 10,000 | 10,000 | バッチ処理で分割 |
| CPU時間 | 10,000ms | 60,000ms | Map活用でネストループ削減 |
バルク化の原則
NG パターン
ループ内でSOQL/DML
ループ内でSOQL/DML
OK パターン
ループ外でまとめて実行
ループ外でまとめて実行
OK: バルク化
// OK: ループ外でまとめてSOQL
Set<Id> accountIds = new Set<Id>();
for (Account acc : accounts) {
accountIds.add(acc.Id);
}
List<Contact> contacts = [SELECT Id, AccountId FROM Contact WHERE AccountId IN :accountIds];
// OK: ループ外でまとめてDML
List<Account> accountsToUpdate = new List<Account>();
for (Account acc : accounts) {
acc.Name = 'Updated';
accountsToUpdate.add(acc);
}
update accountsToUpdate;
3.4 バッチ処理
大量データの処理(ガバナ制限を回避)や定期実行ジョブに使用。
バッチ処理の流れ
1. Database.executeBatch() で起動
↓
2. start() で処理対象のクエリを返す(1回)
↓
3. execute() でバッチサイズごとに処理(複数回)
↓
4. finish() で完了処理(1回)
Batch Class
global class MyBatch implements Database.Batchable<sObject>, Schedulable {
// スケジュール実行用
global void execute(SchedulableContext sc) {
Database.executeBatch(new MyBatch(), 200);
}
// 処理対象のクエリを返す
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator('SELECT Id, Name FROM Account');
}
// バッチサイズごとに実行
global void execute(Database.BatchableContext bc, List<Account> scope) {
// 処理ロジック
}
// 完了時に1回実行
global void finish(Database.BatchableContext bc) {
// 完了通知など
}
}
3日目 参考リンク
🚀 4. リリース・弊社環境(4日目)
4.1 変更セット
Sandboxから本番環境へメタデータをデプロイする機能。
変更セットの手順
1. Sandboxで送信変更セット作成
↓
2. コンポーネントを追加してアップロード
↓
3. 本番で受信変更セット取得
↓
4. 検証(テスト実行)→ デプロイ
本番デプロイの要件:
• 全テストの実行で 75%以上のコードカバレッジ
• 全テストが成功すること
• 全テストの実行で 75%以上のコードカバレッジ
• 全テストが成功すること
4.2 Apex テストクラス
Test Class
@isTest
private class MyClassTest {
@TestSetup
static void setup() {
// テストデータ作成(全テストメソッドで共有)
Account acc = new Account(Name = 'Test Account');
insert acc;
}
@isTest
static void testMethod1() {
// テストデータ取得
Account acc = [SELECT Id FROM Account LIMIT 1];
// テスト実行
Test.startTest();
String result = MyClass.doSomething(acc.Id);
Test.stopTest();
// 検証
System.assertEquals('Expected', result, 'Result should match');
}
}
4.3 弊社システム構成
外部システム
イタンジ / Zoom / LINE / WeChat
↓ API連携
Salesforce
UI Layer: Lightning App / LWC / Visualforce / Flow
Business Logic: Apex Classes / Triggers / Batch Jobs
Data Layer: Standard Objects / Custom Objects
Business Logic: Apex Classes / Triggers / Batch Jobs
Data Layer: Standard Objects / Custom Objects
↓ REST API
外部サーバー群
api-server (Cloud Run) / 自動申込 (Lambda) / イタンジCSV (Cloud Run)
4.4 開発環境構築
Salesforce CLI(SFDX)
Terminal
# インストール(macOS) brew install sf # Sandbox への認証 sf org login web --instance-url https://test.salesforce.com --alias staging # 認証済み組織の確認 sf org list # メタデータの取得 sf project retrieve start --source-dir force-app # メタデータのデプロイ sf project deploy start --source-dir force-app
VS Code 拡張機能
- Salesforce Extension Pack - SF開発の基本機能
- Apex PMD - 静的解析
- ESLint - JavaScript/LWC用
- Prettier - コードフォーマット
🎯 5. 弊社OP・実践(5日目)
5.1 開発フロー概要
要件定義
→
設計
→
タスク分解
→
実装
→
テスト
→
レビュー
→
デプロイ
5.2 設計書フロー
設計書ワークフロー
/design コマンドで設計書ドラフト作成↓
PR作成 → レビュー → マージ
↓
/approve-design コマンドで承認↓
/build コマンドで実装開始5.3 コミットメッセージ規約
Commit Message
[type]: [簡潔な説明] [詳細な説明(任意)] # type の種類: # feat: 新機能 # fix: バグ修正 # docs: ドキュメント # refactor: リファクタリング # test: テスト # chore: その他
5.4 コードレビューチェックポイント
- ガバナ制限を考慮しているか
- バルク化されているか
- CRUD/FLSを考慮しているか
- テストが書かれているか
- 設計書と一致しているか
📝 6. 課題
研修の理解度を確認するための実践課題です。
| # | 課題名 | 目安日程 | 学習目標 |
|---|---|---|---|
| 1 | BtoB用車ディーラー受注管理システムの作成 | 1-2日目終了後 | オブジェクト設計、フロー作成 |
| 2 | プロセスビルダーとフローの構築 | 2日目終了後 | 自動化の理解 |
| 3 | Apexトリガーの作成 | 3日目終了後 | トリガー、バルク化 |
| 4 | Apexクラスの作成、テストクラスの構築 | 3-4日目終了後 | Apex、テスト |
| 5 | バッチ処理(日報送信バッチ) | 4-5日目終了後 | バッチ、スケジュール |
課題1: 受注管理システムの構築
ER図
取引先 (Account)
取引先名 / 業種 / 住所 / 電話番号
↓ Lookup
受注 (Order__c)
取引先(参照) / 担当社員(参照) / 受注金額 / ステータス / 予算(参照) / 受注日
レコードタイプ: 販売 / リース
レコードタイプ: 販売 / リース
↓ Master-Detail
受注明細 (OrderDetail__c)
受注(主従) / 商品(参照) / 数量 / 単価(数式) / 小計(数式) / 税込合計(数式)
作成するもの一覧
- カスタムオブジェクト(社員マスタ、商品、予算、受注、受注明細)
- カスタム項目(各オブジェクト)
- レコードタイプ(受注: 販売/リース、受注明細: 販売/リース)
- ページレイアウト(レコードタイプ別)
- タブ(受注明細以外)
- 入力規則(予算の年月、受注の担当者)
- 一致ルール・重複ルール(予算、取引先)
課題3: Apexトリガーの作成
要件
請求レコード作成時に、担当部署全員にメール通知を送信するトリガーを実装する。
処理フロー
メール通知トリガー
1. 請求レコード作成 (after insert)
↓
2. 受注から担当社員の部署を取得
↓
3. 同じ部署の社員マスタからメールアドレスを取得
↓
4. メール送信 & 備考に送信先記録
作成するもの
- 請求オブジェクトに備考項目を追加
- InvoiceTrigger(トリガー)
- InvoiceTriggerHandler(ハンドラクラス)
- InvoiceTriggerHandlerTest(テストクラス)
✅ 研修完了チェックリスト
- Salesforceの基本概念を理解した
- カスタムオブジェクト・項目を作成できる
- フローを作成できる
- SOQLを記述できる
- Apexトリガーを実装できる
- ガバナ制限を理解している
- テストクラスを作成できる
- 変更セットでデプロイできる
- 弊社の開発フローを理解した