Apex

Salesforceサイトでアンケートを公開する実装

アンケートを登録するVisualforceページとコントローラを作り、Salesforceサイトへ割り当てます。ゲストユーザプロファイルの権限を最小限に絞って公開する手順を説明します。

2021.02.01

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ページとコントローラができたら、サイトを作成して割り当てます。

  1. Salesforceサイトを有効化する

    「設定」のクイック検索から「サイト」を選びます。組織で初めて使う場合は、Salesforceサイトのドメインを登録して有効化します。ドメインは後から変更できません。

  2. 新規にサイトを作成する

    サイトの表示ラベル、サイト名、サイトの管理者、デフォルトのレコード所有者、デフォルトWebアドレスを入力します。有効なサイトのホームページには「QuestionnaireInput」を選びます。

  3. 保存する

    作成した直後のサイトは非公開の状態です。この後ゲストユーザプロファイルを設定してから、有効化します。

ゲストユーザプロファイルの設定

サイトを作成すると、そのサイト専用のゲストユーザプロファイルが自動で作られます。サイト詳細ページの「Public Access Settings」(公開アクセス設定)を開くと、このプロファイルの編集画面に入れます。このプロファイルは複製も削除もできません。

  1. オブジェクト権限を設定する

    アンケートカスタムオブジェクトに「参照」と「作成」を付与します。既定では何も付与されていないため、手動で設定しないとレコードを保存できません。

  2. 項目レベルセキュリティを設定する

    姓・名・アンケート結果の3項目に「参照」と「編集」を付与します。

  3. Visualforceページへのアクセスを有効にする

    QuestionnaireInput・QuestionnaireConfirm・QuestionnaireCompleteの3ページを、ゲストユーザがアクセスできるページとして有効化します。

  4. Apexクラスへのアクセスを有効にする

    QuestionnaireControllerを、ゲストユーザが実行できるApexクラスとして有効化します。

すべて設定できたら、サイト詳細ページから「Activate」(有効化)を押して公開します。

セキュリティ上の注意点

ゲストユーザプロファイルは、インターネット上の誰でもその権限で動いていることになります。必要な権限だけを、最小限で付与します。

  • 認証を伴うアクセスにはHTTPSが必須です。HTTPのURLでアクセスがあった場合も、SalesforceがHTTPSへ自動的にリダイレクトします
  • アンケートカスタムオブジェクトの共有設定(組織全体のデフォルト)は、外部アクセスを「非公開」にしておくことを推奨します。ゲストに参照権限を与えたオブジェクトの既定の外部アクセスを非公開にしておくと、サイトに関係のないデータまで見えてしまう事態を防げます
  • この記事の実装は、送信するだけで内容を修正する画面がありません。ゲストユーザプロファイルには「編集」や「削除」まで付与しないようにします。付与すると、URLを知っている誰でも他人の回答を書き換えられる状態になります
  • ゲストユーザは、サイトで作成したレコードの所有者にはなりません。レコードの所有者は、サイト作成時に設定した「デフォルトのレコード所有者」になります
Public Access Settingsで変更できるのは、そのサイト専用のゲストユーザプロファイルだけです。組織の他のプロファイルや、ログインする通常ユーザには影響しません。逆に言うと、サイトを複数作ると、サイトの数だけゲストユーザプロファイルの権限を個別に見直す必要があります。

動作確認

公開されたアンケート入力画面。姓・名・アンケート結果がすべて空欄
サイトのURLを開いた直後の画面です。ログイン画面を経由せず入力欄が出ることを確認してください。
  1. サイトのURLを開く

    有効化したサイトのURLへアクセスすると、ログイン画面を経由せずにQuestionnaireInputページが表示されます。

  2. 内容を入力する

    姓に「山田」、名に「太郎」、アンケート結果に「高」を入力し、「確認」ボタンを押します。

  3. 内容を確認する

    入力内容が表示されます。修正が必要なら「修正」ボタンで入力画面に戻れます。ここではアンケート結果を「中」に直してから、もう一度「確認」ボタンを押します。

  4. 送信する

    内容に問題がなければ「送信」ボタンを押します。完了画面が表示されれば登録は成功です。

  5. 管理者側で確認する

    Salesforce側でアンケートオブジェクトのレコード一覧を開き、登録された内容とレコードの所有者を確認します。所有者はサイト作成時に設定したデフォルトのレコード所有者になっています。

姓に山田、名に太郎、アンケート結果に高を入力したアンケート画面
3項目を入力した状態です。ここで「確認」ボタンを押します。
確認画面。姓・名・アンケート結果が入力欄ではなく文字で表示されている
確認画面です。値が文字だけで表示され、修正と送信のボタンが並ぶ点を見てください。
「修正」で戻った入力画面。アンケート結果は高のまま残っている
「修正」を押して入力画面に戻った状態です。入力済みの値が保持されていることを確認してください。
アンケート結果を中に変更した入力画面
アンケート結果を「中」に直したところです。この状態でもう一度「確認」を押します。
確認画面。アンケート結果が中に変わって表示されている
修正後の確認画面です。変更した「中」が反映されている点を見てください。
「アンケートにご協力ありがとうございます。」とだけ表示される完了画面
送信後の完了画面です。この画面が出れば登録は成功しています。
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との連携まで承ります。状況を伺ったうえで、進め方をご提案します。