2023.08.03

Apexでファイルを使ってみよう!

はじめに

みなさんはSalesforceの「ファイル」(Salesforce Files)を活用していますか?
ローカルにあるファイルを登録できたり、公開グループを使って共有設定したりすることも可能です。
今回はApexでファイルを使ってみたいと思います!

ファイルの基本的な使い方やDataLoaderでの登録方法についてはこちらの記事をご覧ください!

オブジェクト構成

まずはじめにファイルのオブジェクト構成を知るところからです。
「ファイル」といってもファイルオブジェクトが1つあるわけではなく、なかなか複雑な構成で成り立っています。

コンテンツのオブジェクト

写真提供:Salesforce Developers
左から順に、ContentWorkSpaceContentWorkSpaceDocはライブラリ、ContentDocumentContentVersionはファイル、ContentDocumentHistoryContentVersionHistoryはHistoryと名の付く通りファイルのバージョン履歴の情報を保持するオブジェクトです。
これらは一部に過ぎず、後半にも少し出てきますがこのContentで始まるオブジェクトはまだまだあって紹介しきれないので、気になる方はぜひ調べてみてください。
さて、これらのオブジェクトですが言葉だけで説明してもなかなかピンとこないかもしれませんので、実際にApexを用いながら説明していきたいと思います。

Apexでファイル作成・挿入

ファイル作成

では早速、Apexでcsvファイルを作成してみます。
//csvファイルの中身
String Data = '"山田太郎","1998-07-01","東京都"';

//ファイルタイトル
String fileTitle = 'Test';

//ファイル作成・挿入
ContentVersion cv = new ContentVersion();
cv.PathOnClient = fileTitle + '.csv';
cv.versionData = Blob.valueOf(Data);
insert cv;
Apexサンプルコード(ファイル作成)

作成したファイル

csvファイルを作成しました。
ファイルを作成する際は、ContentVersionを使用し、PathOnClientversionDataが最低限必要な情報となります。
PathOnClientは簡単に言うと拡張子を含めたファイルの名前です。PathOnClient、または ContentUrlでリンクを設定してファイルの種別を明確にしないと次のようなDmlExceptionが出ます。
「FIELD_INTEGRITY_EXCEPTION, 次の項目の 1 つを設定してください: PathOnClient、ContentUrl」
versionDataはファイルの中身、本文のことです。こちらも設定しないとDmlExceptionになります。

ここでもう1つ大事なことがあります。ファイルに関連するオブジェクトであるContentVersionとContentDocumentの2つのうち、ContentDocumentはinsertできません。試しに実行したところ、「DML operation Insert not allowed on ContentDocument」という、この操作は許可されていませんというエラーが出ました。
ではいつContentDocumentのデータができるのでしょうか。実はContentVersionを作成し挿入したときに、自動でContentDocumentのデータも作成されるようです。
先ほどのApexコード実行後、SOQLでContentDocumentを取ってみたところ、確かにContentVersion挿入のタイミングでContentDocumentも作成されていました。

SOQLで取得したContentDocument

ライブラリとの関連付け(新規)

ライブラリも同じようにApexで作成・挿入し、ファイルを関連付けていきます。
まずはライブラリを作成します。
ContentWorkSpace cws = new ContentWorkSpace();
cws.Name = 'テストライブラリ';
insert cws;
Apexサンプルコード(ライブラリ作成)
ライブラリはContentWorkSpaceを使います。ライブラリは名前だけ設定してしまえば作成できます。
次に新しくファイルを作り、その格納先を作成したライブラリにします。
String Data ='"伊藤ハナコ","1998-07-31","愛知県"';
String title = 'TestFile';
ContentVersion cv = new ContentVersion();
cv.PathOnClient = title + '.csv';
cv.versionData = Blob.valueOf(Data);
cv.FirstPublishLocationId = cws.Id;   //ここで格納先のライブラリを指定
insert cv;
Apexサンプルコード(ファイル作成とライブラリ関連付け)

作成したライブラリとファイル

今回はファイル挿入と同時にライブラリに格納したいので、FirstPublishLocationIdを使って格納先のライブラリのIDを設定します。ここで注意したいのが、このFirstPublishLocationIdはFirstとあるように、最初に公開する場所を指定するものなのでInsert時にしか使えません
ここまでが、オブジェクト構成図に記載のあったオブジェクトを使用した処理です。

ファイルの移動

ここから、少し+αでテストライブラリ内にフォルダを作って格納した「TestFile」を移動させてみます。
ここで新しく使うオブジェクトがContentFolderContentFoldermemberです。
//ライブラリを取得
ContentWorkSpace cws =[SELECT Name FROM ContentWorkSpace WHERE Name = 'テストライブラリ']; 

//ライブラリをフォルダとして取得
ContentFolder cf1 = [SELECT Id,Name FROM ContentFolder WHERE Name =:cws.Id];

//テストライブラリ内にテストフォルダ作成
ContentFolder cf2 = new ContentFolder();
cf2.Name = 'テストフォルダ';
cf2.ParentContentFolderId = cf1.Id;
insert cf2;
Apexサンプルコード(フォルダ作成)
まず始めにライブラリを取得し、それを改めてフォルダとして扱うためにContentFolderを使って取得します。
次に新たに「テストフォルダ」を作成します。ここでParentContentFolderIdを使って1つ上の階層にテストライブラリがあることを設定します。
ParentContentFolderIdはイブラリのId(ContentWorkSpaceのID)では使用できないため、ライブラリを一度フォルダとして扱う必要があります。

次にContentFolderMemberを使ってファイルを移動させます。
ContentWorkSpace cws =[SELECT Name FROM ContentWorkSpace WHERE Name = 'テストライブラリ']; 
ContentFolder cf1 = [SELECT Id,Name FROM ContentFolder WHERE Name =:cws.Id];

//テストフォルダ取得
ContentFolder cf2 =[SELECT Id,Name,ParentContentFolderId FROM ContentFolder WHERE ParentContentFolderId =:cf1.Id];

//移動させるファイルの取得
ContentDocument cd = [SELECT title FROM ContentDocument WHERE title = 'TestFile'];

//ファイルの移動
ContentFolderMember cfm = [SELECT Id,ParentContentFolderId FROM ContentFolderMember WHERE childRecordId =:cd.Id];
cfm.ParentContentFolderId = cf2.Id;
update cfm;
Apexサンプルコード(ファイルの移動)
今回ファイルはContentDocumentを使用します。ファイルとフォルダ間の関連付けを定義するContentFolderMemberで使用するChildRecordIdContentDocumentを参照しているためです。
ContentDocumentでファイルを取得したのち、ContentFolderMemberでTestFileを「テストライブラリ内にあるTestFile」として取得します。この「テストライブラリ内にある」という部分を変えたいので、ParentContentFolderIdを取得したテストフォルダのIDに変えてupdateし、TestFileはテストライブラリからテストフォルダへ移動しました。

ファイルがテストフォルダ内に移動

まとめ

今回、Apexを使ってファイルを使用してみました。
Apexを使うと、Salesforceの画面上で操作する分にはあまり意識していなかったファイル、フォルダ、ライブラリのオブジェクトやそのリレーション、またオブジェクトが持つ項目が見えてきました。
今回行ったファイルの新規作成やライブラリの関連付け、格納先の移動は基本的な操作ではありますが、用途によって使用するオブジェクトが違ったり、項目に指定するのがIDでも使うタイミングによっては使えない・特定のIDじゃないといけないなど、なかなか複雑でしたね。
冒頭にも記載しましたが、今回紹介した以外にもまだまだContent~オブジェクトはたくさんあるので、気になる方はぜひ調べてみてください!!
31 件
     
  • banner
  • banner

関連する記事