Salesforce ナレッジの習得:プログラマティックなアクセスと自動化のためのアーキテクトガイド


背景と応用シーン

Salesforce Knowledge (ナレッジベース) は、企業が顧客や社内ユーザー向けに情報を一元管理し、提供するための強力なツールです。FAQ、トラブルシューティングガイド、製品マニュアルなど、様々な情報を整理・公開することで、顧客の自己解決を促進し、サポートエージェントの業務効率を大幅に向上させます。これは、Service Cloud の中核機能の一つであり、優れたカスタマーエクスペリエンスを実現する上で不可欠です。

技術アーキテクトの視点から見ると、Salesforce Knowledge の真価は、単なる情報の保管庫としてだけでなく、他の Salesforce 機能や外部システムとプログラム的に連携させることで最大限に引き出されます。以下に具体的な応用シーンを挙げます。

  • Experience Cloud (旧 Community Cloud) との連携: 顧客やパートナー向けのポータルサイトで、ユーザーの属性や閲覧履歴に基づいて関連性の高いナレッジ記事を動的に表示します。
  • Service Console 内でのインテリジェントな記事推薦: サポートエージェントが対応中のケースの内容(件名、説明、製品カテゴリなど)を分析し、解決に役立つ可能性のあるナレッジ記事を自動で推薦します。
  • Einstein Bot との統合: チャットボットがユーザーからの質問に対して、ナレッジベースから最適な回答を検索して提示します。これにより、24時間365日の自動応答が可能になります。
  • カスタムコンポーネントの開発: Lightning Web Components (LWC) や Aura Components を使用して、特定の業務フローに最適化された独自のナレッジ検索・表示インターフェースを構築します。
  • 外部システムとの同期: 企業の公式ウェブサイトや社内イントラネットなど、外部のコンテンツ管理システム (CMS) とナレッジ記事を同期させ、情報の一貫性を保ちます。

これらの高度な連携や自動化を実現するためには、Salesforce Knowledge のデータモデルと、それを操作するためのプログラミング手法を深く理解することが不可欠です。


原理説明

Salesforce Knowledge をプログラム的に扱う上で、まず理解すべきは、その独特のオブジェクト構造とライフサイクル管理です。標準オブジェクトとは異なるいくつかの重要な概念が存在します。

1. ナレッジオブジェクトモデル

ナレッジ記事は、単一のオブジェクトではなく、複数のオブジェクトによって構成されています。最も重要なのは Knowledge Article Version オブジェクトで、API参照名は Knowledge__kav です。このオブジェクトが記事の各バージョン(下書き、公開済み、アーカイブ済み)の具体的な内容(タイトル、本文など)を保持しています。

  • Knowledge__kav: 記事の「バージョン」を表します。新しい下書きを作成したり、記事を更新したりする際には、主にこのオブジェクトを操作します。
  • Knowledge__ka: 記事の「マスター」レコードを表します。これ自体は記事の内容を持たず、複数のバージョン (__kav) を束ねる親の役割を果たします。通常、開発者が直接操作することは稀です。

例えば、記事を更新する場合、公開中のバージョンを直接編集するのではなく、「公開中のバージョンを元に新しい下書きバージョンを作成 → 下書きを編集 → 新しいバージョンを公開」というプロセスを踏みます。これにより、厳格な版管理が可能になります。

2. データカテゴリ (Data Categories)

Data Category (データカテゴリ) は、ナレッジ記事を階層的に分類し、ユーザーのアクセス権を制御するための非常に重要な機能です。例えば、「製品」というカテゴリグループの下に「ラップトップ」「スマートフォン」といったカテゴリを作成し、さらにその下に「トラブルシューティング」「設定方法」といったサブカテゴリを設けることができます。ユーザーのプロファイルや権限セットに基づいて、特定のデータカテゴリに属する記事へのアクセスを許可または制限できます。

プログラムから記事を検索する際には、このデータカテゴリをクエリ条件に含めることが一般的であり、これによりセキュリティと関連性の高い検索結果が保証されます。

3. プログラマティックなアクセス方法

Salesforce Knowledge へのアクセスには、主に以下の3つの方法があります。

  • SOQL / SOSL: Salesforce Object Query Language (SOQL) や Salesforce Object Search Language (SOSL) を使用して、ナレッジ記事を検索します。特に、データカテゴリを指定して検索するための WITH DATA CATEGORY 句は非常に強力です。
  • Apex: Apex クラスを使用して、ナレッジ記事の作成、更新、公開、アーカイブといったライフサイクル全体を管理できます。特に KbManagement.PublishingService クラスは、記事の公開プロセスを自動化する上で中心的な役割を果たします。
  • Connect API: RESTful なアプローチでナレッジ記事にアクセスするための API です。Experience Cloud サイトや LWC、モバイルアプリケーションなど、クライアントサイドからの連携に適しています。JSON 形式でデータを送受信するため、Web 技術との親和性が高いです。

示例コード

ここでは、具体的なコード例を交えながら、ナレッジの操作方法を解説します。コードは Salesforce の公式ドキュメントに基づいています。

1. SOQL を使用したナレッジ記事の検索

特定のデータカテゴリに属し、かつ公開されている最新バージョンの記事を検索する例です。WITH DATA CATEGORY 句の使い方がポイントです。

// SOQLクエリで公開済みの最新ナレッジ記事を検索
// Geography__cというデータカテゴリグループ内のUSA__cカテゴリと、
// Products__cというデータカテゴリグループ内のLaptops__cカテゴリの両方に属する記事を対象とする
List<Knowledge__kav> articles = [
    SELECT Id, Title, Summary
    FROM Knowledge__kav
    WHERE PublishStatus = 'Online'
    AND Language = 'en_US'
    AND IsLatestVersion = true
    WITH DATA CATEGORY Geography__c AT USA__c AND Products__c ABOVE Laptops__c
];

// 検索結果をループして表示
for (Knowledge__kav article : articles) {
    System.debug('Article Title: ' + article.Title);
    System.debug('Article Summary: ' + article.Summary);
}

コード解説:

  • FROM Knowledge__kav: 記事のバージョンオブジェクトをクエリ対象としています。
  • PublishStatus = 'Online': 公開中の記事のみを対象とします。下書きは 'Draft'、アーカイブ済みは 'Archived' です。
  • IsLatestVersion = true: 各記事の最新バージョンのみを取得します。これにより、古いバージョンの記事が検索結果に含まれるのを防ぎます。
  • WITH DATA CATEGORY ...: データカテゴリを指定する句です。ここでは `Geography__c` グループの `USA__c` と、`Products__c` グループの `Laptops__c` またはその上位カテゴリに属する記事をAND条件で絞り込んでいます。

2. Apex を使用したナレッジ記事の公開

既存の下書きバージョンの記事を Apex を使って公開する例です。KbManagement.PublishingService クラスを使用します。

// 公開したい記事の下書きバージョンのIDを特定する
// 実際には、SOQLクエリなどで動的に取得する
String articleVersionId = 'ka0xx0000000001AAA'; // これはサンプルIDです

try {
    // KbManagement.PublishingServiceクラスのインスタンスは不要で、静的メソッドを直接呼び出す
    // publishArticleメソッドは、公開が成功した場合に公開された記事のIDを返す
    String publishedArticleId = KbManagement.PublishingService.publishArticle(articleVersionId, true);
    
    // 成功時の処理
    System.debug('Article published successfully. Published Version ID: ' + publishedArticleId);

} catch (Exception e) {
    // 公開に失敗した場合の例外処理
    // 例えば、必須項目が未入力の場合や、承認プロセスが有効な場合などに失敗することがある
    System.debug('Error publishing article: ' + e.getMessage());
}

コード解説:

  • KbManagement.PublishingService.publishArticle(articleVersionId, flagAsNew): この静的メソッドが記事の公開処理を実行します。
    • 第一引数 (articleVersionId) には、公開したい下書きバージョンの Knowledge__kav レコードの ID を渡します。
    • 第二引数 (flagAsNew) を true にすると、公開時に「新しい記事」として扱われ、フィード投稿などがトリガーされる場合があります。
  • try-catch ブロック: 記事の公開は、検証ルールや承認プロセスなど様々な理由で失敗する可能性があるため、必ず例外処理を実装することが重要です。

3. Connect API を使用した記事詳細の取得

Connect API を使用して、外部アプリケーションや LWC からナレッジ記事の詳細を取得する際の REST API エンドポイントの例です。

リクエスト例:

GET /services/data/v59.0/connect/knowledge/articles/{articleUrlName}

// HTTP GETリクエストの例 (疑似コード)
// 実際には、認証済みのHTTPクライアントからリクエストを送信する

// エンドポイントURL
// 'my-first-article' の部分は記事のURL名に置き換える
String endpoint = 'https://yourInstance.salesforce.com/services/data/v59.0/connect/knowledge/articles/my-first-article';

// ヘッダーに認証トークンを設定
// 'Authorization: Bearer [ACCESS_TOKEN]'

// リクエストを送信し、レスポンスを受け取る
HttpResponse response = sendGetRequest(endpoint, headers);

// レスポンスのJSONをパースして内容を表示
System.debug(response.getBody());

レスポンス例 (JSON):

{
  "articleNumber": "000001001",
  "articleType": "FAQ__kav",
  "id": "ka0xx0000000001AAA",
  "isLatestVersion": true,
  "publishStatus": "Online",
  "summary": "This is a summary of the article.",
  "title": "My First Article",
  "urlName": "my-first-article",
  "views": {
    "total": 120,
    "perChannel": {
      "App": 100,
      "Pkb": 20,
      "Csp": 0
    }
  },
  "layoutItems": [
    {
      "label": "Answer",
      "name": "Answer__c",
      "value": "<p>This is the full answer content.</p>",
      "type": "RICHTEXT"
    }
  ]
}

解説:

Connect API は、記事のメタデータ(タイトル、記事番号など)だけでなく、ページレイアウトで定義された項目(この例では `Answer__c`)も `layoutItems` 配列として返します。これにより、クライアント側で記事のコンテンツを柔軟にレンダリングすることが可能です。


注意事項

ナレッジをプログラム的に扱う際には、以下の点に注意が必要です。

  • 権限 (Permissions):
    • オブジェクト権限: 実行ユーザーは、対象となる記事タイプレコード(例: FAQ__kav)に対する参照、作成、編集、削除権限が必要です。
    • アプリケーション権限: 「ナレッジの管理」権限を持つユーザーは、記事の公開やアーカイブなど、より広範な操作が可能です。
    • データカテゴリの表示設定: ユーザーのプロファイルや権限セットで、アクセスを許可するデータカテゴリが正しく設定されている必要があります。これが設定されていないと、SOQL クエリでレコードが1件も返ってこない原因となります。
  • API 制限 (API Limits):
    • Governor Limits: Apex で処理を行う場合、SOQL クエリの発行回数や DML ステートメントの実行回数など、Salesforce の標準的なガバナ制限に従う必要があります。一度に大量の記事を処理する際には、バッチ Apex の利用を検討してください。
    • API コール数: Connect API や REST/SOAP API を使用する場合、組織の24時間あたりの API コール数制限に注意が必要です。特に外部システムとの頻繁な同期を行う場合は、API コールの効率化やキャッシュ戦略が重要になります。
  • エラー処理 (Error Handling):
    • 記事の公開 (KbManagement.PublishingService) は、必須項目の欠落や検証ルール違反などで失敗することがあります。必ず try-catch ブロックで例外を捕捉し、失敗時のリカバリーロジックや通知処理を実装してください。
    • API 呼び出しを行う際は、HTTP ステータスコード(200 OK 以外)を確認し、エラーレスポンスのボディを解析して原因を特定する処理を組み込むことが不可欠です。

まとめとベストプラクティス

Salesforce Knowledge は、適切に活用すれば顧客満足度と業務効率を劇的に向上させる強力なプラットフォームです。そのポテンシャルを最大限に引き出す鍵は、プログラマティックなアクセスと自動化にあります。

以下に、技術アーキテクトとして推奨するベストプラクティスをまとめます。

  1. データカテゴリ構造を戦略的に設計する: プロジェクトの初期段階で、スケーラビリティとメンテナンス性を考慮したデータカテゴリ構造を設計します。これは、将来のセキュリティ要件や検索性の基盤となります。
  2. 適切なツールを選択する:
    • サーバーサイドでの複雑なロジックや一括処理には ApexSOQL を使用します。
    • Experience Cloud や LWC、外部の Web アプリケーションからの動的なデータ取得には Connect API を活用します。
  3. ライフサイクル管理を自動化する: KbManagement.PublishingService を活用して、記事のレビュー、承認、公開、アーカイブといったプロセスを自動化する Apex トリガーやフローを構築します。これにより、手作業によるミスを減らし、コンテンツ管理のガバナンスを強化できます。
  4. セキュリティを最優先する: SOQL クエリでは必ず WITH DATA CATEGORY や共有ルールを考慮し、ユーザーが必要な情報にのみアクセスできるように徹底します。Apex クラスは with sharing キーワードを使用して、実行ユーザーの権限を尊重するように実装します。
  5. パフォーマンスを考慮する: 大量の記事を扱う場合、SOQL クエリのインデックスを意識し、選択的な WHERE 句を使用します。頻繁にアクセスされる記事は、プラットフォームキャッシュなどを利用してキャッシュし、API コールやクエリの回数を削減します。

これらの原理とベストプラクティスを理解し実践することで、Salesforce Knowledge を単なる情報リポジトリから、ビジネスプロセスに深く統合されたインテリジェントなナレッジプラットフォームへと昇華させることができるでしょう。

コメント