Salesforceで関数が対応しているかを調べる方法【Tooling APIをPostmanから使う】

Salesforceは入力規則、フロー、数式項目などで関数が使えます。ただ、全ての場所で同じ関数なら必ず使えるとは限りません。経験的にはフローでは使えない関数があると思います。Tooleng APIのオブジェクトを眺めていると関数が対応しているかを確認できそうなオブジェクトの項目があります。

[Tooling API Objects/FormulaFunction](https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_formulafunction.htm)


IsAllowedInFlowContext
しかし、実際に検索するとそのような項目はないというエラーになりますね。

よく見たらVer 48以降ではFormulaFunctionAllowedTypeに変わったようです。

Removed. Indicates whether the formula function is allowed in a Flow (true) or not (false). This field is available in API versions 39.0 to 47.0. Use the FormulaFunctionAllowedType object instead in API version 48.0 and later.

今回もPostmanを使って確かめたいと思います。
PostmanからSalesforceにアクセスする方法は、以下を参考にして下さい。

+ [Postman : Salesforceで初めて使う時の処理手順](https://qiita.com/Keiji_otsubo/items/ac8571db2d836248e9f9)
+ [Postman : Salesforceで使う時の処理手順(既に一度接続した環境に対して)](https://qiita.com/Keiji_otsubo/items/6f493f98422551a946c3)
+ [Postman : Salesforceで使う時の処理手順(Salesforceの接続環境を切り替える)](https://qiita.com/Keiji_otsubo/items/ad4dc5062cdecf01b9a0)

# FormulaFunctionAllowedTypeオブジェクトの検索


[Tooling API Objects / FormulaFunctionAllowedType](https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_formulafunctionallowedtype.htm)


qのパラメータに以下を設定します。SOQL文のスペースを+で置き換えた形です。

```
select+Id,DurableId,FunctionId,Type+from+FormulaFunctionAllowedType+where+FunctionId='ABS'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/797953f2-0d15-c363-93ef-6cb14e7d2cc3.png)


検索できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/189253d4-516e-c10a-0629-06ad11d41f9f.png)


ISNEW()　を調べます

```
select+Id,DurableId,FunctionId,Type+from+FormulaFunctionAllowedType+where+FunctionId='ISNEW'
```
入力規則でしか使えないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/490e6252-6423-73a5-7d54-74c875cff3a0.png)


INCLUDE、IMAGEは検索してもないですね。小文字にしても出てこない。不思議です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/656b9dd0-db0b-b7f4-57c7-48d0acb8b8c4.png)


+ [SUBSTITUTE in screen flow with reactive input only substituting one of a character.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Qeadv)

SUBSTITUTEの使える場所をみると以下のようですが... ver 59.0

```
{
    "size": 5,
    "totalSize": 5,
    "done": true,
    "queryLocator": null,
    "entityTypeName": "FormulaFunctionAllowedType",
    "records": [
        {
            "attributes": {
                "type": "FormulaFunctionAllowedType",
                "url": "/services/data/v59.0/tooling/sobjects/FormulaFunctionAllowedType/VALIDATION-SUBSTITUTE"
            },
            "Id": "000000000000000AAA",
            "DurableId": "VALIDATION-SUBSTITUTE",
            "FunctionId": "SUBSTITUTE",
            "Type": "VALIDATION"
        },
        {
            "attributes": {
                "type": "FormulaFunctionAllowedType",
                "url": "/services/data/v59.0/tooling/sobjects/FormulaFunctionAllowedType/VISUALFORCE-SUBSTITUTE"
            },
            "Id": "000000000000000AAA",
            "DurableId": "VISUALFORCE-SUBSTITUTE",
            "FunctionId": "SUBSTITUTE",
            "Type": "VISUALFORCE"
        },
        {
            "attributes": {
                "type": "FormulaFunctionAllowedType",
                "url": "/services/data/v59.0/tooling/sobjects/FormulaFunctionAllowedType/FLOW-SUBSTITUTE"
            },
            "Id": "000000000000000AAA",
            "DurableId": "FLOW-SUBSTITUTE",
            "FunctionId": "SUBSTITUTE",
            "Type": "FLOW"
        },
        {
            "attributes": {
                "type": "FormulaFunctionAllowedType",
                "url": "/services/data/v59.0/tooling/sobjects/FormulaFunctionAllowedType/CONVERSATION_MESSAGE-SUBSTITUTE"
            },
            "Id": "000000000000000AAA",
            "DurableId": "CONVERSATION_MESSAGE-SUBSTITUTE",
            "FunctionId": "SUBSTITUTE",
            "Type": "CONVERSATION_MESSAGE"
        },
        {
            "attributes": {
                "type": "FormulaFunctionAllowedType",
                "url": "/services/data/v59.0/tooling/sobjects/FormulaFunctionAllowedType/LOYALTYFORMULA-SUBSTITUTE"
            },
            "Id": "000000000000000AAA",
            "DurableId": "LOYALTYFORMULA-SUBSTITUTE",
            "FunctionId": "SUBSTITUTE",
            "Type": "LOYALTYFORMULA"
        }
    ]
}
```

**Visualizerを試してみます**

```
var template = `
<style>
  .myTable {
    background-color : #dddbda;
  }
  .myTable th{
    width: 400px;
  }
  .myTable td{
    width: 400px;
  }
  </style>


    <table class="myTable">
        <tr>
            <th>Function</th>
            <th>Type</th>
            <th>DurableId</th>
        </tr>

        {{#each response}}
            <tr>
                <td>{{FunctionId}}</td>
                <td>{{Type}}</td>
                <td>{{DurableId}}</td>
            </tr>
        {{/each}}
    </table>
`;

const response = JSON.parse(pm.response.text())
var _ = require('lodash')
var expectedSortedOrder = _.orderBy(response.records, ['Type'],['asc']);
// Set visualizer
pm.visualizer.set(template, {
    // Pass the response body parsed as JSON as `data`
    response: expectedSortedOrder
});
```
見やすくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7960ee98-b326-8455-f27b-950b56b65755.png)



+ [フロー式に関する考慮事項](https://qiita.com/Keiji_otsubo/items/35975b42607e1485fd73)