Quip終了に伴うデータエクスポートでお困りの方へ

生成AIでSalesforceフローのXMLメタデータを生成・デプロイしてみた【検証と注意点】

目次

この記事のポイント

  • 概要: 生成AI(Gemini)を活用し、自然言語の要件からSalesforceフローのメタデータ(.flow-meta.xml)を直接生成・デプロイする検証を行いました。
  • 成果: 手動での要素配置をスキップし、Salesforce CLI(SFDX)を用いて即日動くプロトタイプを作成可能に。
  • 注意点: AIが出力する動的URLによる405エラーなど、プロンプト修正(バイブコーディング)によるトラブル解消の手順も解説します。

「Salesforceで業務を自動化したいけれど、フロー(Flow Builder)を作成・改修するのに時間がかかりすぎる」
「ちょっとした自動化の相談をしたはずなのに、提案やプロトタイプが出てくるまでに何日も待たされてしまう」

Salesforceの運用・開発において、管理者や開発者の皆様はこのようなお悩みを抱えていませんか?

フロー構築のネックとなる「画面上での手動設定工数」と「仕様認識のズレ」を解消するため、本記事では生成AIを活用して要件定義文から直接メタデータ(XML)を生成し、Salesforce(Sandbox)へ即座に反映させる最新の開発アプローチを検証しました。
具体的なプロンプトやデプロイ手順、発生したエラーの解消法まで詳しく解説します。

【関連記事】Salesforceフローの基本をおさらいしたい方はこちら

Salesforceのフロー(Flow Builder)構築における2つの課題

Salesforceの構築・運用現場において、フロー作成がネックとなるケースは少なくありません。そこには大きく2つの課題が存在しています。

画面上の手動設定(変数・分岐設計)にかかる構築工数

Flow Builderは非常に優れていますが、「どのタイミングで処理を起動するか」「条件分岐はどうするか」「割り当てる変数やレコードの取得はどう設計するか」など、画面上で手作業で設定する項目が多岐にわたります。複雑なロジックになればなるほど、構築と検証に膨大な時間がかかってしまいます。

仕様書だけでは完成イメージが掴みにくい認識ズレの問題

「どのような条件で、何が自動化されるか」をテキストの仕様書や口頭で説明されても、受け取り手である現場担当者様にとっては「実際に動かしてみるまでイメージが湧かない」ということがよく起こります。その結果、リリース後に「思っていた挙動と違う」という手戻りが発生し、余計な納期や費用がかかってしまう原因になります。

【検証】生成AIでフローのメタデータ(XML)を生成・Salesforceへデプロイ

「それなら、要件のテキストから直接フローの骨組みを生成してしまえばいいのでは?」という仮説のもと、よくある業務要件を使ってAI(Gemini)で検証を行いました。

前提条件(Salesforce CLI環境とSandbox)

※本検証は、あらかじめSalesforce CLI(SFDX)等の開発環境が整っており、メタデータによるデプロイ運用ができる体制を前提としています。

Salesforceのフローは、裏側では .flow-meta.xml というXML形式のメタデータで定義されています。AIにこのXML構造を出力させることで、手動での要素配置をスキップし、短時間で動く環境を用意できるか、以下の3つのステップに沿って検証を進めました。

  • ステップ1:生成AIへのプロンプト指示
  • ステップ2:Sandbox組織への反映
  • ステップ3:動作確認と発生したトラブルの解消

この章で登場する用語の補足

  • メタデータ: システム上に蓄積されるビジネスデータ(取引先や連絡先などのレコード)そのものではなく、Salesforce組織の構成(カスタムオブジェクト、項目、フローの処理ロジック、ページレイアウトなど)を定義するデータ。
  • Sandbox(サンドボックス): 本番組織のデータや設定を損なうことなく、開発、テスト、トレーニングを行うことができる本番組織のコピー環境。
  • デプロイ: メタデータを、Salesforce組織(Sandbox環境や本番環境)に移行して反映させる処理。

ステップ1:生成AI(Gemini)へのプロンプト指示とXML出力

まずは、実務でよく発生する通知処理の要件「優先度高のケースが起票されたら上司へメール送信」を下記のプロンプトに落とし込み、AIに指示を出しました。

【プロンプト内容】

ケースの優先度項目が「High」の場合、ケース作成ユーザーの上司ユーザーにメールを出すフローの .flow-meta.xml を生成してください。
・メール件名:「優先度高のケースが起票されました」
・メール本文:「以下のケースが優先度高で起票されました。」と記載し、改行してその下に対象ケースレコード詳細画面のURLを動的に記載する。

指示を入力すると、AIは即座にSalesforceの構文ルール(開始条件、メール送信アクション、メール本文用テンプレートなど)に沿ったXMLコードを出力しました。一見すると完璧に見えたコードですが、実はメール本文内の「動的URLの生成ロジック」に1つ課題が潜んでいました(詳細はステップ3で解説します)。


<?xml version="1.0" encoding="UTF-8"?>
<Flow xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>60.0</apiVersion>
    <actionCalls>
        <name>Send_Email_To_Manager</name>
        <label>上司へメール送信</label>
        <locationX>176</locationX>
        <locationY>323</locationY>
        <actionName>emailSimple</actionName>
        <actionType>emailSimple</actionType>
        <flowTransactionModel>CurrentTransaction</flowTransactionModel>
        <inputParameters>
            <name>emailAddresses</name>
            <value>
                <elementReference>$Record.CreatedBy.Manager.Email</elementReference>
            </value>
        </inputParameters>
        <inputParameters>
            <name>emailSubject</name>
            <value>
                <stringValue>優先度高のケースが起票されました</stringValue>
            </value>
        </inputParameters>
        <inputParameters>
            <name>emailBody</name>
            <value>
                <elementReference>ttEmailBody</elementReference>
            </value>
        </inputParameters>
        <nameSegment>emailSimple</nameSegment>
        <versionSegment>1</versionSegment>
    </actionCalls>
    <decisions>
        <name>Check_Manager_Exists</name>
        <label>上司およびメールアドレスの存在確認</label>
        <locationX>176</locationX>
        <locationY>215</locationY>
        <defaultConnectorLabel>上司またはメールなし</defaultConnectorLabel>
        <rules>
            <name>Has_Manager_Email</name>
            <conditionLogic>and</conditionLogic>
            <conditions>
                <leftValueReference>$Record.CreatedBy.ManagerId</leftValueReference>
                <operator>IsNull</operator>
                <rightValue>
                    <booleanValue>false</booleanValue>
                </rightValue>
            </conditions>
            <conditions>
                <leftValueReference>$Record.CreatedBy.Manager.Email</leftValueReference>
                <operator>IsNull</operator>
                <rightValue>
                    <booleanValue>false</booleanValue>
                </rightValue>
            </conditions>
            <connector>
                <targetReference>Send_Email_To_Manager</targetReference>
            </connector>
            <label>送信可能</label>
        </rules>
    </decisions>
    <environments>Default</environments>
    <interviewLabel>ケース高優先度メール通知フロー {!$Flow.CurrentDateTime}</interviewLabel>
    <label>ケース高優先度メール通知フロー</label>
    <processMetadataValues>
        <name>BuilderType</name>
        <value>
            <stringValue>LightningFlowBuilder</stringValue>
        </value>
    </processMetadataValues>
    <processMetadataValues>
        <name>CanvasMode</name>
        <value>
            <stringValue>AUTO_LAYOUT_CANVAS</stringValue>
        </value>
    </processMetadataValues>
    <processType>AutoLaunchedFlow</processType>
    <start>
        <locationX>50</locationX>
        <locationY>0</locationY>
        <connector>
            <targetReference>Check_Manager_Exists</targetReference>
        </connector>
        <filterLogic>and</filterLogic>
        <filters>
            <field>Priority</field>
            <operator>EqualTo</operator>
            <value>
                <stringValue>High</stringValue>
            </value>
        </filters>
        <object>Case</object>
        <recordTriggerType>Create</recordTriggerType>
        <triggerType>RecordAfterSave</triggerType>
    </start>
    <status>Active</status>
    <textTemplates>
        <name>ttEmailBody</name>
        <isViewedAsPlainText>true</isViewedAsPlainText>
        <text>以下のケースが優先度高で起票されました。
{!$Api.Partner_Server_URL_600}/{!$Record.Id}</text>
    </textTemplates>
</Flow>

ステップ2:Salesforce CLIを用いたSandbox組織へのデプロイ

続いて、生成されたXMLコードをローカルファイルとして保存し、開発環境(Sandbox)へ反映します。構文エラーなくデプロイが完了し、Salesforce画面上にフローが自動生成されることがここでのゴールです。

  1. 生成されたコードを force-app/main/default/flows/Case_High_Priority_Email_Notification.flow-meta.xml として保存
  2. Salesforce CLIのデプロイコマンドを実行してSandbox環境へ送信

結果は、エラーが出ることもなく一発でデプロイが完了しました。Flow Builderを開くと、手動で組むと30分ほどかかるトリガー条件・分岐・メール送信アクションの配置が、わずか十数秒で画面上に組み上がった状態で復元されました。

Flow Builderを開くと、手動で組むと30分ほどかかるトリガー条件・分岐・メール送信アクションの配置が、わずか十数秒で画面上に組み上がった状態で復元されました。

ステップ3:動作確認と「HTTP 405エラー」のトラブル解消(プロンプト修正)

最後に、実際にテスト用のケースレコードを作成し、上司宛にメールが届いてリンクから該当ケースへアクセスできるか動作確認を行いました。ここで予想外のトラブルが発生します。

メール自体は即座に届いたものの、本文に記載されたURLをクリックすると 「HTTP ERROR 405 (Only POST allowed)」 というエラー画面が表示され、ケース画面に移動できませんでした。

HTTP ERROR 405 (Only POST allowed)」 のエラー画面

原因を調査したところ、AIがURL生成用に作成した数式($Api.Partner_Server_URL_600)が、Web画面用ではなく「SOAP API用のデータ通信エンドポイント」を出力していたため、ブラウザからのアクセスが拒否されてしまったことが判明しました。

そこで、AIに対して「生成されたURLだと405エラーになるため、環境ドメインを動的取得する数式に変更して」と追加のフィードバックを実施。最終的に以下のXMLコードを出力し、Salesforceメタデータを更新することで、無事にメール内のURLから一発で対象ケース画面へ遷移させることができました。

<?xml version="1.0" encoding="UTF-8"?>
<Flow xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>60.0</apiVersion>
    <actionCalls>
        <name>Send_Email_To_Manager</name>
        <label>上司へメール送信</label>
        <locationX>176</locationX>
        <locationY>323</locationY>
        <actionName>emailSimple</actionName>
        <actionType>emailSimple</actionType>
        <flowTransactionModel>CurrentTransaction</flowTransactionModel>
        <inputParameters>
            <name>emailAddresses</name>
            <value>
                <elementReference>$Record.CreatedBy.Manager.Email</elementReference>
            </value>
        </inputParameters>
        <inputParameters>
            <name>emailSubject</name>
            <value>
                <stringValue>優先度高のケースが起票されました</stringValue>
            </value>
        </inputParameters>
        <inputParameters>
            <name>emailBody</name>
            <value>
                <elementReference>ttEmailBody</elementReference>
            </value>
        </inputParameters>
        <nameSegment>emailSimple</nameSegment>
        <versionSegment>1</versionSegment>
    </actionCalls>
    <decisions>
        <name>Check_Manager_Exists</name>
        <label>上司およびメールアドレスの存在確認</label>
        <locationX>176</locationX>
        <locationY>215</locationY>
        <defaultConnectorLabel>上司またはメールなし</defaultConnectorLabel>
        <rules>
            <name>Has_Manager_Email</name>
            <conditionLogic>and</conditionLogic>
            <conditions>
                <leftValueReference>$Record.CreatedBy.ManagerId</leftValueReference>
                <operator>IsNull</operator>
                <rightValue>
                    <booleanValue>false</booleanValue>
                </rightValue>
            </conditions>
            <conditions>
                <leftValueReference>$Record.CreatedBy.Manager.Email</leftValueReference>
                <operator>IsNull</operator>
                <rightValue>
                    <booleanValue>false</booleanValue>
                </rightValue>
            </conditions>
            <connector>
                <targetReference>Send_Email_To_Manager</targetReference>
            </connector>
            <label>送信可能</label>
        </rules>
    </decisions>
    <environments>Default</environments>

    <!-- 動的にレコードURLを生成する数式リソース -->
    <formulas>
        <name>fxRecordUrl</name>
        <dataType>String</dataType>
        <expression>LEFT({!$Api.Partner_Server_URL_600}, FIND('/services/', {!$Api.Partner_Server_URL_600})) &amp; "lightning/r/Case/" &amp; {!$Record.Id} &amp; "/view"</expression>
    </formulas>

    <interviewLabel>ケース高優先度メール通知フロー {!$Flow.CurrentDateTime}</interviewLabel>
    <label>ケース高優先度メール通知フロー</label>
    <processMetadataValues>
        <name>BuilderType</name>
        <value>
            <stringValue>LightningFlowBuilder</stringValue>
        </value>
    </processMetadataValues>
    <processMetadataValues>
        <name>CanvasMode</name>
        <value>
            <stringValue>AUTO_LAYOUT_CANVAS</stringValue>
        </value>
    </processMetadataValues>
    <processType>AutoLaunchedFlow</processType>
    <start>
        <locationX>50</locationX>
        <locationY>0</locationY>
        <connector>
            <targetReference>Check_Manager_Exists</targetReference>
        </connector>
        <filterLogic>and</filterLogic>
        <filters>
            <field>Priority</field>
            <operator>EqualTo</operator>
            <value>
                <stringValue>High</stringValue>
            </value>
        </filters>
        <object>Case</object>
        <recordTriggerType>Create</recordTriggerType>
        <triggerType>RecordAfterSave</triggerType>
    </start>
    <status>Active</status>
    <textTemplates>
        <name>ttEmailBody</name>
        <isViewedAsPlainText>true</isViewedAsPlainText>
        <text>以下のケースが優先度高で起票されました。
{!fxRecordUrl}</text>
    </textTemplates>
</Flow>

【検証での所感:バイブコーディングの重要性】

バイブコーディング(Vibe Coding)とは、AIと対話しながらインタラクティブにコードを修正・完成させていく現代的な開発アプローチです。
AIが作ったコードは一見完璧に見えましたが、そのままでは動かない細かな調整が必要でした。エラーが出ても焦らず、AIと対話しながら修正指示を出してロジックを整えていくノウハウが、迅速かつ正確なシステムをお届けするために重要であることを実感しました!

AI×メタデータ生成アプローチがもたらす3つのメリット

1. 要件定義「当日」に動くプロトタイプをご提示可能

従来であれば、要件を伝えてから「設計書作成→構築→確認画面の提示」まで数日〜数週間かかっていたものが、要件をヒアリングした当日中(または翌日)には、実際に動くプロトタイプ環境をご提示可能になります。早期に完成イメージを確認できるため、プロジェクト全体のスピードが格段に上がります。

2. 構築工数の自動化による開発・改修コストの削減

手作業による要素配置や変数の手動定義にかかる工数を大幅に削減できます。無駄な作業工数が削られることで、全体の開発・改修コストの抑制にダイレクトに貢献します。

3. 実物確認による要件の認識ズレ・手戻り防止

口頭や仕様書だけでの確認とは異なり、開発の初期段階で実際の画面・挙動を確認しながら要件を詰めることができます。後工程になってからの「思っていた挙動と違う」といった大きな手戻りを未然に防ぎ、高品質な構築を実現します。

なぜAI活用でもSalesforce認定パートナーの知見が必要なのか

AIのハルシネーション(構文ミス・API選択ミス)のリスク

サンブリッジでは、生成AIをはじめとする最新テクノロジーを常にキャッチアップ・検証し、開発プロセスやサービス品質のアップデートを継続的に行っています。
ただし、AIが出力するメタデータには、今回の検証でも発生したようなAPIエンドポイントの取り違いや、構文エラーといったハルシネーション(誤情報)のリスクが常に伴います。

サンブリッジが提供するガバナンスと専門エンジニアのチェック体制

だからこそサンブリッジでは、最新技術を積極的に活用しながらも、Salesforce認定パートナーとしての確かな構築ノウハウとガバナンス設計を徹底しています。

  • エンジニアによる構文・セキュリティチェック: AIが生成したロジックをプロの目で見極め、Salesforceのベストプラクティスに沿った修正を実施。
  • Sandbox(検証環境)での徹底テスト: 本番環境に影響を与えない分離された検証環境でデプロイとテストを行い、安全性を確保。
  • 業務プロセス全体の最適化提案: 単に「指示通りのフローを作る」だけでなく、貴社のビジネス全体にとって拡張性・保守性の高い設計をご提案。

まとめ

要件(言葉)からメタデータを生成してフローを立ち上げる手法は、Salesforce開発のスピードを飛躍的に高める可能性を秘めています。

今回ご紹介したノウハウを貴社でも実践しお役立てください。

自社ではできないフロー構築・開発はサンブリッジが代行します

「Salesforceの改修スピードを上げたい」
「現場の要望をすばやく形にして定着化を進めたい」

とお悩みの企業に向けて、サンブリッジではサポートをご提供しています。最新のテクノロジーと豊富な知見を組み合わせ、貴社のビジネスを最速で前進させるSalesforce運用・開発をご支援いたします。

まずは「こんなことは実現できるか?」「業務プロセスの見直しから始めたいが対応可能か」といったご相談も承っております。

目次