Salesforce オブジェクトの詳細を取得するツールを作りたい (2)

# はじめに
前回の続きです。

https://qiita.com/xx_mana/items/a725dbd74ec2475f6ef2


# 作ったもの

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/d1ada656-1925-e9ef-75f6-4da3c213c495.png)

| 項目 | 内容 |
|---|---|
| Queryable Only | 「Queryable」 のオブジェクトで絞る |
| CustomObject Only | カスタムオブジェクトで絞る |
| Object Name | オブジェクトの名前 or ラベル名 で絞る |
| Prefix | オブジェクトのPrefix で絞る |
| Reload ボタン | 条件で絞り、その結果をプルダウンに表示 |
| オブジェクト一覧 | 条件で絞った結果のオブジェクトの一覧。名前、ラベル名、Prefixが表示されます |
| 決定 | オブジェクト一覧で指定したオブジェクトで内容を表示します |
| 件数 | 条件で絞った件数 |


▼ 「Object Name」を「Account」で絞る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/d9eb71be-35db-b877-cd69-1856f2cef2ef.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/46188d65-314f-31d5-f6a7-a0454c043814.png)

▼ 「Account」を表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/1b30de87-8163-c7b4-9769-91440eb0bdf9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/e94632c2-68cb-c868-ad51-6026ea954ecf.png)

# ソースコード
- ソースコードを公開しますが、ご自身の判断・責任でご利用ください。
- クラス名などは、適宜変更してください。

```java:YGG_ObjectItemViewer.cls (Apexクラス)
public with sharing class YGG_ObjectItemViewer {
    
    public String  ValuePicked     {get; set;} 
    public String  Prefix          {get; set;}
    public String  Label           {get; set;}
    public String  Name            {get; set;}
    public Boolean IsAccessible    {get; set;}
    public Boolean IsCreateable    {get; set;}
    public Boolean IsCustom        {get; set;}
    public Boolean IsCustomSetting {get; set;}
    public Boolean IsDeletable     {get; set;}
    public Boolean IsQueryable     {get; set;}
    public Boolean IsSearchable    {get; set;}
    public Boolean IsUndeletable   {get; set;}
    public Boolean IsUpdateable    {get; set;}
    
    public List<YGG_ObjectItem> ObjectItemList {get; set;}

    public Boolean IsQueryableOnly    {get; set;}
    public Boolean IsCustomObjectOnly {get; set;}
    public String  ObjectName         {get; set;}
    public String  PrefixString       {get; set;}
    
    
    public String  DebugMessage       {get; set;}
    
    private List<SelectOption> listOptions;
    

    public YGG_ObjectItemViewer() {
        this.ValuePicked        = '';
        this.ObjectName         = '';
        this.PrefixString       = '';
        this.IsQueryableOnly    = false;
        this.IsCustomObjectOnly = false;
        this.objectItemList     = new List<YGG_ObjectItem>();
        initializeCustomPickList();

        this.DebugMessage       = '';
    }

    public void execute() {
        try {
            if (this.ValuePicked != null && this.ValuePicked.length() != 0) {

                this.ObjectItemList = new List<YGG_ObjectItem>();

                Map<String, sObjectType> sObjectTypeMap = Schema.getGlobalDescribe();
                sObjectType sObjectType = sObjectTypeMap.get(this.ValuePicked);

                DescribeSObjectResult sObjectDescribe = sObjectType.getDescribe();

                this.Prefix          = sObjectDescribe.getKeyPrefix();
                this.Label           = sObjectDescribe.getLabel();
                this.Name            = sObjectDescribe.getName();
                this.IsAccessible    = sObjectDescribe.isAccessible();
                this.IsCreateable    = sObjectDescribe.isCreateable();
                this.IsCustom        = sObjectDescribe.isCustom();
                this.IsCustomSetting = sObjectDescribe.isCustomSetting();
                this.IsDeletable     = sObjectDescribe.isDeletable();
                this.IsQueryable     = sObjectDescribe.isQueryable();
                this.IsSearchable    = sObjectDescribe.isSearchable();
                this.IsUndeletable   = sObjectDescribe.isUndeletable();
                this.IsUpdateable    = sObjectDescribe.isUpdateable();

                Map<String, SObjectField> fields = sObjectDescribe.fields.getMap();

                for (String key : fields.keySet()) {
                    DescribeFieldResult field = fields.get(key).getDescribe();

                    YGG_ObjectItem item = new YGG_ObjectItem();
                    item.ByteLength = field.getByteLength();
                    item.CalculatedFormula = field.getCalculatedFormula();
                    item.DefaultValue = field.getDefaultValue();
                    item.DefaultValueFormula = field.getDefaultValueFormula();
                    item.Digits = field.getDigits();
                    item.InlineHelpText = field.getInlineHelpText();
                    item.Label = field.getLabel();
                    item.Length = field.getLength();
                    item.LocalName = field.getLocalName();
                    item.Name = field.getName();
                    item.Precion = field.getPrecision();
                    item.ReferenceTarField = field.getReferenceTargetField();
                    item.RelationshipName = field.getRelationshipName();
                    item.RelationshipOrder = field.getRelationshipOrder();
                    item.Scale = field.getScale();
                    item.Type = '' + field.getType();
                    item.Accessible = field.isAccessible();
                    item.AiPredictionField = field.isAiPredictionField();
                    item.AutoNumber = field.isAutoNumber();
                    item.Calculated = field.isCalculated();
                    item.CascadeDelete = field.isCascadeDelete();
                    item.CaseSensitive = field.isCaseSensitive();
                    item.Createable = field.isCreateable();
                    item.Custom = field.isCustom();
                    item.DefaultedOnCreate = field.isDefaultedOnCreate();
                    item.DependentPicklt = field.isDependentPicklist();
                    item.DeprecatedAndHidden = field.isDeprecatedAndHidden();
                    item.ExternalID = field.isExternalID();
                    item.Filterable = field.isFilterable();
                    item.FormulaTreatNullNumberAsZero = field.isFormulaTreatNullNumberAsZero();
                    item.Groupable = field.isGroupable();
                    item.HtmlFormatted = field.isHtmlFormatted();
                    item.IdLookup = field.isIdLookup();
                    item.NameField = field.isNameField();
                    item.NamePointing = field.isNamePointing();
                    item.Nillable = field.isNillable();
                    item.Permsionable = field.isPermissionable();
                    item.RestrictedDelete = field.isRestrictedDelete();
                    item.RestrictedPicklt = field.isRestrictedPicklist();
                    item.SearchPrefilterable = field.isSearchPrefilterable();
                    item.Sortable = field.isSortable();
                    item.Unique = field.isUnique();
                    item.Updateable = field.isUpdateable();
                    item.WriteRequiresMasterRead = field.isWriteRequiresMasterRead();                

                    List <sObjectType> parentObjectList = field.getReferenceTo();
                    item.ParentObjectName = '';
                    if (parentObjectList != null) {
                        for (sObjectType parentObject : parentObjectList) {
                            item.ParentObjectName += parentObject.getDescribe().getName() + ' (' + parentObject.getDescribe().getLabel() + '), ';
                        }
                    }

                    this.ObjectItemList.add(item);
                }

            }
        } catch (Exception e) {
            this.DebugMessage = e + '';
        }
    }
    
    public void reloadPickList() {
        initializeCustomPickList();
        this.ObjectItemList = new List<YGG_ObjectItem>();
    }
    
    public Integer customPickListSize {
        get {
            return this.listOptions.size();
        }
    }

    public List<SelectOption> customPickList {
        get {
            return this.listOptions;
        }
    }
    
    private void initializeCustomPickList() {
        try {
            this.listOptions = new List<SelectOption>();

            Map<String, sObjectType> sObjectTypeMap = Schema.getGlobalDescribe();
            for (String key : sObjectTypeMap.keySet()) {
                sObjectType sObjectType = sObjectTypeMap.get(key);
                DescribeSObjectResult sObjectDescribe = sObjectType.getDescribe();

                List<YGG_ConditionData> conditionDataList = new List<YGG_ConditionData>();
                conditionDataList.add(new YGG_ConditionData4BooleanImpl(this.IsQueryableOnly, sObjectDescribe.isQueryable()));
                conditionDataList.add(new YGG_ConditionData4BooleanImpl(this.IsCustomObjectOnly, sObjectDescribe.isCustom()));
                conditionDataList.add(new YGG_ConditionData4StringStartsWithImpl(this.PrefixString, sObjectDescribe.getKeyPrefix()));
                
                List<String> dataList = new List<String>();
                dataList.add(sObjectDescribe.getName());
                dataList.add(sObjectDescribe.getLabel());
                
                conditionDataList.add(new YGG_ConditionData4StringIncludingORImpl(this.ObjectName, dataList));
                
                Boolean addFlag = conditionCheck(conditionDataList);

                if (addFlag == true) {
                    String prefix = sObjectDescribe.getKeyPrefix();
                    String label = sObjectDescribe.getName() + ' (' + sObjectDescribe.getLabel();
                    if (prefix != null) {
                        label += ' [' + prefix + ']';
                    }
                    label += ')';
                    this.listOptions.add(new SelectOption(key, label));
                }

                // 追加した結果、Listに入れることのできる最大になったら、breakする。
                if (this.listOptions.size() >= 1000) {
                    break;
                }

            }
            this.listOptions.sort();

        } catch (Exception e) {
            this.DebugMessage = e + '';
        }
    }


    private Boolean conditionCheck(List<YGG_ConditionData> conditionDataList) {
        Boolean result = true;
        
        for (YGG_ConditionData data : conditionDataList) {
            Boolean target = data.isTarget();
            if (target != null && target == false) {
                result = false;
            }
        }
        
        return result;
    }
    
    interface YGG_ConditionData {
        Boolean isTarget();
    }
    
    class YGG_ConditionData4BooleanImpl implements YGG_ConditionData {
        private Boolean Condition;
        private Boolean Data;

        public YGG_ConditionData4BooleanImpl(Boolean condition, Boolean data) {
            this.Condition = condition;
            this.Data = data;
        }
        
        public Boolean isTarget() {
            if (this.Condition == null || this.Condition == false) {
                return null;
            }
            if (this.Data == null) {
                return false;
            }
            return (this.Condition == true && this.Data == true);
        }
    }
    
    class YGG_ConditionData4StringEqualsImpl implements YGG_ConditionData {
        private String Condition;
        private String Data;

        public YGG_ConditionData4StringEqualsImpl(String condition, String data) {
            this.Condition = condition;
            this.Data = data;
        }
        
        public Boolean isTarget() {
            if (this.Condition == null || this.Condition.length() == 0) {
                return null;
            }
            if (this.Data == null) {
                return false;
            }
            return this.Condition.equals(this.data);
        }
    }
    
    class YGG_ConditionData4StringStartsWithImpl implements YGG_ConditionData {
        private String Condition;
        private String Data;

        public YGG_ConditionData4StringStartsWithImpl(String condition, String data) {
            this.Condition = condition;
            this.Data = data;
        }
        
        public Boolean isTarget() {
            if (this.condition == null || this.Condition.length() == 0) {
                return null;
            }
            if (this.Data == null) {
                return false;
            }
            return this.Data.startsWith(this.Condition);
        }
    }
    
    class YGG_ConditionData4StringIncludingImpl implements YGG_ConditionData {
        private String Condition;
        private String Data;

        public YGG_ConditionData4StringIncludingImpl(String condition, String data) {
            this.Condition = condition;
            this.Data = data;
        }
        
        public Boolean isTarget() {
            if (this.Condition == null || this.Condition.length() == 0) {
                return null;
            }
            if (this.Data == null) {
                return false;
            }
            return this.Data.indexOf(this.Condition) >= 0;
        }
    }
    
    class YGG_ConditionData4StringIncludingORImpl implements YGG_ConditionData {
        private String Condition;
        private List<String> Datas;

        public YGG_ConditionData4StringIncludingORImpl(String condition, List<String> datas) {
            this.condition = condition;
            this.Datas = datas;
        }
        
        public Boolean isTarget() {
            if (this.Condition == null || this.Condition.length() == 0) {
                return null;
            }
            if (this.Datas == null) {
                return false;
            }
            
            for (String data : this.Datas) {
                if (data.indexOf(this.condition) >= 0) {
                    return true;
                }
            }
            
            return false;
        }
    }
    
    class YGG_ObjectItem {
        public Integer ByteLength                    {get; set;}
        public String CalculatedFormula              {get; set;}
        public Object DefaultValue                   {get; set;}
        public String DefaultValueFormula            {get; set;}
        public Integer Digits                        {get; set;}
        public String InlineHelpText                 {get; set;}
        public String Label                          {get; set;}
        public Integer Length                        {get; set;}
        public String LocalName                      {get; set;}
        public String Name                           {get; set;}
        public Integer Precion                       {get; set;}
        public String ReferenceTarField              {get; set;}
        public String RelationshipName               {get; set;}
        public Integer RelationshipOrder             {get; set;}
        public Integer Scale                         {get; set;}
        public String Type                           {get; set;}
        public Boolean Accessible                    {get; set;}
        public Boolean AiPredictionField             {get; set;}
        public Boolean AutoNumber                    {get; set;}
        public Boolean Calculated                    {get; set;}
        public Boolean CascadeDelete                 {get; set;}
        public Boolean CaseSensitive                 {get; set;}
        public Boolean Createable                    {get; set;}
        public Boolean Custom                        {get; set;}
        public Boolean DefaultedOnCreate             {get; set;}
        public Boolean DependentPicklt               {get; set;}
        public Boolean DeprecatedAndHidden           {get; set;}
        public Boolean ExternalID                    {get; set;}
        public Boolean Filterable                    {get; set;}
        public Boolean FormulaTreatNullNumberAsZero  {get; set;}
        public Boolean Groupable                     {get; set;}
        public Boolean HtmlFormatted                 {get; set;}
        public Boolean IdLookup                      {get; set;}
        public Boolean NameField                     {get; set;}
        public Boolean NamePointing                  {get; set;}
        public Boolean Nillable                      {get; set;}
        public Boolean Permsionable                  {get; set;}
        public Boolean RestrictedDelete              {get; set;}
        public Boolean RestrictedPicklt              {get; set;}
        public Boolean SearchPrefilterable           {get; set;}
        public Boolean Sortable                      {get; set;}
        public Boolean Unique                        {get; set;}
        public Boolean Updateable                    {get; set;}
        public Boolean WriteRequiresMasterRead       {get; set;}

        public String  ParentObjectName              {get; set;}
   }

}
```

```html:YGG_ObjectItemViewer.page (Visualforceページ)
<apex:page controller="YGG_ObjectItemViewer">
  <style>
    .def   {font-family:'メイリオ', 'Meiryo'; font-size:12px;}
    .odd   {background-color: #FFFFFF;}
    .even  {background-color: #DDFFFF;}
    
    table.gorgeous {
      /*width: 100%;*/
      border-collapse:separate;
      border-spacing: 0;
    }

    table.gorgeous th:first-child{
      border-radius: 5px 0 0 0;
    }

    table.gorgeous th:last-child{
      border-radius: 0 5px 0 0;
      border-right: 1px solid #3c6690;
    }

    table.gorgeous th {
      text-align: center;
      color:white;
      background: linear-gradient(#829ebc,#225588);
      border-left: 1px solid #3c6690;
      border-top: 1px solid #3c6690;
      border-bottom: 1px solid #3c6690;
      box-shadow: 0px 1px 1px rgba(255,255,255,0.3) inset;
      width: 25%;
      padding: 10px 0;
      font-family:'メイリオ', 'Meiryo'; font-size:12px;
    }

    table.gorgeous td {
      text-align: center;
      border-left: 1px solid #a8b7c5;
      border-bottom: 1px solid #a8b7c5;
      border-top:none;
      box-shadow: 0px -3px 5px 1px #eee inset;
      width: 25%;
      padding: 10px 0;
      font-family:'メイリオ', 'Meiryo'; font-size:12px;
    }

    table.gorgeous td:last-child {
      border-right: 1px solid #a8b7c5;
    }

    table.gorgeous tr:last-child td:first-child {
      border-radius: 0 0 0 5px;
    }

    table.gorgeous tr:last-child td:last-child {
      border-radius: 0 0 5px 0;
    }    
  </style>

  <apex:form styleClass="def">
    <div>
      <table border="0">
        <tr>
          <td class="def">
            <apex:inputCheckbox value="{!IsQueryableOnly}"/>Queryable Only
            <apex:inputCheckbox value="{!IsCustomObjectOnly}"/>CustomObject Only
          </td>
        </tr>
        <tr>
          <td class="def">
            Object Name<apex:inputText value="{!ObjectName}" styleClass="def"/>
            Prefix<apex:inputText value="{!PrefixString}" styleClass="def"/>
            <apex:commandButton value="reload" action="{!reloadPickList}" style="font-family:'メイリオ', 'Meiryo'; font-size:12px;"/>
          </td>
        </tr>
        <tr>
          <td>
            <apex:selectList value="{!ValuePicked}" size="1" styleClass="def">
              <apex:selectOptions value="{!customPickList}"/>
            </apex:selectList>
            <apex:commandButton value="決定" action="{!execute}" style="font-family:'メイリオ', 'Meiryo'; font-size:12px;"/>
            <apex:outputLabel value="{!customPickListSize}" styleClass="def"></apex:outputLabel>
          </td>
        </tr>
      </table>
    </div>
    <apex:outputpanel rendered="{!IF(ObjectItemList.Size > 0, true, false)}">
      <table class="gorgeous">
        <tr><th>Category</th><th>value</th></tr>
        <tr><td>Prefix</td><td><apex:outputText value="{!Prefix}"/></td></tr>
        <tr><td>Label</td><td><apex:outputText value="{!Label}"/></td></tr>
        <tr><td>Name</td><td><apex:outputText value="{!Name}"/></td></tr>
        <tr><td>IsAccessible</td><td><apex:outputText value="{!IsAccessible}"/></td></tr>
        <tr><td>IsCreateable</td><td><apex:outputText value="{!IsCreateable}"/></td></tr>
        <tr><td>IsCustom</td><td><apex:outputText value="{!IsCustom}"/></td></tr>
        <tr><td>IsCustomSetting</td><td><apex:outputText value="{!IsCustomSetting}"/></td></tr>
        <tr><td>IsDeletable</td><td><apex:outputText value="{!IsDeletable}"/></td></tr>
        <tr><td>IsQueryable</td><td><apex:outputText value="{!IsQueryable}"/></td></tr>
        <tr><td>IsSearchable</td><td><apex:outputText value="{!IsSearchable}"/></td></tr>
        <tr><td>IsUndeletable</td><td><apex:outputText value="{!IsUndeletable}"/></td></tr>
        <tr><td>IsUpdateable</td><td><apex:outputText value="{!IsUpdateable}"/></td></tr>
      </table>
      <div>&nbsp;</div>
      <apex:dataTable value="{!ObjectItemList}" styleClass="gorgeous" var="row" id="theTable" rowClasses="odd,even">
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Name" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Name}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Label" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Label}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="LocalName" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.LocalName}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Length" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Length}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Type" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Type}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="RelationshipName" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.RelationshipName}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="RelationshipOrder" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.RelationshipOrder}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="ParentObjectName " styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.ParentObjectName}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Custom" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Custom}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Nillable" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Nillable}"/>
        </apex:column>


        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="ByteLength" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.ByteLength}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="CalculatedFormula" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.CalculatedFormula}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="DefaultValue" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.DefaultValue}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="DefaultValueFormula" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.DefaultValueFormula}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Digits" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Digits}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="InlineHelpText" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.InlineHelpText}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Precion" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Precion}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="ReferenceTarField" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.ReferenceTarField}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Scale" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Scale}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Accessible" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Accessible}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="AiPredictionField" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.AiPredictionField}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="AutoNumber" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.AutoNumber}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Calculated" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Calculated}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="CascadeDelete" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.CascadeDelete}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="CaseSensitive" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.CaseSensitive}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Createable" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Createable}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="DefaultedOnCreate" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.DefaultedOnCreate}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="DependentPicklt" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.DependentPicklt}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="DeprecatedAndHidden" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.DeprecatedAndHidden}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="ExternalID" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.ExternalID}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Filterable" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Filterable}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="FormulaTreatNullNumberAsZero" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.FormulaTreatNullNumberAsZero}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Groupable" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Groupable}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="HtmlFormatted" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.HtmlFormatted}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="IdLookup" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.IdLookup}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="NameField" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.NameField}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="NamePointing" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.NamePointing}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Permsionable" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Permsionable}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="RestrictedDelete" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.RestrictedDelete}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="RestrictedPicklt" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.RestrictedPicklt}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="SearchPrefilterable" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.SearchPrefilterable}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Sortable" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Sortable}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Unique" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Unique}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="Updateable" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.Updateable}"/>
        </apex:column>
        <apex:column styleClass="def">
          <apex:facet name="header">
            <apex:outputText value="WriteRequiresMasterRead" styleClass="def"/>
          </apex:facet>
          <apex:outputText value="{!row.WriteRequiresMasterRead}"/>
        </apex:column>
      </apex:dataTable>
    </apex:outputpanel>
    <apex:outputText ></apex:outputText>
  </apex:form>
</apex:page>
```


# ご了承ください
- まだまだ勉強中の部分もあります。間違っている箇所もあるかもしれません。
- Salesforce は、この時点のバージョン(2022年4月～5月頃) での内容になります。今後、仕様変更が変わることによって、内容の通りにならない可能性もあります。ご了承ください。
 - また、URLなども変更になっている可能性もあります。