Salesforce Lightning Experience切り替えに際してのレポート／ダッシュボード拡張フォルダ共有の有効化

# 背景
Summer'13以前に作成された組織では（明示的に拡張フォルダ共有の有効化を行わない限り）古いタイプのフォルダ共有が行われています。公開フォルダのアクセス権は、共有されているユーザ全員に対して一律に「参照のみ」「参照・更新」のどちらかのアクセス権が付与されています。
![Screen Shot 2019-07-31 at 11.28.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144149/364bbe8f-c17d-996b-e34b-23d330ee8098.png)

一方、Summer'13で導入された拡張フォルダ共有においては、共有先のユーザ、ロール、公開グループ等毎に個別に「参照」「編集」「管理」の権限を付与することが可能です。
![Screen Shot 2019-07-31 at 11.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144149/fa287048-6ff6-9ec1-d008-24457101fee4.png)

そして、__Lightning Experienceは古いフォルダ共有に対応していません__。付与されたアクセス権限は有効ですのでそのまま利用することは可能ですが、新規のフォルダの作成ができず、既存フォルダの共有を変更したい場合もClassicに戻って作業する必要があります。

したがってLightning Experienceへの切り替えを計画するならば拡張フォルダ共有も有効化したほうが良いでしょう。Lightning Experience Readiness Reportでも以下のように指摘されます。
![Screen Shot 2019-07-29 at 20.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144149/042ace20-328b-01a6-09cb-73184881bf4b.png)

拡張フォルダ共有を有効化するときに注意しなければならない点は、「参照・更新」で共有されていたフォルダも、__有効化したタイミングで「参照」権限で対象ユーザに共有されてしまう__ことです。（参照できていたレポート／ダッシュボードが有効化のタイミングで見れなくなることはありません。）

# 移行手順
手順の概要は以下のようになります。

1. 既存の「参照・更新」フォルダの確認
2. 拡張フォルダ共有の有効化
3. 参照のみになってしまったユーザに編集権限を付与

### 1. 既存の「参照・更新」フォルダの確認
まずは開発者コンソール等で以下のSOQLを発行し「参照・更新」で共有されているレポート／ダッシュボードフォルダを確認します。

```sql
SELECT Id, DeveloperName, Name, NamespacePrefix, Type, AccessType, IsReadonly FROM Folder WHERE Type in ('Report','Dashboard') and IsReadonly = false
```
![Screen Shot 2019-07-30 at 15.58.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144149/69ff9b89-9abe-ab90-a585-d2eb4d0d9992.png)

*  DeveloperNameがnullのフォルダは組み込みレポートフォルダです。これらのフォルダは拡張フォルダ共有を使用するかどうかに関わらず、Lightning Experienceからは参照できません。
  

### 2. 拡張フォルダ共有の有効化
設定画面の __カスタマイズ > レポート＆ダッシュボード > フォルダ共有__ から拡張フォルダ共有を有効化します。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144149/ebabbb26-8686-1773-cddf-7f0b9c2a1efa.png)

* この設定メニュー自体、Lightning Experienceの設定画面では出てきません。
* この設定は戻すことができません。__Sandboxで事前確認するようにしてください。__

### 3. 参照のみになってしまったユーザに編集権限を付与
フォルダの数が少ない場合は手で修正した方が早いでしょう。しかし、多数のフォルダが存在する場合はバッチで編集権限を付与したくなると思います。
ここではMetadata APIを使用して一括で権限を変更する方法をご紹介します。

a. 対象となるフォルダのメタデータを取得
b. エディタでメタデータを一括更新
c. 更新したメタデータをデプロイ

##### a. 対象となるフォルダのメタデータを取得
以下のように1.で取得したフォルダのDeveloperNameを記述したマニフェストファイル package.xml を準備しSalesforce CLI(sfdxコマンド)あるいはForce.com移行ツール(ant)でフォルダのメタデータをretrieveします。

```xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>MgmtDashboard</members>
        <name>Dashboard</name>
    </types>
    <types>
        <members>ReportsForMgmtDashboard</members>
        <members>Folder_SampleReport</members>
        <name>Report</name>
    </types>
    <version>46.0</version>
</Package>
```
コマンド例
`sfdx force:source:retrieve --manifest manifest/package.xml`

この結果、
- _DeveloperName_.dashboardFolder-meta.xml 
- _DeveloperName_.reportFolder-meta.xml 
といったファイルが、フォルダの数だけ取得されます。

##### b. エディタでメタデータを一括更新
メタデータファイルの中身は以下のようになっています。
`<accessLevel>View</accessLevel>`となっている部分が参照権限を示しています。この部分をエディタの一括置換の機能を使って`<accessLevel>EditAllContents</accessLevel>`に置き換えます。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<DashboardFolder xmlns="http://soap.sforce.com/2006/04/metadata">
    <folderShares>
        <accessLevel>View</accessLevel>
        <sharedTo>CEO</sharedTo>
        <sharedToType>Role</sharedToType>
    </folderShares>
    <folderShares>
        <accessLevel>View</accessLevel>
        <sharedTo>Partner</sharedTo>
        <sharedToType>RoleAndSubordinatesInternal</sharedToType>
    </folderShares>
    <name>マネジメント・ダッシュボード</name>
</DashboardFolder>
```
ちなみに拡張フォルダを有効化する前にretrieveすると以下のようなメタデータが取得されます。形式が異なっていることがわかります。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<DashboardFolder xmlns="http://soap.sforce.com/2006/04/metadata">
    <accessType>Shared</accessType>
    <name>マネジメント・ダッシュボード</name>
    <publicFolderAccess>ReadWrite</publicFolderAccess>
    <sharedTo>
        <role>CEO</role>
        <roleAndSubordinatesInternal>Partner</roleAndSubordinatesInternal>
    </sharedTo>
</DashboardFolder>
```
##### c. 更新したメタデータをデプロイ
a.で使用したpackage.xmlを使用してデプロイします。
コマンド例
`sfdx force:source:deploy --manifest manifest/package.xml --json --loglevel fatal`

* AllPartnerUsers, AllCustomerPortalUsers などはもともと編集権限を付与することができないため、デプロイ時にエラーが発生します。この場合は、該当部分の権限を`<accessLevel>View</accessLevel>`に戻してください。

# リファレンス
ナレッジ記事：[レポートおよびダッシュボードの拡張フォルダ共有](https://help.salesforce.com/articleView?id=000332029&language=ja&type=1&mode=1)
ナレッジ記事：[従来のフォルダ共有の廃止](https://help.salesforce.com/articleView?siteLang=ja&id=000321245&type=1&mode=1)
ヘルプ記事：[レポートとダッシュボードの拡張フォルダ共有の有効化](https://help.salesforce.com/articleView?id=analytics_sharing_enable.htm&type=5)
ヘルプ記事：[レポートおよびダッシュボードフォルダのアクセス権の比較](https://help.salesforce.com/articleView?id=analytics_folder_access_chart.htm&type=5)