【Salesforce】項目一覧 or 条件指定SOQLのCSVファイル出力方法

# 問題
・オブジェクトの項目一覧を出力したい
・オブジェクトの項目一覧を条件指定して出力したい
・オブジェクトの項目一覧を条件指定してSQOLで出力したい

# 解決策

※下記コードを調整、開発者コンソールで実行すると「ファイル」に保存される

## オブジェクトの項目一覧を出力したい

```java:オブジェクトの項目一覧を出力したい.cls

// 【指定箇所は下記のオブジェクトのみ】
// 対象のオブジェクトを設定する
public static final String TARGET_OBJECT = 'Account';

// ContentVersionを初期化する
ContentVersion cvObj = new ContentVersion();
cvObj.ContentLocation = 'S'; // ファイルをSalesforce上に保存する
cvObj.PathOnClient = TARGET_OBJECT + '.csv'; // ファイル名を設定する
cvObj.Title = TARGET_OBJECT; // ファイルのタイトルを設定する
String myContent = '項目名,API参照名,データ型,バイト数,文字数' + '\n'; //出力ファイルの項目を作成

Map <String,Schema.SObjectType> gd = Schema.getGlobalDescribe();
System.Debug('★★ 変数 gd ： ' + gd);
Schema.SObjectType sobjType = gd.get(TARGET_OBJECT);
System.Debug('★★ 変数 sobjType ： ' + sobjType);
Schema.DescribeSObjectResult r = sobjType.getDescribe();
System.Debug('★★ 変数 r ： ' + r);
Map<String, Schema.SObjectField> mapOfField = r.fields.getMap();
System.Debug('★★ 変数 mapOfField ： ' + mapOfField);

for(String fieldName : mapOfField.keySet()) {
    System.Debug('★★ 変数 fieldName ： ' + fieldName);
    Schema.SObjectField field = mapOfField.get(fieldName);
    System.Debug('★★ 変数 field ： ' + field);
    Schema.DescribeFieldResult fDescribe = field.getDescribe();
    System.Debug('★★ 変数 fDescribe ： ' + fDescribe);
    myContent += fDescribe.getLabel() + ',' + field + ',' +  fDescribe.getType() + ',' + fDescribe.getByteLength() + ',' + fDescribe.getLength() + '\n';
}

cvObj.VersionData = Blob.valueOf(myContent); // ファイルデータを作成する
System.Debug('★★ 変数 cvObj ： ' + cvObj);
insert cvObj;

```

↓

```csv:オブジェクトの項目一覧を出力したい.csv

項目名,API参照名,データ型,バイト数,文字数
取引先 ID,Id,ID,18,18
削除,IsDeleted,BOOLEAN,0,0
マスタレコード ID,MasterRecordId,REFERENCE,18,18
取引先名,Name,STRING,765,255
取引先 種別,Type,PICKLIST,765,255
以下略・・・

```

## オブジェクトの項目一覧を条件指定して出力したい

```java:オブジェクトの項目一覧を条件指定して出力したい.cls

// 【指定箇所は下記のオブジェクトのみ】
// 対象のオブジェクトを設定する
public static final String TARGET_OBJECT = 'Account';

// ContentVersionを初期化する
ContentVersion cvObj = new ContentVersion();
cvObj.ContentLocation = 'S'; // ファイルをSalesforce上に保存する
cvObj.PathOnClient = TARGET_OBJECT + '.csv'; // ファイル名を設定する
cvObj.Title = TARGET_OBJECT; // ファイルのタイトルを設定する
String myContent = '項目名,API参照名,データ型,バイト数,文字数' + '\n'; //出力ファイルの項目を作成

Map <String,Schema.SObjectType> gd = Schema.getGlobalDescribe();
System.Debug('★★ 変数 gd ： ' + gd);
Schema.SObjectType sobjType = gd.get(TARGET_OBJECT);
System.Debug('★★ 変数 sobjType ： ' + sobjType);
Schema.DescribeSObjectResult r = sobjType.getDescribe();
System.Debug('★★ 変数 r ： ' + r);
Map<String, Schema.SObjectField> mapOfField = r.fields.getMap();
System.Debug('★★ 変数 mapOfField ： ' + mapOfField);

for(String fieldName : mapOfField.keySet()) {
    System.Debug('★★ 変数 fieldName ： ' + fieldName);
    Schema.SObjectField field = mapOfField.get(fieldName);
    System.Debug('★★ 変数 field ： ' + field);
    Schema.DescribeFieldResult fDescribe = field.getDescribe();
    System.Debug('★★ 変数 fDescribe ： ' + fDescribe);
    // 編集可能項目を取得する
    if (fDescribe.isUpdateable()) {
        myContent += fDescribe.getLabel() + ',' + field + ',' +  fDescribe.getType() + ',' + fDescribe.getByteLength() + ',' + fDescribe.getLength() + '\n';
    }
}

cvObj.VersionData = Blob.valueOf(myContent); // ファイルデータを作成する
System.Debug('★★ 変数 cvObj ： ' + cvObj);
insert cvObj;

```

↓

```csv:オブジェクトの項目一覧を条件指定して出力したい.csv

項目名,API参照名,データ型,バイト数,文字数
取引先名,Name,STRING,765,255
取引先 種別,Type,PICKLIST,765,255
親取引先 ID,ParentId,REFERENCE,18,18
町名・番地(請求先),BillingStreet,TEXTAREA,765,255
市区郡(請求先),BillingCity,STRING,120,40
以下略・・・

// 上記の場合、更新できる項目のみ取得、ID、数式、作成、最終更新などがNG

```

## オブジェクトの項目一覧を条件指定してSQOLで出力したい

```java:オブジェクトの項目一覧を条件指定してSQOLで出力したい.cls

// 【指定箇所は下記のオブジェクトのみ】
// 対象のオブジェクトを設定する
public static final String TARGET_OBJECT = 'Account';

// ContentVersionを初期化する
ContentVersion cvObj = new ContentVersion();
cvObj.ContentLocation = 'S'; // ファイルをSalesforce上に保存する
cvObj.PathOnClient = TARGET_OBJECT + '.csv'; // ファイル名を設定する
cvObj.Title = TARGET_OBJECT; // ファイルのタイトルを設定する
String myContent = ''; // SOQL文作成
List<String> fieldList = new List<String>(); // 対象項目一覧
fieldList.add('Id'); // ID項目はリレーションの観点から必要

Map <String,Schema.SObjectType> gd = Schema.getGlobalDescribe();
System.Debug('★★ 変数 gd ： ' + gd);
Schema.SObjectType sobjType = gd.get(TARGET_OBJECT);
System.Debug('★★ 変数 sobjType ： ' + sobjType);
Schema.DescribeSObjectResult r = sobjType.getDescribe();
System.Debug('★★ 変数 r ： ' + r);
Map<String, Schema.SObjectField> mapOfField = r.fields.getMap();
System.Debug('★★ 変数 mapOfField ： ' + mapOfField);

for(String fieldName : mapOfField.keySet()) {
    System.Debug('★★ 変数 fieldName ： ' + fieldName);
    Schema.SObjectField field = mapOfField.get(fieldName);
    System.Debug('★★ 変数 field ： ' + field);
    // 編集可能項目を取得する
    if (fDescribe.isUpdateable()) {
		// 項目を取得
       	fieldList.add(String.valueOf(field));
    }
}

// クエリ生成
myContent = 'SELECT ' + String.join(fieldList, ',') + ' FROM ' + TARGET_OBJECT;

cvObj.VersionData = Blob.valueOf(myContent); // ファイルデータを作成する
System.Debug('★★ 変数 cvObj ： ' + cvObj);
insert cvObj;

```

↓

```csv:オブジェクトの項目一覧を条件指定してSQOLで出力したい.csv

SELECT Id,Name,Type,ParentId,BillingStreet,BillingCity,BillingState,BillingPostalCode,BillingCountry,BillingLatitude,BillingLongitude,BillingGeocodeAccuracy,ShippingStreet,ShippingCity,ShippingState,ShippingPostalCode,ShippingCountry,ShippingLatitude,ShippingLongitude,ShippingGeocodeAccuracy,Phone,Fax,AccountNumber,Website,Sic,Industry,AnnualRevenue,NumberOfEmployees,Ownership,TickerSymbol,Description,Rating,Site,OwnerId,IsPartner,IsCustomerPortal,Jigsaw,CleanStatus,AccountSource,DunsNumber,Tradestyle,NaicsCode,NaicsDesc,YearStarted,SicDesc,DandbCompanyId,CustomerPriority__c,SLA__c,Active__c,NumberofLocations__c,UpsellOpportunity__c,SLASerialNumber__c,SLAExpirationDate__c,Customer_ID__c FROM Account

```

※データローダなどで使用する

# 参考リンク
[Salesforceオブジェクトの項目一覧csv出力方法](https://zenn.dev/okapi/articles/a77633cef12390)

[ContentVersion](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_contentversion.htm)

[DescribeFieldResult](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_fields_describe.htm)