今回はライブラリ内に作成・格納できるフォルダとファイルの移動についてまとめてみました。
検証環境はLightningなのでClassicとは多少結果が異なる部分があるかもしれませんが、ご了承くださいまし。
同ライブラリ内でのフォルダの移動
手動移動
同ライブラリ内での手動でのフォルダの移動は可能です。
ファルダの「▼」ボタンから「移動」を選択し、移動先のフォルダを指定すれば、移動できます。
フォルダを移動すると、そのフォルダ配下にあるサブフォルダーやファイルもすべて移動されます。
データローダによる移動
データローダでフォルダを移動させる時は、フォルダの格納オブジェクトである「コンテンツフォルダ」のParentContentFolderIdをUpdateします。
コンテンツフォルダの「ParentContentFolderId」に親フォルダIdまたは、ライブラリのRootContentFolderId(ContentWorkspace.RootContentFolderId)を設定することで移動先を指定できます。
Apexによる移動
Apexでのフォルダの移動も可能でした。
コンテンツフォルダの「ParentContentFolderId」に、移動先の親フォルダのId、もしくはライブラリの「RootContentFolderId」(ContentWorkspace.RootContentFolderId)を設定し、コンテンツフォルダを更新します。
ContentFolder cf = [Select Id From ContentFolder Where Name = 'テストフォルダ1'];
ContentFolder newCf = new ContentFolder();
newCf.Id = cf.Id;
//移動先の親フォルダのId、もしくはライブラリのRootContentFolderIdを設定
newCf.ParentContentFolderId = '07H5h000000tbS4EAI';
update newCf;
同ライブラリ内でのファイルの移動
手動移動
同ライブラリ内での手動でのファイルの移動は可能です。
ファイルの「▼」ボタンから「移動」を選択し、移動先のフォルダを指定すれば、移動できます。
データローダによる移動
データローダでフォルダを移動させる時は、フォルダとファイルの関連オブジェクトである「コンテンツフォルダメンバー」をUpdateします。
コンテンツフォルダメンバーの「ParentContentFolderId」に親フォルダIdまたは、ライブラリの「RootContentFolderId」(ContentWorkspace.RootContentFolderId)を設定することで移動先を指定できます。
Apexによる移動
Apexでのファイルの移動も可能でした。
コンテンツフォルダメンバーの「ParentContentFolderId」に、移動先の親フォルダのId、もしくはライブラリの「RootContentFolderId」(ContentWorkspace.RootContentFolderId)を設定し、コンテンツフォルダメンバーを更新します。
ContentFolderMember cfm = [Select id, ChildRecordId from ContentFolderMember where ChildRecordId = '0695h000003A3khAAC'];
ContentFolderMember newCfm = new ContentFolderMember();
newCfm .Id = cfm.Id;
newCfm .ParentContentFolderId = '07H5h000000tbRyEAI';
update newCfm ;
ライブラリ間でのフォルダの移動
さて、ライブラリ間でのフォルダの移動ですが、残念ながら手動でも、データローダでも、Apexでも実現できませんでした、、、
例にならって、コンテンツフォルダの「ParentContentFolderId」に、他のライブラリの「RootContentFolderId」を指定してみたのですが、「親は、同じコンテンツフォルダ階層内にある必要があります」と怒られました。
ライブラリ間でのファイルの移動
手動移動
ライブラリ間での手動でのファイルの移動はできませんでした。
が、ファイルを一度ダウンロードして、別のライブラリにアップロードし直すことで移動みたいなことはできます。
手間ですが。
データローダによる移動
データローダによるライブラリ間のファイルの移動は可能です。(できないと思っていました笑。)
「コンテンツドキュメント」オブジェクトの「ParentId」に移動先のライブラリのIdを指定し、「コンテンツドキュメント」を更新します。(これは「RootContentFolderId」ではないので注意)
ただ、上記の操作では、移動対象のファイルを移動先ライブラリの特定のフォルダに格納することができず、ライブラリ直下に移動されることになります。
フォルダに格納したい場合は、そこから手動で移動、もしくは、コンテンツフォルダメンバーに親のフォルダを指定して更新する必要があります。
Apexによる移動
Apexを用いると、データローダでは実現できなかったファイルを別ライブラリに移動&特定のフォルダに格納というのが1つの処理で可能でした。
処理としては、以下の2つの処理を一連の流れで行う形になります。
- ContentDocument.ParentIdを更新し、ファイルを別ライブラリに移動させる。
- ContentFolderMember.ParentContentFolderIdを更新し、対象のフォルダにファイルを格納する。
//移動対象ファイル取得
ContentDocument cd = [select id from ContentDocument where Id = '0695h000003A5GjAAK'];
ContentDocument newCd = new ContentDocument();
newCd.Id = cd.Id;
//移動先のライブラリ.Idを指定
newCd.ParentId = '0585h000000GuDeAAK';
update newCd;
//移動対象ファイルが紐づくコンテンツドキュメントメンバーを取得
ContentFolderMember cfm = [select id, ChildRecordId, ParentContentFolderId from ContentFolderMember where ChildRecordId =: newCd.Id];
ContentFolderMember newCfm = new ContentFolderMember();
newCfm.Id = cfm.Id;
//格納先のフォルダ.Idを指定
newCfm.ParentContentFolderId = '07H5h000000tbTVEAY';
update newCfm;
まとめ
まとめるとこんな感じです。
説明 | 手動 | データローダ | Apex |
---|---|---|---|
ライブラリ内フォルダ移動 | 〇 | 〇 | 〇 |
ライブラリ内ファイル移動 | 〇 | 〇 | 〇 |
ライブラリ間フォルダ移動 | × | × | × |
ライブラリ間ファイル移動 | △(ダウンロードして再アップロードなら可) | △(ライブラリ直下に移動なら可) | 〇 |
終わりですっ!
コメント