Salesforceサイトでアンケートを公開する実装
アンケートを登録するVisualforceページとコントローラを作り、Salesforceサイトへ割り当てます。ゲストユーザプロファイルの権限を最小限に絞って公開する手順を説明します。
Salesforceサイトでできること
Salesforceサイトは、ログインなしで組織内のデータを公開できる機能です。Visualforceページをそのまま公開でき、Lightning Platformのサーバー上で動くため、別途Webサーバーを用意する必要はありません。この記事では、一般ユーザがログインせずにアンケートへ回答し、その内容をSalesforceのカスタムオブジェクト「アンケート」のレコードとして登録する例を作ります。
カスタムオブジェクトと項目
まず、回答を受け取るカスタムオブジェクトを用意します。
| 項目 | 内容 |
|---|---|
| 表示ラベル | アンケート |
| オブジェクト名 | Questionnaire |
項目は次の3つを作成します。
| 表示ラベル | API参照名 | データ型 | 備考 |
|---|---|---|---|
| 姓 | LastName__c | テキスト(255文字) | |
| 名 | FirstName__c | テキスト(255文字) | |
| アンケート結果 | QuestionnaireResult__c | 選択リスト | 値は「高」「中」「低」 |
Apexコントローラの実装
入力・確認・完了の3画面を1つのコントローラで遷移させます。
public class QuestionnaireController { public Questionnaire__c questionnaire { get; set; } public QuestionnaireController() { this.questionnaire = new Questionnaire__c(); } public PageReference confirm() { PageReference pr = Page.QuestionnaireConfirm; pr.setRedirect(false); return pr; } public PageReference input() { PageReference pr = Page.QuestionnaireInput; pr.setRedirect(false); return pr; } public PageReference complete() { PageReference pr = Page.QuestionnaireComplete; pr.setRedirect(false); return pr; } public PageReference save() { Savepoint sp = Database.setSavepoint(); try { insert this.questionnaire; PageReference pr = Page.QuestionnaireComplete; pr.setRedirect(false); return pr; } catch (Exception e) { Database.rollback(sp); return null; } } }
入力画面から確認画面、完了画面への遷移と、アンケートの保存処理をまとめたコントローラです。
saveメソッドは、保存に失敗するとDatabase.rollbackしたうえでnullを返します。PageReferenceがnullの場合、Visualforceは同じページに留まります。エラーの内容は画面に表示されないため、実運用ではApexPages.addMessageでユーザに理由を伝える処理を加えてください。
Visualforceページの実装
登録・確認・完了の3ページに分けます。いずれもshowHeaderやsidebarをfalseにして、Salesforceの標準UIを出さない作りにしています。
QuestionnaireInput.page
<apex:page docType="html-5.0" applyHtmlTag="false" applyBodyTag="false" showHeader="false" sidebar="false" standardStylesheets="false" title="アンケート" controller="QuestionnaireController" cache="false"> <head> <title>アンケート</title> </head> <body> <apex:form> 姓:<apex:inputField value="{!questionnaire.LastName__c}"/> <p/> 名:<apex:inputField value="{!questionnaire.FirstName__c}"/> <p/> アンケート結果:<apex:inputField value="{!questionnaire.QuestionnaireResult__c}"/> <p/> <apex:commandButton value="確認" action="{!confirm}"/> </apex:form> </body> </apex:page>
一般ユーザが最初に開く入力画面です。姓・名・アンケート結果を入力し、確認画面へ進みます。
QuestionnaireConfirm.page
<apex:page docType="html-5.0" applyHtmlTag="false" applyBodyTag="false" showHeader="false" sidebar="false" standardStylesheets="false" title="アンケート" controller="QuestionnaireController" cache="false"> <head> <title>アンケート</title> </head> <body> <apex:form> 姓:<apex:outputField value="{!questionnaire.LastName__c}"/> <p/> 名:<apex:outputField value="{!questionnaire.FirstName__c}"/> <p/> アンケート結果:<apex:outputField value="{!questionnaire.QuestionnaireResult__c}"/> <p/> <apex:commandButton value="修正" action="{!input}"/> <apex:commandButton value="送信" action="{!save}"/> </apex:form> </body> </apex:page>
入力内容を確認する画面です。修正する場合は入力画面へ戻り、そのままでよければ送信して保存処理を呼び出します。
QuestionnaireComplete.page
<apex:page docType="html-5.0" applyHtmlTag="false" applyBodyTag="false" showHeader="false" sidebar="false" standardStylesheets="false" title="アンケート" controller="QuestionnaireController" cache="false"> <head> <title>アンケート</title> </head> <body> <apex:form> アンケートにご協力ありがとうございます。 </apex:form> </body> </apex:page>
送信が完了したことを伝えるだけの画面です。
サイトの作成
Visualforceページとコントローラができたら、サイトを作成して割り当てます。
Salesforceサイトを有効化する
「設定」のクイック検索から「サイト」を選びます。組織で初めて使う場合は、Salesforceサイトのドメインを登録して有効化します。ドメインは後から変更できません。
新規にサイトを作成する
サイトの表示ラベル、サイト名、サイトの管理者、デフォルトのレコード所有者、デフォルトWebアドレスを入力します。有効なサイトのホームページには「QuestionnaireInput」を選びます。
保存する
作成した直後のサイトは非公開の状態です。この後ゲストユーザプロファイルを設定してから、有効化します。
ゲストユーザプロファイルの設定
サイトを作成すると、そのサイト専用のゲストユーザプロファイルが自動で作られます。サイト詳細ページの「Public Access Settings」(公開アクセス設定)を開くと、このプロファイルの編集画面に入れます。このプロファイルは複製も削除もできません。
オブジェクト権限を設定する
アンケートカスタムオブジェクトに「参照」と「作成」を付与します。既定では何も付与されていないため、手動で設定しないとレコードを保存できません。
項目レベルセキュリティを設定する
姓・名・アンケート結果の3項目に「参照」と「編集」を付与します。
Visualforceページへのアクセスを有効にする
QuestionnaireInput・QuestionnaireConfirm・QuestionnaireCompleteの3ページを、ゲストユーザがアクセスできるページとして有効化します。
Apexクラスへのアクセスを有効にする
QuestionnaireControllerを、ゲストユーザが実行できるApexクラスとして有効化します。
すべて設定できたら、サイト詳細ページから「Activate」(有効化)を押して公開します。
セキュリティ上の注意点
ゲストユーザプロファイルは、インターネット上の誰でもその権限で動いていることになります。必要な権限だけを、最小限で付与します。
- 認証を伴うアクセスにはHTTPSが必須です。HTTPのURLでアクセスがあった場合も、SalesforceがHTTPSへ自動的にリダイレクトします
- アンケートカスタムオブジェクトの共有設定(組織全体のデフォルト)は、外部アクセスを「非公開」にしておくことを推奨します。ゲストに参照権限を与えたオブジェクトの既定の外部アクセスを非公開にしておくと、サイトに関係のないデータまで見えてしまう事態を防げます
- この記事の実装は、送信するだけで内容を修正する画面がありません。ゲストユーザプロファイルには「編集」や「削除」まで付与しないようにします。付与すると、URLを知っている誰でも他人の回答を書き換えられる状態になります
- ゲストユーザは、サイトで作成したレコードの所有者にはなりません。レコードの所有者は、サイト作成時に設定した「デフォルトのレコード所有者」になります
動作確認
サイトのURLを開く
有効化したサイトのURLへアクセスすると、ログイン画面を経由せずにQuestionnaireInputページが表示されます。
内容を入力する
姓に「山田」、名に「太郎」、アンケート結果に「高」を入力し、「確認」ボタンを押します。
内容を確認する
入力内容が表示されます。修正が必要なら「修正」ボタンで入力画面に戻れます。ここではアンケート結果を「中」に直してから、もう一度「確認」ボタンを押します。
送信する
内容に問題がなければ「送信」ボタンを押します。完了画面が表示されれば登録は成功です。
管理者側で確認する
Salesforce側でアンケートオブジェクトのレコード一覧を開き、登録された内容とレコードの所有者を確認します。所有者はサイト作成時に設定したデフォルトのレコード所有者になっています。
ここで間違えやすい
| 間違い | 何が起きるか |
|---|---|
| ゲストユーザプロファイルにオブジェクト権限を付与し忘れる | 保存時にアクセス権限エラーになり、レコードが作成できません |
| 項目レベルセキュリティを設定し忘れる | 入力画面や確認画面でその項目だけ表示されなかったり保存されなかったりします |
| ゲストユーザプロファイルに「編集」「削除」まで付与する | URLを知っていれば誰でも既存の回答を書き換えたり消したりできる状態になります |
| VisualforceページやApexクラスへのアクセスを有効にし忘れる | サイトを開いたときに権限エラーの画面が表示されます |
| 共有設定の外部アクセスを「公開」のままにする | ゲストユーザから見えなくてよいデータまで見える可能性があります |
確認した環境
- 2026年9月 / Salesforce Summer '26(APIバージョン67.0)時点の公式ドキュメントで、Salesforceサイトの作成手順、Public Access Settingsで設定できる範囲、HTTPS必須の挙動、共有設定の推奨事項を確認しています
まとめ
- Salesforceサイトを使うと、Visualforceページをログイン不要で公開できます
- サイトのゲストユーザプロファイルは、Public Access Settingsから個別に設定します
- オブジェクト権限・項目レベルセキュリティ・ページ/Apexクラスへのアクセスを、必要な分だけ有効にします
- ゲストユーザプロファイルには「参照」「作成」までにとどめ、「編集」「削除」は付与しないのが基本です
- 認証を伴うアクセスにはHTTPSが必須で、HTTPは自動的にHTTPSへリダイレクトされます
Salesforceの導入・運用についてご相談ください
導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。