---
sourceDocument: Xanadu API リファレンス
sourceDocumentLink: https://servicenow-prod.fluidtopics.net/r/ja-JP/xanadu/api-reference

 Release :

    - xanadu

ft:locale :

    - ja-JP

ft:publication_title :

    - Xanadu API リファレンス

ft:clusterId :

    - crapiref

bundleId :

    - crapiref

workflow :

    - Creator


---

# オプション - スコープ対象、グローバル

# オプション - スコープ対象、グローバル {#ariaid-title1}

* リリースバージョン: Xanadu
* 
* 更新日 2024年08月01日
* 
* ![](https://www.servicenow.com/docs/portal-asset/ico-clock) 所要時間：14分

Optional API は、GlideQuery、Stream、または GlideRecord API によって返される単一のレコードとやり取りします。当該の API が存在しない場合も同様です。null または未定義のクエリー結果を処理することでエラーになりにくいスクリプトを作成します。

Optional オブジェクトは以下の方法で取得できます。  
* 以下に挙げる GlideQuery クラス内のメソッドから Optional オブジェクトを返します。詳細については、「[GlideQuery](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GlideQueryGlobalAPI "GlideQuery スクリプトインクルードは、サーバーサイドスクリプトからレコードデータに対して CRUD 操作を実行するための GlideRecord API の代替です。")」を参照してください。
  * [getBy()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-getBy_O_O "クエリの基準となる一連の名前と値のペアに基づいて、単一のレコードを含むオプションのオブジェクトを返します。名前と値のペアごとに「=」演算子を想定します。")
  * [get()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-get_S_O "クエリから単一のレコードを返します。")
  * [insert()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-insert_O_O "レコードを挿入し、そのレコードを含むオプションのオブジェクトを返します。")
  * [insertOrUpdate()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-insertOrUpdate_O_O "既存のレコードを更新するか、まだ存在しない場合は新しいレコードを挿入します。")
  * [update()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-update_O_O "定義された条件に一致する既存のレコードを更新します。")
  * [selectOne()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-selectOne_S "指定されたフィールドを含む Optional オブジェクトとしてクエリの結果を返します。")
  * [avg()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-avg_S "指定された数値フィールドの集計平均を返します。")
  * [max()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-max_S "指定されたフィールドの集計最大を返します。")
  * [min()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-min_S "指定されたフィールドの集計最小を返します。")
  * [sum()](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GQ-sum_S "指定された数値フィールドの集計合計を返します。")
  {#OptionalGlobalAPI__ul_bgr_bhl_4mb}
* Stream クラス内の [find()](https://servicenow-prod.fluidtopics.net/Fwsec3N9HR51D6IDogqYuQ#Stream-find_F "述語関数に一致する Stream オブジェクトの最初のレコードまたはアイテムを返します。述語関数が指定されていない場合、このメソッドはストリーム内の最初のレコードまたはアイテムを返します。") メソッドから Optional オブジェクトを返します。Stream の詳細については、「[Stream](https://servicenow-prod.fluidtopics.net/Fwsec3N9HR51D6IDogqYuQ#StreamGlobalAPI "Stream API は、レコードなどのアイテムのストリームとやり取りするためのメソッドを提供します。例えば、forEach() メソッドを使用して、GlideQuery API によって返されるストリーム内の各レコードのステータスを更新できます。") API」を参照してください。
* 必要に応じて、[lasy()](https://servicenow-prod.fluidtopics.net/ebxdhN2~wupaDD_hW~vnuQ#Optional-lazy_F "新しい Optional オブジェクトを返します。オブジェクトには、レコードが入っているのではなく、コードで要求された場合にのみ呼び出されるレコードを取得する関数が入っています。") メソッドを使用して Optional の値を生成します。
{#OptionalGlobalAPI__ul_d3q_3dl_4mb}

これらのメソッドは静的であり、クラスのインスタンスを必要としません。  
* [lazy()](https://servicenow-prod.fluidtopics.net/ebxdhN2~wupaDD_hW~vnuQ#Optional-lazy_F "新しい Optional オブジェクトを返します。オブジェクトには、レコードが入っているのではなく、コードで要求された場合にのみ呼び出されるレコードを取得する関数が入っています。")
* [of()](https://servicenow-prod.fluidtopics.net/ebxdhN2~wupaDD_hW~vnuQ#Optional-of_A "指定された値を Optional オブジェクト内にラップします。たとえば、GlideRecord クエリーの結果を Optional オブジェクトでラップすることで、関連するメソッドを使用できます。")
* [empty()](https://servicenow-prod.fluidtopics.net/ebxdhN2~wupaDD_hW~vnuQ#Optional-empty_S "空の Optional オブジェクトを返します。このメソッドを Else 節で使用して、結果を返さない可能性があるクエリーを処理します。")
{#OptionalGlobalAPI__ul_jpq_2px_5mb}

これらの静的メソッドは、[GlideRecord](https://servicenow-prod.fluidtopics.net/DKnkjnu3r0c8j~e5s2NNhg#c_GlideRecordScopedAPI "スコープ付き GlideRecord API はデータベース操作に使用されます。") などの単一の値を返す API で使用できます。

スコープ対象またはグローバルのサーバー側スクリプトで、Optional API を使用します。この API には GlideQuery \[com.sn_glidequery\] プラグインが必要です。

## 実装 {#OptionalGlobalAPI__section_wqk_wwv_wmb}

この API は、メソッド呼び出しが連鎖していて、各メソッドが前のメソッドで返された結果に基づいて構築されるビルダーパターン。メソッドを使用してクエリの属性を定義します。メソッドは、ターミナルメソッド (クエリ結果を返すメソッド) を呼び出すまで実行されないため、クエリを実行する前にクエリの要件を定義できます。 内の [GlideQuery](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GlideQueryGlobalAPI "GlideQuery スクリプトインクルードは、サーバーサイドスクリプトからレコードデータに対して CRUD 操作を実行するための GlideRecord API の代替です。") および [Stream](https://servicenow-prod.fluidtopics.net/Fwsec3N9HR51D6IDogqYuQ#StreamGlobalAPI "Stream API は、レコードなどのアイテムのストリームとやり取りするためのメソッドを提供します。例えば、forEach() メソッドを使用して、GlideQuery API によって返されるストリーム内の各レコードのステータスを更新できます。") API と連動します。

クエリが単一のレコードを返す場合、システムは Optional オブジェクトに結果をラップします。クエリがレコードのストリームを返す場合、システムは Stream オブジェクトに結果をラップします。これらのオブジェクトを使用すると、各 API で一連のメソッドを使用して結果を管理できます。

たとえば、この スクリプトはタスクテーブルでクエリを実行し、レコードを優先度別にグループ化して、合計再アサイン回数が 4 を超える各優先度を返します。{#OptionalGlobalAPI__code-ex-desc}  

    var query = new global.GlideQuery('task')
        .where('active', true) //Returns new GlideQuery object with a "where" clause.
        .groupBy('priority') //Returns new GlideQuery object with a "group by" clause.
        .aggregate('sum', 'reassignment_count') //Returns new GlideQuery object with a "sum(reassignment_count)" clause.
        .having('sum', 'reassignment_count', '>', 4) //Returns new GlideQuery object with a "having reassignment_count > 4" clause.
        .select() //Returns a stream of records wrapped in a Stream object.  
        .forEach(function (priority){ //Terminal method in the Stream class that executes the query and returns the result. 
          gs.info("Priority " + priority.group.priority + ": " + priority.sum.reassignment_count + " reassignments");
        });

出力:

    Priority 1: 11 reassignments
    Priority 3: 6 reassignments
    Priority 5: 5 reassignments

## ターミナルメソッド {#OptionalGlobalAPI__section_dcn_52g_ymb}

パフォーマンス上の理由から、クエリーはターミナルメソッドを呼び出すときにのみデータをフェッチします。Optional クラスのターミナルメソッドは次のとおりです。  
* [get()](https://servicenow-prod.fluidtopics.net/ebxdhN2~wupaDD_hW~vnuQ#Optional-get "Optional オブジェクト内のレコードを返します。クエリがレコードを返さない場合はエラーをスローします。")
* [orElse()](https://servicenow-prod.fluidtopics.net/ebxdhN2~wupaDD_hW~vnuQ#Optional-orElse "クエリーが結果を返さない場合に、Optional オブジェクト内にデフォルト値を追加します。")
* [ifPresent()](https://servicenow-prod.fluidtopics.net/ebxdhN2~wupaDD_hW~vnuQ#Optional-ifPresent_F "Optional オブジェクト内のレコードに関数を適用します。Optional オブジェクトにレコードが含まれていない場合、関数は実行されません。")
* [isEmpty()](https://servicenow-prod.fluidtopics.net/ebxdhN2~wupaDD_hW~vnuQ#Optional-isEmpty "Optional オブジェクトが空の場合に true を返します。")
* [isPresent()](https://servicenow-prod.fluidtopics.net/ebxdhN2~wupaDD_hW~vnuQ#Optional-isPresent "Optional オブジェクトに値が含まれているかどうかを確認します。")
{#OptionalGlobalAPI__ul_z2v_tgg_ymb}

## Optional - empty(文字列 reason) {#ariaid-title2}

空の Optional オブジェクトを返します。このメソッドを Else 節で使用して、結果を返さない可能性があるクエリーを処理します。
注:  
このメソッドは静的です。このメソッドを使用するためにクラスのインスタンスは必要ありません。
{#Optional-empty_S__table_xj5_k1l_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| reason | 文字列 | オプション。空の Optional オブジェクトで Optional.get() が呼び出されたときにログに表示される理由。 |
[表 : 1. パラメーター]

{#Optional-empty_S__table_xj5_k1l_4mb} {#Optional-empty_S__table_yj5_k1l_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| オプション | 単一のレコードを操作するために使用されるオブジェクト。 |
[表 : 2. 返される内容]

{#Optional-empty_S__table_yj5_k1l_4mb}  
この例では、クエリーが結果を返さない場合に空の Optional オブジェクトを生成する方法を示します。

    var now_GR = new GlideRecord('task');
    now_GR.addQuery('approval', 'not requested'); 
    now_GR.query();
    var optional;
    if (now_GR.next()) {
    optional = Optional.of(now_GR.getUniqueValue());
    } else {
        optional = Optional.empty("no results");
    }

    gs.info(optional.get());

出力：

    NiceError: [2020-08-26T23:23:37.402Z]: get() called on empty Optional: no results

## Optional - filter(関数 predicate) {#ariaid-title3}

述語関数 (単一の値を受け取って true または false を返す関数) を、Optional オブジェクト内のレコードに適用します。関数が true を返す場合、このメソッドは Optional レコードをそのまま返します。関数が false を返す場合は、空の Optional オブジェクトを返します。
{#Optional-filter_F__table_qyn_g1l_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| predicate | 関数 | Optional オブジェクト内の値に適用する述語関数。ブーリアン値を返す必要があります。 |
[表 : 3. パラメーター]

{#Optional-filter_F__table_qyn_g1l_4mb} {#Optional-filter_F__table_ryn_g1l_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| オプション | 単一のレコードを操作するために使用されるオブジェクト。 |
[表 : 4. 返される内容]

{#Optional-filter_F__table_ryn_g1l_4mb}  
この例では、Optional の結果にフィルター関数を適用する方法を示します。

    var filteredQuery = new global.GlideQuery('sys_user')
        .getBy({ sys_id: 'f682abf03710200044e0bfc8bcbe5d38' }, ['phone'])
        .filter(function (user) {
            return phoneRegex.test(user.phone);
        });

## Optional - flatMap(関数 fn) {#ariaid-title4}

Optional オブジェクトを返す関数をクエリーの結果に適用します。このメソッドを使用して、1 つ目のクエリーの結果を用いて 2 つ目のクエリーを実行します。
{#Optional-flatMap_F__table_nrd_tgf_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| fn | 関数 | Optional オブジェクトを返したクエリーの結果に適用する関数。 |
[表 : 5. パラメーター]

{#Optional-flatMap_F__table_nrd_tgf_4mb} {#Optional-flatMap_F__table_ord_tgf_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| オプション | 単一のレコードを操作するために使用されるオブジェクト。 |
[表 : 6. 返される内容]

{#Optional-flatMap_F__table_ord_tgf_4mb}  
この例は、前のクエリーの結果に基づいてユーザーテーブルのクエリーを実行する方法を示しています。

    new global.GlideQuery('alm_asset')
        .whereNotNull('owned_by')
        .selectOne('owned_by')
        .flatMap(function (asset) {
            return new global.GlideQuery('sys_user')
                .getBy({ sys_id: asset.owned_by }, ['first_name', 'last_name', 'company.name'])
        })
        .ifPresent(GQ.jsonDebug);

出力：

    {
      "sys_id": "46d59205a9fe198101d603f5de37bfa3",
      "first_name": "John",
      "last_name": "Bohnhamn",
      "company": {
        "name": "ACME North America"
      }
    }

## Optional - get() {#ariaid-title5}

Optional オブジェクト内のレコードを返します。クエリがレコードを返さない場合はエラーをスローします。
{#Optional-get__table_px4_5gf_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| なし |   |   |
[表 : 7. パラメーター]

{#Optional-get__table_px4_5gf_4mb} {#Optional-get__table_qx4_5gf_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| 任意 | Optional オブジェクト内のレコード。値が null または未定義の場合は、エラーがスローされます。 |
[表 : 8. 返される内容]

{#Optional-get__table_qx4_5gf_4mb}  
この例は、単一のレコードの値を取得する方法を示しています。

    var value = new global.GlideQuery('sys_user')
        .selectOne('first_name') //Returns the result of the query inside an Optional object
        .get(); //Calls Optional.get() on the Optional object

    gs.info(JSON.stringify(value));

出力：

    {
       "first_name":"fred",
       "sys_id":"005d500b536073005e0addeeff7b12f4"
    }

## Optional - ifPresent(関数 fn) {#ariaid-title6}

Optional オブジェクト内のレコードに関数を適用します。Optional オブジェクトにレコードが含まれていない場合、関数は実行されません。
{#Optional-ifPresent_F__table_n55_21l_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| fn | 関数 | Optional オブジェクト内のレコードに適用する関数。 |
[表 : 9. パラメーター]

{#Optional-ifPresent_F__table_n55_21l_4mb} {#Optional-ifPresent_F__table_o55_21l_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| なし |   |
[表 : 10. 返される内容]

{#Optional-ifPresent_F__table_o55_21l_4mb}  
この例は、値が存在する場合にその値を出力する方法を示しています。

    var user = new global.GlideQuery('sys_user')
        .where('sys_id', 'f682abf03710200044e0bfc8bcbe5d38')
        .selectOne('zip')
        .ifPresent(function (user) {
          gs.info('Zip Code: ' + user.zip);
        });

## Optional - isEmpty() {#ariaid-title7}

Optional オブジェクトが空の場合に true を返します。
{#Optional-isEmpty__table_yhd_b1l_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| なし |   |   |
[表 : 11. パラメーター]

{#Optional-isEmpty__table_yhd_b1l_4mb} {#Optional-isEmpty__table_zhd_b1l_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| ブーリアン | クエリーの結果に値が含まれているかどうかを示すフラグ。 有効な値： * true：クエリーが null または未定義を返します。 * false：クエリーが値を返します。 {#Optional-isEmpty__ul_htd_wcs_smb} |
[表 : 12. 返される内容]

{#Optional-isEmpty__table_zhd_b1l_4mb}  
この例では、クエリーの結果が空かどうかを確認する方法を示します。

    var checkEmpty = new global.GlideQuery('sys_user')
        .where('last_name', 'Barker')
        .selectOne()
        .isEmpty();

    gs.info(checkEmpty);

出力：

    true

## Optional - isPresent() {#ariaid-title8}

Optional オブジェクトに値が含まれているかどうかを確認します。
{#Optional-isPresent__table_icx_c1l_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| なし |   |   |
[表 : 13. パラメーター]

{#Optional-isPresent__table_icx_c1l_4mb} {#Optional-isPresent__table_jcx_c1l_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| ブーリアン | クエリーの結果に値が含まれているかどうかを示すフラグ。 有効な値： * true：クエリーが値を返します。 * false：クエリーが null または未定義を返します。 {#Optional-isPresent__ul_htd_wcs_smb} |
[表 : 14. 返される内容]

{#Optional-isPresent__table_jcx_c1l_4mb}  
この例では、クエリーで結果が返されるかどうかを確認する方法を示します。

    var checkPresent = new global.GlideQuery('sys_user')    
       .where('last_name', 'Luddy')
       .selectOne('first_name')
       .isPresent();

    gs.info(checkPresent);

出力：

    true

## Optional - lazy(関数 lazyGetFn) {#ariaid-title9}

新しい Optional オブジェクトを返します。オブジェクトには、レコードが入っているのではなく、コードで要求された場合にのみ呼び出されるレコードを取得する関数が入っています。
このメソッドを使用して、値が必要になるまでその値の取得を遅らせます。これは、遅いソースから値を要求する際に、不必要にコードの速度を低下させたくない場合に行います。そうでない場合は、[GlideQuery](https://servicenow-prod.fluidtopics.net/RcspbEr5LZgw4kDXNxORuQ#GlideQueryGlobalAPI "GlideQuery スクリプトインクルードは、サーバーサイドスクリプトからレコードデータに対して CRUD 操作を実行するための GlideRecord API の代替です。") および [Stream](https://servicenow-prod.fluidtopics.net/Fwsec3N9HR51D6IDogqYuQ#StreamGlobalAPI "Stream API は、レコードなどのアイテムのストリームとやり取りするためのメソッドを提供します。例えば、forEach() メソッドを使用して、GlideQuery API によって返されるストリーム内の各レコードのステータスを更新できます。") の API を使用すれば Optional オブジェクトを返すことができます。  
注:  
このメソッドは静的です。このメソッドを使用するためにクラスのインスタンスは必要ありません。
{#Optional-lazy_F__table_edm_lwj_5mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| lazyGetFn | 関数 | クエリーの結果として単一のレコードを返す関数。例： var userGr = new GlideRecord('sys_user'); |
[表 : 15. パラメーター]

{#Optional-lazy_F__table_edm_lwj_5mb} {#Optional-lazy_F__table_fdm_lwj_5mb__entry__2}

| タイプ | 説明 |
|-|-|
| オプション | `Optional<result>` という形式のクエリーの結果を含むオブジェクト。 |
[表 : 16. 返される内容]

{#Optional-lazy_F__table_fdm_lwj_5mb}  
この例では、GlideRecord クエリーに基づいて Optional オブジェクトを取得する方法を示します。

    var userOptional = global.Optional.lazy(function () {
        var userGr = new GlideRecord('sys_user');
        userGr.setLimit(1);
        userGr.query();
        return userGr.next() ? userGr.getUniqueValue() : null;
    });

    gs.info(userOptional);

出力：

    Optional<005d500b536073005e0addeeff7b12f4>

## Optional - map(関数 fn) {#ariaid-title10}

関数をクエリーの結果に適用します。
{#Optional-map_F__table_zkh_rgf_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| fn | 関数 | クエリーの結果に適用する関数。 |
[表 : 17. パラメーター]

{#Optional-map_F__table_zkh_rgf_4mb} {#Optional-map_F__table_alh_rgf_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| オプション | 関数によって更新されたクエリーの結果を `Optional<result>` という形式で含むオブジェクト。 |
[表 : 18. 返される内容]

{#Optional-map_F__table_alh_rgf_4mb}  
この例は、値を大文字に変換する関数をクエリーの結果に適用する方法を示しています。

    var value = new global.GlideQuery('sys_user')
        .whereNotNull('first_name')
        .selectOne('first_name')
        .map(function (user) {
    	       return user.first_name.toUpperCase();
        });

    gs.info(value);

出力：

    Optional<ABEL>

## Optional - of(任意 value) {#ariaid-title11}

指定された値を Optional オブジェクト内にラップします。たとえば、GlideRecord クエリーの結果を Optional オブジェクトでラップすることで、関連するメソッドを使用できます。
注:  
このメソッドは静的です。このメソッドを使用するためにクラスのインスタンスは必要ありません。
{#Optional-of_A__table_yhw_n1l_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| value | 任意 | Optional オブジェクト内の値。 |
[表 : 19. パラメーター]

{#Optional-of_A__table_yhw_n1l_4mb} {#Optional-of_A__table_zhw_n1l_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| オプション | `Optional<value>` の形式で渡された値を含むオブジェクト。 |
[表 : 20. 返される内容]

{#Optional-of_A__table_zhw_n1l_4mb}  
この例では、GlideRecord クエリーに基づいて Optional オブジェクトを生成する方法を示します。

    var now_GR = new GlideRecord('task');
    now_GR.addQuery('approval', 'not requested'); 
    now_GR.query();
    var optional;
    if (now_GR.next()) {
    optional = Optional.of(now_GR.getUniqueValue());
    } else {
        optional = Optional.empty("no results");
    }

    gs.info(optional.get());

出力：

    00c269162d761010f87708b56757cbb3

## Optional - orElse(任意 defaultValue) {#ariaid-title12}

クエリーが結果を返さない場合に、Optional オブジェクト内にデフォルト値を追加します。
{#Optional-orElse__table_wl3_zzk_4mb__entry__3}

| 名前 | タイプ | 説明 |
|-|-|-|
| defaultValue | 任意 | クエリーが結果を返さない場合に Optional オブジェクト内に追加する値。 |
[表 : 21. パラメーター]

{#Optional-orElse__table_wl3_zzk_4mb} {#Optional-orElse__table_xl3_zzk_4mb__entry__2}

| タイプ | 説明 |
|-|-|
| 任意 | クエリーが結果を返さない場合に Optional オブジェクト内に追加する値。 |
[表 : 22. 返される内容]

{#Optional-orElse__table_xl3_zzk_4mb}  
この例は、クエリーが正しくない場合でも値を返す方法を示しています。

    var user = new global.GlideQuery('sys_user')
        .get('1234', ['first_name', 'last_name'])
        .orElse({ first_name: 'Default', last_name: 'User' });

    gs.info(JSON.stringify(user))

出力：

    {
       "first_name":"Default",
       "last_name":"User"
    }


