カスタムメタデータ型をApexから更新 ~メタデータ API~

  • URLをコピーしました!

カスタムメタデータ型のカスタム項目の値をApexから更新する方法を備忘録として残します。
一般ユーザーでカスタムメタデータ型を更新する方法を探していましたが、
権限の問題で「設定・定義を参照する」権限が必要になるため、
一般ユーザーでは実行することができず、Apexで実行するメリットはなさそうです。

目次

必要な権限について

Apexからカスタムメタデータ型を更新するには
「メタデータ API 関数を使用したメタデータの変更」のシステム権限が必要です。
この権限を付与するためには、「設定・定義を参照する」のシステム権限も必要になります。

記事に示すコードを実行できるユーザーなら
設定からカスタムメタデータ型を参照するための権限を持っていることになるため、
Apexから実行するメリットがありません。

Salesforce公式HELP:メタデータ API 編集アクセス

Apexコード

更新対象のカスタムメタデータ型の例

今回例で更新するカスタムメタデータ型を以下に示します。これらはコードで使用します。
  カスタムメタデータ型のAPI参照名:TestMeta__mdt
  カスタム項目のAPI参照名:CustomDefinition__c

カスタムメタデータ型の更新するレコードのAPI参照名:ReportName

カスタムメタデータ型のカスタム項目を更新するコード例

カスタムメタデータ型の更新にはApexでデプロイを実行します。
デプロイは非同期で実行されますので、結果を取得するために「Metadata.DeployCallback」の
インタフェースを実装したApex クラスを作成します。
実行したいApex クラスから作成したApex クラスを呼び出すことで更新を行います。
(黄色背景の部分は環境に合わせて変更が必要です)

Salesforce開発者ガイド:
Operations クラス
DeployCallback インターフェース

public class ADEV_CTRL_EditCustomMetadataType implements Metadata.DeployCallback {

    public void updateAndDeployMetadata() {

        // 更新対象のカスタムメタデータ型レコードを取得する
        List<Metadata.Metadata> components = Metadata.Operations.retrieve(
Metadata.MetadataType.CustomMetadata, new List<String> { 'TestMeta__mdt.ReportName' });

        // CustomMetadataクラス インスタンスに割り当てる
        Metadata.CustomMetadata customMetadataRecord = (Metadata.CustomMetadata) components.get(0);

        // 対象のカスタムフィールド名と更新後の値を設定する
        Metadata.CustomMetadataValue customField = new Metadata.CustomMetadataValue();
        customField.field = 'CustomDefinition__c';
        customField.value = 'サンプルレポート';
        customMetadataRecord.values.add(customField);

        // DeployContainer に追加する
        Metadata.DeployContainer mdContainer = new Metadata.DeployContainer();
        mdContainer.addMetadata(customMetadataRecord);

        // デプロイメントのためにキューに追加する  ※callbackのインスタンス化はこのクラスを指定
        ADEV_CTRL_EditCustomMetadataType callback = new ADEV_CTRL_EditCustomMetadataType();
        Metadata.Operations.enqueueDeployment(mdContainer, callback);

    }

    // カスタムメタデータの非同期リリースが完了するとコールされる
    public void handleResult(Metadata.DeployResult result, Metadata.DeployCallbackContext context) {
        if(result.status == Metadata.DeployStatus.Succeeded)
        {
            //success
            System.debug(' ===>'+ result);
        }else{
            //not success
            System.debug(' ===> fail '+ result);
        }
    }

}

メソッド呼び出しは特別なことはなく、一般的な呼び出し方法と同じです。

ADEV_CTRL_EditCustomMetadataType target = new ADEV_CTRL_EditCustomMetadataType();
target.updateAndDeployMetadata();

なお、他のオブジェクトの更新と同じトランザクションで呼び出すとエラーになりますので、
トランザクションを分けるか、単独で実行する必要があります。

Salesforce公式HELP:DML 操作で同時に使用できない sObject

実行結果

更新前の値:ReportExample

更新後の値:サンプルレポート

参考サイト

Stack ExchangeというQ&Aサイトの投稿を参考にしています。
外部サイト:Update Custom Metadata with Apex in my org

Salesforce開発者ガイド:
セキュリティに関する考慮事項
実行ガバナと制限

まとめ

カスタムメタデータ型のカスタム項目の値をApexから更新する方法を解説しました。
一般ユーザーが設定画面を操作できないまま、Apexからカスタムメタデータ型を更新できないか、
ということを調査していましたが結果は不可ということのようです。
しかし、今後の開発で参考になることがあるかもしれません。
もし参考になれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次