Apexを使ってメタデータAPIを操作する

\:cloud: Metadata API

# はじめに

リストビューや選択リスト（連動選択リスト）を操作する場合にはメタデータAPIを使う必要がありますが、なかなか簡単にはできないです。
調べてみるとApexから操作するための方法が紹介されています。ただし英語で書かれていることと、少々古い記事が多いので実際に設定をしようと思うとたどり着けないように感じました。（英語環境のSalesforceを日常的に使っていると、どうにかたどり着けますが、日本語環境だと直訳しても設定場所を探すのに苦労します。）

ということで、時間があれば日本語に直して、かつ実際に設定して使ってみたいと思います。

# 目次

**一番大元になる資料はこちらです。**
+ [Apex Wrapper Salesforce Metadata API Part 1](https://qiita.com/Keiji_otsubo/items/6291a4f116efb8c46efc)
+ [Apex Wrapper Salesforce Metadata API Part 2](https://qiita.com/Keiji_otsubo/items/ba39384c81794a95835d)
+ Apex Wrapper Salesforce Metadata API Part 3


+ [指定ログイン情報を使うための設定はこちらです。](https://qiita.com/Keiji_otsubo/items/43f633ae40495cf1e984)残念ながら指定ログイン情報を使うと302エラーになってしまいます。使わなくても動きますので当面あきらめます。(2020/10/31現在)


**実際の使い方のサンプルは、以下に記録しておきます。**

+ [MetadataServiceTest.cls:テストクラスの修正](https://qiita.com/Keiji_otsubo/items/f33186206ce49c1cbde7)
+ [MetadataServiceを使ってリストビューを操作する](https://qiita.com/Keiji_otsubo/items/c1877fe8c79a5d697321)


# 技術資料
+ [メタデータ API 開発者ガイド：APIリファレンス](https://developer.salesforce.com/docs/atlas.ja-jp.226.0.api_meta.meta/api_meta/meta_accountrelationshipsharerule.htm)
+ [Aura Enabledリクエストでは、セッションIDがAPI呼び出しを行うことができない](https://qiita.com/Keiji_otsubo/items/11a32bff558e49ec91bd)
+ [Bulk Move Reports or Dashboards Using the Metadata API](https://help.salesforce.com/s/articleView?id=sf.bulk_move_reports_dashboards.htm&type=5)
+ [CREATE/UPDATE SALESFORCE PICKLIST DEFINITIONS USING METADATA API](https://absyz.com/create-update-salesforce-picklist-definitions-using-metadata-api/)
+ [メタデータカバレッジ](https://developer.salesforce.com/docs/metadata-coverage/45)

# 質問から...

+ [カスタム アドレス フィールドが pageLayout の関連リストで取得されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000074qLdY)
+ [メタデータをエクセルで抽出したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ph8wn)
+ [Metadata API request failed: Cannot read properties of null (reading 'split') / INVALID_OPERATION: Server received invalid zip file, review request and try again](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X7ioQ)

:::note alert
Metadata API request failed: Cannot read properties of null (reading 'split').
:::

:::note
 I had tried the solution you suggested before as I mentioned to my question and didn't work.

In the end it seems there was also the need to uncheck the option 'Experimental: Deploy Retrieve' from VS Code settings. By doing so it works again.  
:::


+ [別組織へデータを移したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clSiq)

:::note
メタデータを取得して、別の組織でメタデータを展開すれば可能です。

私もforce cliを使って実施したことはあります。

英語ですが解説があります。ANTと有償ツールが紹介されてます。

https://www.autorabit.com/blog/how-to-migrate-metadata-from-one-salesforce-organization-to-another/

ANTとVS Studioが提案されてますね。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T437XSAR
:::

+ [メタデータ API を通じて複数のオブジェクトにフィールド履歴保持ポリシーを設定する方法は?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epPkO)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/88da562b-cb73-1732-9330-8a05ce03ffd3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7e7a9a56-33e5-1ae8-cd01-e805bd0b8ddf.png)

+ [無効なPickListValueを取得する方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajuMU)

:::note
古い投稿ですがmetadata APIでもisActive() = false が機能しないようなことが報告されていますね。 metadataでもダメとなると... やっぱりできないのかもしれません。

https://salesforce.stackexchange.com/questions/150507/describe-not-returning-inactive-picklist-values-via-api
:::