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