はじめに
みなさんはSalesforceの「ファイル」(Salesforce Files)を活用していますか?
ローカルにあるファイルを登録できたり、公開グループを使って共有設定したりすることも可能です。
今回はApexでファイルを使ってみたいと思います!
ファイルの基本的な使い方やDataLoaderでの登録方法についてはこちらの記事をご覧ください!
ローカルにあるファイルを登録できたり、公開グループを使って共有設定したりすることも可能です。
今回はApexでファイルを使ってみたいと思います!
ファイルの基本的な使い方やDataLoaderでの登録方法についてはこちらの記事をご覧ください!
Salesforceの「ファイル」を使ってみよう - TerraSkyBase | テラスカイを支える人とテクノロジーの情報を発信する基地局
Classic環境で使用されていた「メモ&添付ファイル」を大きくパワーアップした「ファイル」。Lightning環境を使うのであれば、活用しなければもったいないですよ。そんな「ファイル」について、利点やオブジェクト構造などを紹介いたします。
オブジェクト構成
まずはじめにファイルのオブジェクト構成を知るところからです。
「ファイル」といってもファイルオブジェクトが1つあるわけではなく、なかなか複雑な構成で成り立っています。
「ファイル」といってもファイルオブジェクトが1つあるわけではなく、なかなか複雑な構成で成り立っています。
左から順に、ContentWorkSpaceとContentWorkSpaceDocはライブラリ、ContentDocumentとContentVersionはファイル、ContentDocumentHistoryとContentVersionHistoryはHistoryと名の付く通りファイルのバージョン履歴の情報を保持するオブジェクトです。
これらは一部に過ぎず、後半にも少し出てきますがこのContentで始まるオブジェクトはまだまだあって紹介しきれないので、気になる方はぜひ調べてみてください。
さて、これらのオブジェクトですが言葉だけで説明してもなかなかピンとこないかもしれませんので、実際にApexを用いながら説明していきたいと思います。
これらは一部に過ぎず、後半にも少し出てきますがこの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を使用し、PathOnClientとversionDataが最低限必要な情報となります。
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も作成されていました。
ファイルを作成する際は、ContentVersionを使用し、PathOnClientとversionDataが最低限必要な情報となります。
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も作成されていました。
ライブラリとの関連付け(新規)
ライブラリも同じように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」を移動させてみます。
ここで新しく使うオブジェクトがContentFolderとContentFoldermemberです。
ここで新しく使うオブジェクトがContentFolderとContentFoldermemberです。
//ライブラリを取得 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を使ってファイルを移動させます。
次に新たに「テストフォルダ」を作成します。ここで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で使用するChildRecordIdがContentDocumentを参照しているためです。
ContentDocumentでファイルを取得したのち、ContentFolderMemberでTestFileを「テストライブラリ内にあるTestFile」として取得します。この「テストライブラリ内にある」という部分を変えたいので、ParentContentFolderIdを取得したテストフォルダのIDに変えてupdateし、TestFileはテストライブラリからテストフォルダへ移動しました。
ContentDocumentでファイルを取得したのち、ContentFolderMemberでTestFileを「テストライブラリ内にあるTestFile」として取得します。この「テストライブラリ内にある」という部分を変えたいので、ParentContentFolderIdを取得したテストフォルダのIDに変えてupdateし、TestFileはテストライブラリからテストフォルダへ移動しました。
まとめ
今回、Apexを使ってファイルを使用してみました。
Apexを使うと、Salesforceの画面上で操作する分にはあまり意識していなかったファイル、フォルダ、ライブラリのオブジェクトやそのリレーション、またオブジェクトが持つ項目が見えてきました。
今回行ったファイルの新規作成やライブラリの関連付け、格納先の移動は基本的な操作ではありますが、用途によって使用するオブジェクトが違ったり、項目に指定するのがIDでも使うタイミングによっては使えない・特定のIDじゃないといけないなど、なかなか複雑でしたね。
冒頭にも記載しましたが、今回紹介した以外にもまだまだContent~オブジェクトはたくさんあるので、気になる方はぜひ調べてみてください!!
Apexを使うと、Salesforceの画面上で操作する分にはあまり意識していなかったファイル、フォルダ、ライブラリのオブジェクトやそのリレーション、またオブジェクトが持つ項目が見えてきました。
今回行ったファイルの新規作成やライブラリの関連付け、格納先の移動は基本的な操作ではありますが、用途によって使用するオブジェクトが違ったり、項目に指定するのがIDでも使うタイミングによっては使えない・特定のIDじゃないといけないなど、なかなか複雑でしたね。
冒頭にも記載しましたが、今回紹介した以外にもまだまだContent~オブジェクトはたくさんあるので、気になる方はぜひ調べてみてください!!
31 件