Workato：ServiceNowのバッチAPIによるレコードの追加・更新手順

# はじめに

WorkatoでServiceNowのバッチAPI（以下）を利用する場合は、ServiceNowコネクタのCustom actionで対応することになります。

https://docs.servicenow.com/ja-JP/bundle/utah-api-reference/page/integrate/inbound-rest/concept/batch-api.html

バッチAPIを利用すると、1アクションでServiceNowのレコード追加・更新の一括処理が可能なため、ServiceNowのパフォーマンス改善や、Workatoのタスク効率化等のメリットに繋がります。

ただし、Custom actionを利用するゆえに手順が複雑になり、実装の敷居も高くなります。以下では、ServiceNowのバッチAPIをによるレコード追加・更新手順について、順を追って詳細に説明を行います。


# 手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9f16a79b-d12f-daaf-769f-2697b6c0057f.png)

## Step 2

### １．Variables by Workatoコネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/661c3f04-5aad-e06a-42c0-9cb19be3d97a.png)

### ２．「Create variable」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/09c9a048-9a02-6eba-7dd3-bbae605e9ac5.png)


### ３．「Add a variable」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/36e2d915-d8c7-e3a1-2c78-7ff3e3f643c2.png)

### ４.「table」というフィールドを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/41daf7a1-7035-601c-f28f-879162bea2a7.png)

### ５．「table」フィールドに、テーブル名をセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6f44d5a4-e937-59c8-c047-97508be5574e.png)



## Step 3

### １．Variables by Workatoコネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/661c3f04-5aad-e06a-42c0-9cb19be3d97a.png)

### ２．「Create list」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c4c1c091-df09-f7e5-9e45-59845187be0a.png)

### ３．List nameに「records」と入力し、「add fields manually」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/1025cb31-5015-85bd-3ce2-f81cf916ca82.png)

### ４．適当なフィールド名を入力し、「Add field」をクリックします。

このフィールドは、後で削除されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/61396e79-c09c-190d-c2c1-76b280c82834.png)

### ５．「Edit Schema」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0d5878ef-5a6b-3b56-d41b-654ffb9c6944.png)

### ６．エディタの内容をすべて削除し、以下の内容（JSON）を貼り付け、「Update」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e84a487e-7adb-c218-bf95-82078b36ee60.png)


```json
[
  {
    "name": "sys_id",
    "type": "string",
    "optional": false,
    "control_type": "text",
    "label": "Sys ID"
  },
  {
    "name": "record",
    "type": "object",
    "optional": false,
    "properties": [
      {
        "control_type": "text",
        "label": "Location",
        "type": "string",
        "name": "location"
      },
      {
        "control_type": "text",
        "label": "Serial number",
        "type": "string",
        "name": "serial_number"
      }
    ],
    "label": "Record"
  }
]
```

※上記のようなスキーマ適用方法に関しては、以下もあわせて参考ください。

https://qiita.com/tabimoba/items/6c885809782a9c4ae137

### ７．以下の通りスキーマが生成されたことを確認し、「record」オブジェクト以下の階層に必要なフィールドを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/76d422f9-246b-2ac3-2636-da8237b1b6dd.png)

※ネストされたフィールドの設定手順は以下を参照ください。

https://qiita.com/tabimoba/items/4e4b69e87a040b8c5308

また、レコード追加の場合は、「Sys ID」フィールドは削除してください。（更新の際は「Sys ID」が必要となるため、残しておいてください）

###　８．Itemsに必要な値をセットします。

Sys IDにはService Nowのレコードごとのレコード識別子をセットします。

Recordの各フィールドには、追加あるいは更新したい値をセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a73f4e90-e5f3-4585-331c-453743675147.png)

## Step 4

### １．ServiceNowコネクタを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/504919c6-4f44-69da-6cb6-b100199cbdfd.png)

### ２．「Custom action」を追加します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/da816dc3-a7bb-7a0b-485d-7ba3f5ab50df.png)

### ３．「Setup manually」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4f3c9784-17d4-9c95-61bd-56f2cfacc983.png)


#### Action name
任意の名称

#### Method 
POST

#### Path
`/api/now/v1/batch`

#### Request type
JSON request body

#### Rsponse type
JSON response

#### Input
##### Request body parameters

以下の記事を参考に以下のJSONをコピー＆ペーストし、スキーマを生成します。

https://qiita.com/tabimoba/items/6c885809782a9c4ae137 

```json
[
  {
    "control_type": "text",
    "label": "Batch request ID",
    "name": "batch_request_id",
    "type": "string",
    "optional": false
  },
  {
    "name": "rest_requests",
    "type": "array",
    "optional": false,
    "properties": [
      {
        "name": "id",
        "type": "string",
        "optional": false,
        "control_type": "text",
        "label": "ID"
      },
      {
        "name": "exclude_response_headers",
        "type": "boolean",
        "optional": false,
        "control_type": "checkbox",
        "label": "Exclude response headers",
        "render_input": {},
        "parse_output": {},
        "toggle_hint": "Select from option list",
        "toggle_field": {
          "label": "Exclude response headers",
          "control_type": "text",
          "toggle_hint": "Use custom value",
          "name": "exclude_response_headers",
          "type": "boolean",
          "optional": false
        }
      },
      {
        "name": "headers",
        "type": "array",
        "optional": false,
        "properties": [
          {
            "name": "name",
            "type": "string",
            "optional": false,
            "control_type": "text",
            "label": "Name"
          },
          {
            "name": "value",
            "type": "string",
            "optional": false,
            "control_type": "text",
            "label": "Value"
          }
        ],
        "of": "object",
        "label": "Headers"
      },
      {
        "name": "url",
        "type": "string",
        "optional": false,
        "control_type": "text",
        "label": "URL"
      },
      {
        "name": "method",
        "type": "string",
        "optional": false,
        "control_type": "text",
        "label": "Method"
      },
      {
        "name": "body",
        "type": "string",
        "optional": false,
        "control_type": "text",
        "label": "Body"
      }
    ],
    "of": "object",
    "label": "Rest requests"
  }
]
```

上記スキーマを適用すると、次のようなスキーマが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/401b5ef4-5eec-b3ea-ccdf-395e76093e77.png)

#### Data

以下の通りセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/31cbec31-1524-19af-bb61-0ebeae424042.png)

##### Batch request ID

formulaへ切り替え、 `workato.uuid` と入力します。

##### Rest requests source list

Step3の `records` をセットします。

##### ID

formulaへ切り替え、 `workato.uuid` と入力します。

##### Exclude response headers

特に指定が無い限り「Yes」を選択します。

##### Headers

Input modeを「Fixed list」に切り替えたうえで、次の通り設定します。


###### Item #1

- Name: Content-Type
- Value: application/json

###### Item #2

- Name: Accept
- Value: application/json

##### URL

###### 追加の場合

`/api/now/v2/table/<Step 2の'table'>`と入力します。

###### 更新の場合

`/api/now/v2/table/<Step 2の'table'>/<Step 3の'Sys ID'>`と入力します。

##### Method

追加の場合は「POST」、更新の場合は「PATCH」と入力します。

##### Body

formulaへ切り替え、`<Step 3の'Record'>.to_json.encode_base64` と入力します。