2025年9月からコパードというところでDevOpsプラットフォームを売っている大川です。
この記事は Salesforce Advent Calendar 2025 の24日目の記事です。メリークリスマス!
Salesforceに長くいたのでSalesforceのことは詳しいつもりでいるんですが、コパードに来てそうでもなかったかもとSalesforceの奥深さを痛感する日々。いや、Salesforceってほんとよく作られているよね。
さて本題。みなさんSalesforceの中の人や界隈の人からメタデータって言葉はよく聞きますよね。私たちは毎日話してます。
よくあるオブジェクトとかは見たことある方も多い(多くないか)と思うので、少し変わったものを眺めてみるというのがこの投稿です。
その前に、メタデータって今どのくらいあるのかも見ておきましょう。SalesforceのDeveloper向けサイトには Metadata Coverage というページがありまして、本記事作成時点では 859 Total Types と書かれてます。思ったよりたくさんあるって思いませんでした?
最近流行りのAgentforce関連もGenAiXxxxみたいな名前でそろってますし、Data 360(Data Cloud)関連ではDataSourceとかDataStreamとか見慣れた言葉もあります。Industriesの各製品ようのものもたくさんあります。くらくらしますね。
さて、今回のお題ExperienceBundleに戻りましょう。まずは事前設定。なにはともあれExperienceBundle Metadata APIを有効にします。

こうするとExperienceBundleというメタデータが見えるようになります。これは見ていただいた通り組織の設定なので、本番環境で設定していて、その後にSandboxを作ったり更新したりしていたら有効になっています。
そのうえで、VSCodeで組織のメタデータを見に行きますと Experience Bundle というのが見つかります。展開するとサイトごとにファイルがありますね。名称はいまいちよくわかりませんが、作ったときに勝手につけられています。

これ以上はVSCodeでは展開できないのでダウンロードしてみますと、とてもたくさんのjsonが出来上がります。
ざっと見るだけでなんとなく存在がわかるものもあれば、何やらわからないものもあると思いますが、このメタデータ(の中身)はJSONであるというのが大きな特徴です。メタデータはXMLだけじゃないのです。
JSONなのでいろんなテキスト処理ツールたちとはとても相性がよく、人の目にも優しくなっています。
長いので端折りますが、代表的なところを少し眺めてみましょう。
{
"definitionName" : "prm:branding-prm-merged",
"id" : "d5dc0344-586e-4c1b-9c95-db25da06200f",
"label" : "Partner Central",
"type" : "brandingSet",
"values" : {
"ActionColor" : "#0E63AC",
"BorderColor" : "#D4D4D4",
"CardBackgroundColor" : "rgba(255, 255, 255, 0)",
"CompanyLogo" : "",
"DetailTextColor" : "#5A5A5A",
"ErrorFontColor" : "#ff9e9e",
"HeaderBackgroundColor" : "#FFFFFF",
"HeaderFonts" : "Open Sans",
...
"_TextColor1" : "rgb(14, 14, 14)",
"_TextColor2" : "rgb(0, 0, 0)",
"_TextColor3" : "rgb(0, 0, 0)"
}
}
{
"forgotPasswordRouteId" : "dd54ff14-f3b5-4925-a343-7ade8ed50eea",
"isAvailableToGuests" : false,
"isFilteredComponentsView" : false,
"isProgressiveRenderingEnabled" : false,
"loginAppPageId" : "83fe2e3b-31ca-41f9-8e46-ec202cd73df1",
"mainAppPageId" : "9491227a-fe7e-4096-ad60-c7ffaa94d94c",
"preferredDomain" : "none",
"selfRegistrationRouteId" : "f4d2c2f1-1f1b-4c4b-9282-7098939c6840",
"type" : "site"
}
{
"appPageId" : "9491227a-fe7e-4096-ad60-c7ffaa94d94c",
"componentName" : "siteforce:dynamicLayout",
"dataProviders" : [ ],
"id" : "7b11b867-2cb2-4df1-9086-7f5ac79a2153",
"label" : "ホーム",
"regions" : [ {
"components" : [ {
"componentAttributes" : {
"background" : "background: rgba(0,0,0,0)",
"backgroundOverlay" : "rgba(0,0,0,0.5)",
"contentAreaWidth" : 100,
"sectionConfig" : {
"UUID" : "11fa9970-fdcd-492b-bc10-93c27302c7e5",
"columns" : [ {
"UUID" : "e89f2d42-aaff-408b-9d28-71e6970d95b3",
"columnKey" : "1",
"columnName" : "Column 1",
"columnWidth" : "7",
"seedComponents" : [ ]
}, {
"UUID" : "483083fa-c4b5-446e-99b7-120082af6e2d",
"columnKey" : "0fd8d",
"columnName" : "Column 2",
"columnWidth" : "5",
"seedComponents" : [ ]
} ]
},
"sectionHeight" : 300
},
...
"components" : [ {
"componentAttributes" : {
"customHeadTags" : "",
"description" : "",
"title" : "Home"
},
"componentName" : "forceCommunity:seoAssistant",
"id" : "07bc10c4-3b6f-4d67-ae71-4946b9a0b5a1",
"renditionMap" : { },
"type" : "component"
} ],
"id" : "cfba00b2-6ffb-4086-a10f-4ab456f38d5c",
"regionName" : "sfdcHiddenRegion",
"type" : "region"
} ],
"themeLayoutType" : "Home",
"type" : "view",
"viewType" : "home"
}
なんとなくどこかで設定したなぁという内容が網羅されていませんか?
このように実はExperience Cloudサイトの設定は、実際のHTMLベースのコンポーネントではなく、JSONでレイアウトや設定を持っているものをサイトのエンジンが読み込んで表示するという構造になっていたのですね。
このあたりは実際には解析する必要もあまりなく、ちゃんと ExperienceBundle というページで詳細に書かれています。
興味がある人は是非見てみてください。現改比較しなきゃいけないという場合には、バージョン管理の仕組みも入れておき、変更後に前のバージョンとちゃんと比較してみましょう。
せっかくなので メタデータ API を使用した Experience Cloud サイトのリリース なんてページも紹介しておきます。
Experience Cloudも歴史が長いので様々なテクノロジーが混在していますが、AuraやLWRだったら今回書いたExperienceBundleを使い、拡張LWRだったらDigitalExperienceBundleを使うのが良いでしょう。
そしてこのページの考慮事項はややこしいけど読むのが大切。とにかくまずはサイトを作るところはメタデータでは無理なので、各組織で名前を揃えてサイトを作るか、問題がなければSandboxをリフレッシュしてサイトの設定を揃える必要があること。こういう考慮点は見落としがちですが、ちゃんとガイドに書いてくれるようになっているので、必要な際には見ると良いですね。