ファイルDownload
前回はファイルをアップロードし各種オブジェクトに関連付けるワークフローについてご紹介しました。もし見逃したという方は「ファイルUploadと関連付け」も併せてご覧ください。
グループ会社間でSalesforceを介してファイルを共有しており、他社が共有したファイルはSalesforceからダウンロードのうえ社内各部に展開する必要がある。ファイルは多岐にわたるためダウンロードと展開には手間がかかる・・
こういった「ファイルダウンロードと社内配布の手間」に悩まれたことはないでしょうか。 社内ポリシー上の理由からSalesforceにアクセスできるユーザが限られている場合、どうしても代表して作業する必要が出てきますよね。
読み終わったあと本記事をみながらワークフローを作成すれば、ダウンロードの手間が減らせると思います。
ファイルの主要関連オブジェクト
ファイルの主要オブジェクト群を確認しておきましょう。
※本記事から読み始められた方で"オブジェクト"という単語を初めて目にした方は「Salesforce連携ソリューションを活用するための基礎知識1」を先にご覧ください。
ファイルを取り巻くオブジェクトは大きく「ファイル関連オブジェクト」「各種関連先オブジェクト」「ライブラリ&フォルダ関連オブジェクト」の3つに分かれていることがわかります。
「ファイル関連オブジェクト」はファイル本体を管理するオブジェクト群です。「ファイル(ContentDocument)」は新規アップロードのたびに対で作成され直近の情報を管理しています。
「各種関連先オブジェクト」はファイルを関連付ける各種オブジェクト群です。商談や取引先などのWebページで添付ファイルを表示させるには、これらのオブジェクトと関連付ける必要があります。
「ライブラリ&フォルダ関連オブジェクト」はライブラリおよび配下のフォルダに関するオブジェクトです。ファイルをこれらに配置して管理する場合のみ必要になります。
ここまでの内容に出てきていないオブジェクトが「ContentDocumentLink」です。 「ContentDocumentLink」は3つのオブジェクト群をつなぐ役割を担うオブジェクトです。
ライブラリ内のフォルダを階層構造にして管理されている場合もあるのではないでしょうか。ライブラリ内のフォルダ構造とオブジェクトの対応関係を下図に示します。ライブラリとルートフォルダ間や、フォルダとファイル間は専用のオブジェクトがある一方、フォルダ間の階層関係はContentFolderオブジェクトで管理されている点に注意してください。また、ルートフォルダはWebUI上は表示されませんが、管理上存在しています。
商談に添付されたファイルのダウンロード
商談に添付されたにファイルをダウンロードするワークフローを作成します。
ダウンロード元のイメージとワークフローの全体像は次の通りです。
なお、商談とファイルは予めSalesforceに登録されている必要がありますので、ない場合はWeb画面から準備してください。Actvityの設定方法を中心にお届けしているため、Salesforceアプリケーションスコープの設定やエラー制御は含まれておりません。
個別にプロパティの設定内容を見てみます。
①商談を特定します。
-
SOQL詳細:
SELECT Id,Name FROM Opportunity WHERE Name = 'サンプル商談' AND Account.Name = 'サンプル株式会社'
- Id,Name(商談名)を商談(Opportunity)オブジェクトから取得するSOQLです
- レコードの絞込条件として、
- 特定の商談名であること
- 特定の取引先名であること
- Salesforceステータスは必要に応じて設定します。
※本例では設定していますが、後続では使用しません。 - SOQLの結果を格納するため変数を設定します。
- 変数の型はDataTableです。
- DataTable内の列はSELECTの項目名になるため、Id,Nameの2列になります。
②商談に添付されたファイルレコードのIDを特定します。
-
SOQL詳細:
"SELECT ContentDocumentId,ContentDocument.Title FROM ContentDocumentLink WHERE LinkedEntityId = '" + sfdcOpportunityList(0)("Id").ToString() + "' AND ContentDocument.Title = 'サンプルファイル_20201224-1.txt'"
- Id,ContentDocumentId(ファイルのID),ContentDocument.Title(ファイル名)をContentDocumentLinkオブジェクトから取得するSOQLです。ContentDocumentLinkから取得する理由は、ContentDocumentでは関連する商談を条件に指定できないためです
- レコードの絞込条件として、
- 特定の商談に関連付けられていること
- 特定のファイル名であること
- Salesforceステータスは必要に応じて設定します。
※本例では設定していますが、後続では使用しません。 - SOQLの結果を格納するため変数を設定します。
- 変数の型はDataTableです。
- DataTable内の列はSELECTの項目名になるため、ContentDocumentId,ContentDocument.Titleの2列になります。
③特定したファイルをダウンロードします。
- ダウンロード対象ファイルのIDを設定します。
- ②で特定したものを設定します。本例では「sfdcContentDocumentList(0)("ContentDocumentId").ToString()」を設定します
- ローカルに保存される際のファイル名を設定します。
- ファイル名は任意でOKです。本例ではSalesforce上のタイトルと同じ名称にするため「sfdcContentDocumentList(0)("ContentDocument.Title").ToString()」を設定します
- ローカルの保存先フォルダパスを設定します。
- パスは任意でOKです。本例ではワークフロープロジェクト直下の「"Data¥Download"」を設定します
- 必要に応じて変数を設定します。
※本例では設定していますが、後続では使用しません。
これで完成です。ワークフローを実行してみてください。ファイルがローカルにダウンロードされていれば成功です。
フォルダからのファイルダウンロード
フォルダに登録されたファイルを一括ダウンロードするワークフローを作成します。 ダウンロード元のイメージとワークフローの全体像は次の通りです。
個別にプロパティの設定内容を見てみます。
①ライブラリ名からルートフォルダを特定します。
-
SOQL詳細:
SELECT RootContentFolderId FROM ContentWorkSpace WHERE Name='サンプルライブラリ'
- ルートフォルダのID(RootContentFolderId)をライブラリ(ContentWorkSpace)オブジェクトから取得するSOQLです
- レコードの絞込条件として、
- 特定のライブラリ名であること
- Salesforceステータスは必要に応じて設定します。
※本例では設定していますが、後続では使用しません。 - SOQLの結果を格納するため変数を設定します。
- 変数の型はDataTableです。
- DataTable内の列はSELECTの項目名になるため、RootContentFolderIdの1列になります。
②ファイルが格納されているフォルダのIDを特定します。
-
SOQL詳細:
"SELECT Id FROM ContentFolder WHERE Name='子フォルダ' AND ParentContentFolder.Name='親フォルダ' AND ParentContentFolder.ParentContentFolderId='" + sfdcRootFolderList(0)("RootContentFolderId").ToString() + "'"
- Idをフォルダ(ContentFolder)オブジェクトから取得するSOQLです
- レコードの絞込条件として、
- フォルダ名、親フォルダ名が特定の名称であること
- フォルダが特定のライブラリに属すること
- Salesforceステータスは必要に応じて設定します。
※本例では設定していますが、後続では使用しません。 - SOQLの結果を格納するため変数を設定します。
- 変数の型はDataTableです。
- DataTable内の列はSELECTの項目名になるため、Idの1列になります。
③フォルダ内のファイルリストを取得します。
-
SOQL詳細:
"SELECT ChildRecordId,ChildRecord.Title FROM ContentFolderMember WHERE ParentContentFolderId='" + sfdcSaveFolderList(0)("Id").ToString() + "'"
- ファイルID(ChildRecordId),ファイルタイトル(ChildRecord.Title)をContentFolderMemberオブジェクトから取得するSOQLです
- レコードの絞込条件として、
- 特定のフォルダに属するファイルであること
- Salesforceステータスは必要に応じて設定します。
※本例では設定していますが、後続では使用しません。 - SOQLの結果を格納するため変数を設定します。
- 変数の型はDataTableです。
- DataTable内の列はSELECTの項目名になるため、ChildRecordId,ChildRecord.Titleの2列になります。
④ファイルリストを上から順に繰り返し処理します。
- ファイルリストを保存している変数を設定します。
- 本例では③で取得した「sfdcContentDocumentList」を設定します。
- その他の設定は割愛します。
⑤ファイルをダウンロードします。
- ダウンロード対象ファイルのIDを設定します。
- ④で特定したリスト内のIDを設定します。本例では「row("ContentDocumentId").ToString()」を設定します
- ローカルに保存される際のファイル名を設定します。
- ファイル名は任意でOKです。本例ではSalesforce上のタイトルと同じ名称にするため「row("ContentDocument.Title").ToString()」を設定します
- ローカルの保存先フォルダパスを設定します。
- パスは任意でOKです。本例ではワークフロープロジェクト直下の「"Data¥Download"」を設定します
- 必要に応じて変数を設定します。
※本例では設定していますが、後続では使用しません。
⑤単独でダウンロードできるのは1ファイルですが、④で繰り返すことで全てのファイルをダウンロードします。
これで完成です。ワークフローを実行してみてください。Salesforceフォルダ内の全ファイルがローカルにダウンロードされていれば成功です。
Salesforceと同じフォルダ構造をファイルサーバにもち、同期させる形でダウンロードされるケースもあるかと思います。その場合は、①と②の間に工夫が必要になります。もし情報が必要な方は、弊社営業担当にお声がけください。
まとめ
今回は「ファイルDownload」に関するワークフローの作り方をお届けしました。
皆様のワークフロー開発の一助になれば幸いです。
Activityの公開先 (UiPathマーケットプレイス):
Salesforce連携ソリューションご案内:
その他連携ソリューションご案内:
https://www.uipath.com/ja/solutions/application-cooperation-solutions
次回は「レポートの実行と結果の取得」を行うワークフローをお届けします。お楽しみに。
