Salesforceファイルのデータ移行
はじめに
お久しぶりです。加藤です。花粉が辛いです。。
今回はファイルのデータ移行手順について記載します。
久々にやるといつも手順忘れちゃいがちなやつです。
ここでは、ContentDocumentとAttachmentを、別環境のContentDocumentとして移行する手順を書いていきます!
※ContentNoteもContentVersionとしてダウンロードできるため、同様の手順で移行できます。
手順としては
- データエクスポートウィザードで必要ファイルを抜き出す
- ContentVersionとAttachmentのフォルダをローカルドライブに作成する
- フォルダにあるファイルをすべてrenameする
- insert用csvファイルを作成し、データローダーで一括insert
- 他のレコードとの紐付けるため、ContentDocumentLinkをinsertする
て感じです。
ではそれぞれ詳しく説明します!
<補足 データの格納場所について>
ContentDocument:ファイル(Lightning)
ContentDocument/ContentNote:メモ(Lightning)
ContentDocument/ContentNote:メモ&添付ファイル(Lightning)
Attachment:メモ&添付ファイル(Classic)
1. データエクスポートウィザードで必要ファイルを抜き出す
ContentVersionのファイルデータ(×ContentVersion.csv)がウィークリーエクスポートでしか抽出できないためウィークリーエクスポートを使用します。
極論ですが、ContentVersionのファイルデータ以外はデータローダーで必要ファイル抜けますので後で使うContentDocumentLinkを抜き忘れたと言って青ざめる😨必要はありません。

[設定]>[データ]>[データのエクスポート]>[今すぐエクスポート]
※スケジュールでエクスポートしていて、以下のチェックが入っていればそのエクスポートデータを使用しても大丈夫です!
※最新の情報が必要な場合は、[今すぐエクスポート]しましょう!

関連のオブジェクトに関してはとりあえず画像の通り「すべてのデータを含める」としときましょう。
ここで絶対に忘れてはいけないのは
・画像、ドキュメント、および添付ファイルを含める
・Salesforce Files および Salesforce CRM Content ドキュメントバージョンを含める
にチェックをいれることです。
絶対に忘れてはいけません。
2. ContentVersionとAttachmentのフォルダをローカルドライブに作成する
さて、結構大量にフォルダがダウンロードされたかと思います。
軽く数十ファイルになることもざらです。
それをすべて開いて、複数フォルダにまたがっているであろうContentVersionファイルとAttachmentフォルダをすべて一つにまとめてください!!
※別にまとめなくてもいいんですが、後続作業内容的にまとめた方が圧倒的に楽です。圧倒的推奨です。

こんな感じですね。
3. フォルダにあるファイルをすべてrenameする
ちょっとmacかwindowsで変わると思うんですが、ターミナルやらコマンドプロンプトやらでフォルダ内のrenameしていきます。
どうrenameするかというと、ContentVersion(Attachment)フォルダ内のファイル名に拡張子をつけていきます。
※ContentVersion.csv(Attachment.csv)を用いると ID:ID.拡張子 の対応表を作成できます!
今回はmacで説明します。
まずはshファイルを作成します。
#!/bin/bash
# Generated from ExecuteRename.bat (Mac)
# Failed renames are printed to stderr.
mv "0685h00000HoLiDAAV" "0685h00000HoLiDAAV.pdf" 2>/dev/null || echo "Failed: 0685h00000HoLiDAAV -> 0685h00000HoLiDAAV.pdf" >&2
mv "0685h00000HoMQyAAN" "0685h00000HoMQyAAN.pdf" 2>/dev/null || echo "Failed: 0685h00000HoMQyAAN -> 0685h00000HoMQyAAN.pdf" >&2
↑mv のところのContentVersionID(AttachmentID)は各ContentVersion(Attachment)のRename前のファイル名と、対応するRename後のファイル名に書き換えてください。
これをContentVersion(Attachment)件数だけ繰り返してください。
これを同階層において実行すると、renameできます。

同階層イメージ
ターミナルで、まずファイルの実行権限を変更して・・
chmod +x ExecuteRename.sh
実行
./ExecuteRename.sh
拡張子がついたら、ファイルが開けるようになってると思います!
🌈色鮮やか🌈になりました

4. insert用csvファイルを作成し、データローダーで一括insert
エクセルでContentVersionのinsert用csvファイルを作成します。
以下3項目は必須です。
・Title
・PathOnClient
・VersionData
PathOnClient と VersionDataはContentVersionファイルまでのパスを入力してください。
macだと、
/User/keikakato/~~~~/Contentversion(Attachment)/0685h00000Ge9FvAAJ.jpg
てな具合です。
※windowsだと、ドライブのところからパスが必要です。(C:\Users\katokei\Desktop\ContentVersion\0685h00000Ge9FvAAJ.jpg)
※ファイルinsert時に他のレコードと紐付けたい場合はFirstPublishLocationIdを使用します。

こんな感じですね
※ユーザの非公開フォルダへ移行したいファイルは、作成者と所有者と関連先を同じユーザにしておくと対応できます。
ファイルができたら、データローダーでinsertしましょう。
(本insert作業で、ContentVersion ContentDocument ContentDocumentLink が自動で作成されます)
これでファイル自体の移行は完了です!
5. 他のレコードと紐付けるため、ContentDocumentLinkをinsertする
ContentDocumentLinkを使用し、まだ紐づいていないレコードとファイルを追加で紐付けます。
ここまで完了したら、ファイルのデータ移行は完了かと思います・・!
さいごに
意外と細かな注意事項が散見するファイルのデータ移行・・
みなさんのトラウマとならない一助となれば幸いです><!
ただ何度やっても、rename作業中のファイルが🌈色鮮やか🌈になっていく様子は
なかなか気に入っています。
それでは・・!
Discussion