Workato：Google Sheetsへ複数行を追加する（Bulkアクション不使用）

# はじめに
WorkatoでGoogle Sheetsコネクタを利用してGoogle Sheetsへ行を複数追加する際は、`Add row` を利用して1行ずつループで追加するか、`Add rows in bulk` を利用して複数行まとめて追加します。

`Add rows in bulk` を利用すれば複数行をまとめて（ループせず1タスクで）Google Sheetsへ追加できますが、このアクションを利用するには別途オプション（ETL/ELT Bulk Data Processing）契約が必要となります。

今回は、オプション契約せずにGoogle Sheetsへ複数行追加する方法について考えてみました。

# レシピ
レシピの再利用性を高めるために、Recipe functionsとして作成を進めます。
Recipe functionsとしてレシピを作成することで、サブルーチンや関数のように別のレシピから呼び出して利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f70479aa-25ab-4345-1305-a855d854b371.png)

# 設定
## トリガ
Parameter schemaを次の通り定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d5162612-4f90-8e0a-f5b8-1e512b5278f1.png)

|キー            |値                                        |
|:---------------|:-----------------------------------------|
|spreadsheet_id  |追加先のGoogle SheetsスプレッドシートID（赤枠で示した箇所）<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/27e4010d-942b-40bd-1ea9-7f309fcefeb8.png)|
|sheet           |追加先のGoogle Sheetsのシート名（赤枠で示した箇所）<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/eb36e4f2-ea10-c4b1-2f27-461d1ef1296f.png)|
|rows            |行（リスト）                                |
|└row            |行のセルの値（ `:::` をセパレータとして複数列の値をセットする）|

※スキーマ設定（JSON）
```json
[
  {
    "name": "spreadsheet_id",
    "type": "string",
    "optional": false,
    "control_type": "text",
    "label": "Spreadsheet ID",
    "hint": "Google SheetsのSpreadsheetIdを入力します。"
  },
  {
    "name": "sheet",
    "type": "string",
    "optional": false,
    "hint": "Google Sheetsのシート名を入力します。",
    "control_type": "text",
    "label": "Sheet"
  },
  {
    "name": "rows",
    "type": "array",
    "optional": false,
    "properties": [
      {
        "name": "row",
        "type": "string",
        "optional": false,
        "control_type": "text",
        "label": "Row",
        "hint": "列の値をセットします。列の区切り文字（セパレータ）は ::: を使用してください。"
      }
    ],
    "of": "object",
    "label": "Rows"
  }
]
```

## アクション
### Step 2
Rubyコネクタを追加し、次の通り定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c229079a-6ea5-dd15-e431-ecf186215e72.png)

#### Name
任意の名称

#### Input
|キー            |値                                        |
|:---------------|:-----------------------------------------|
|rows            |Step 1の `Rows` を指定し、formulaモードへ切り替えたうえで `.to_json`メソッドでJSONテキストに変換する<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/5252db03-0ffe-e2cb-79e4-80d04de551de.png)|

#### Output schema
|キー            |値                                        |
|:---------------|:-----------------------------------------|
|result          |JSONテキスト用のリスト文字列を出力する    |

#### Code
各行のセパレータやダブルクォーテーションのエスケープ処理を行いながら、JSONテキスト用のリスト文字列を生成します。

```rb
rows = parse_json(input['rows']).pluck('row')
result = ''

rows.each{|row|
  tmp = '';
  
  if ! result.blank?
    result = result + ",\n"
  end
  
  row.split(':::').each{|col|
    if tmp.blank? 
      tmp = '['
    else
      tmp = tmp + ','
    end
    tmp = tmp + '"' + col.gsub('"','\"') + '"'
  }
  tmp = tmp + ']'
  result = result  + tmp  
}

{result: result}
```

### Step3
Google Sheetsコネクタを追加し、 `Custom action` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/5705cab4-690b-0d4f-e13e-65f2e2acea89.png)

※Google Sheets APIの、[Method: spreadsheets.values.append](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append)を利用して複数行を追加します。

次の通り定義を進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0ec9048c-fd0d-769f-cdd6-2921c15d5211.png)

#### Action name
任意の名称

#### Method
POST

#### Path
以下の通り定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/1c434d74-6653-db70-da29-794be972dcae.png)

※上のイメージを文字列化したもの
```
"spreadsheets/" + <Spreadsheet ID | Step1>  + "/values/" + <Sheet | Step1>.encode_url + ":append?valueInputOption=USER_ENTERED"
```

|データピル             |説明                      |
|:----------------------|:-------------------------|
|Spreadsheet ID \| Step1 |Step1 のSpreadsheet ID <br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d845fbe4-ddef-76e7-3b5b-8d9dd4164378.png)|
|Sheet \| Step1          |Step1 のSheet <br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d196b78f-88fd-b58c-589e-e86723eb7ebc.png)|

#### Request type
Raw request body

#### Response type
JSON response

#### Input

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c83a9049-17fc-6838-5570-42db186d2552.png)

※上のイメージを文字列化したもの
```
{
  "values":  [<Result | Step2>]
}
```

|データピル             |説明                      |
|:----------------------|:-------------------------|
|Result \| Step2 |Step2 のResult<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/14898610-3af5-c9ce-d5ce-8ce017b01d40.png)|

#### Request headers
|Name            |Value                                     |
|:---------------|:-----------------------------------------|
|Content-Type    |application/json                          |

# 実行結果
作成したレシピをテスト実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/fc0d17cc-3d97-d9cc-fabd-a3cb65df3012.png)

テスト実行後、行が追加されたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f63114d5-8246-fa10-d07e-6be789fe47ef.png)

もう一度テスト実行すると、行がさらに追加されたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/695cb26a-c0aa-b83f-3769-97e63020a7d1.png)