Zapierの使い方とよく使うZapのテクニックまとめ

# 基本情報
Zapierは自動化支援サービスで多くの自動化をノーコードで実現することができます。5,000以上のアプリケーションと統合しており、用意されたActionを設定するだけで統合しているアプリと連携できます。

Zapierでは`Zap`というワークフローを作成します。`Zap`は`Trigger`と`Action`で構成されます。詳しい内容は後述していきます。

# Zapを作成する
Zapierにログインし左のメニューの「+ Create Zap」を押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/a93370d0-0dec-1e0e-89c8-c9ac33d15670.png" width=30%>

Zapの作成・編集画面が立ち上がるので、ここでZapを構築していきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/d787b7c0-eb17-45f7-f3bd-1adcc2115822.png" width=80%>

前述したようにZapは`Trigger`と`Action`から構成されます。まずZapを実行する`Trigger`を設定します。
例えば毎月1日にSlackにメッセージを送信するとします。その場合`Trigger`は`Schedule`で`Action`は`Slack integrations`を使用します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/6d3efd51-1391-b352-3350-6f594f199b85.png" width=80%>

各`Trigger`と`Action`のテストが通ると`Publish`が押せるようになるので、`Publish`を押下してZapを公開します。


# 公開したZapの実行結果を見る
公開したZapの実行結果は、左のメニューのZap Historyからから見ることができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/14543608-150d-7f1d-4c1d-0a4bcdc09e1c.png" width=30%>

Zapごとに実行結果がまとまっていて各実行結果はログと一緒に見ることができて、どこで失敗したのかなども追いやすくなっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/f7e54693-8b01-7e23-cc99-ccd0cfda9b80.png" width=70%>

# よく使うTriger/Action
## Trigger
統合されたアプリのトリガー以外のものでよく使うのを紹介します。

### Schedule
スケジュールでZapが実行されるトリガーです。

#### Event
|Event|　|
|---|---|
|Every Hour|毎時　|
|Every Day|毎日　|
|Every Week|毎週　|
|Every Month|毎月　|

各イベントごとに必要なものは曜日な日にち、時間を設定できます。

[Schedule by Zapier Integrations](https://zapier.com/apps/schedule/integrations)

### Webhooks by Zapier
Webhookにより実行されるトリガーです。こちらは有料コンテンツとして提供されています。

#### Event
|Event|　|
|---|---|
|Retrieve Poll|　URLのポーリング監視をするトリガー|
|Catch Raw Hook|下記の`Catch Hook`とほとんど同じ内容だがリクエストの解析をせず、最大2MBまでの制約あり（使いどろこ分からず）|
|Catch Hook|Zapierが指定するURLへのWebhookでPOST/PUT/GETが対象|

[Webhooks by Zapier](https://zapier.com/apps/webhook/integrations)

GitHub Webhookを用いた事例を紹介しましたので、実際の設定方法が知りたい方は下記記事を参考にしてください。

https://qiita.com/_asa08_/items/5454af8a52f73fe784c5


## Action
#### Filter
条件によりZapの継続を制御します。

|Filter|　　| 　|
|---|---|---|
|(Text) Contain|　(Text) Does not contain　|　　|
|(Text) Exactly matches|　(Text) Does not exactly matches　|　　|
|(Text) Is in|　(Text) Is not in|　　|
|(Text) Starts with|　(Text) Does not starts with |　　|
|(Text) Ends with|　(Text) Does not ends with　|　　|
|(Number) Greater than|　(Number) Lees than　|　　|
|(Date/time) After|　(Date/time) Before　|　(Date/time) Equals　|
|(Boolean) Is true|　(Boolean) Is false　|　　|
|Exists|　Does not Exists　|　　|

#### Webhooks by Zapier
Triggerでも出てきましたが、ActionではAPIをリクエストするのに使用します。ZapierでのAPIリクエストはこの`Webhooks by Zapier`と後述の`Code by Zapier`を使用する2つの方法があります。

使いわけやハマったポイントは後続の項「ハマるポイント」に記載します。

|Event|
|---|
|Custom Request|　
|GET|
|POST|　
|PUT|　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/928f7969-0276-0a01-1145-85aff9aa32c9.png" width=70%>

EventにはGET/POST/PUTの3つが用意されていますが、それ以外もCustom Requestで設定できます。ほとんど設定することは変わらないので、どちらを使っても問題ないかと思います。

#### Code by Zapier
Zapier上で`JavaScript`または`Python`のコードを書いて処理を行うことができます。Triggerでも利用できますが、今のところTriggerで必要としたことはないのでActionのみの紹介としました。

|Event|　Description　|
|---|---|
|JavaScript|Node10以上を使用します　|
|Python|Python3.7を使用します　|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/533849f8-e9e0-4487-73dc-0e24dec5e830.png" width=70%>

コード内で使用したいデータは`Input Data`に設定しておく必要があります。`Code`の部分に実装をし、後続のフローで使用したいデータは`output`に構造体の配列として記載します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/44e43f2b-c6ed-587a-398f-4e2df56c5498.png" width=70%>

inputData.keyNameまたはinputData['keyName']

#### Paths
Zapの処理を条件により分岐させることができます。分岐はZapにつき1つのみ設定することができます。

画像のサンプルではAとBの2つの分岐ですが、分岐を増やすこともできます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/5f6f7de2-9daa-f6b9-9f7e-d0c0d97a3db7.png" width=70%>

# ハマるポイント
### APIリクエストに使用するWebhook by Zapierのレスポンス
#### レスポンスデータの扱い方
`Webhook by Zapier`を使ってAPIをリクエストした場合、レスポンスの使い方が独特になります。

jsonでこの形でレスポンスが帰ってきた場合
```json
[
  {  
    "name": "taro"
    "gender": "men"
  }
  {  
    "name": "jiro"
    "gender": "men"
  }
  {  
    "name": "hanako"
    "gender": "woman"
  }
]
```

`Webhook by Zapier`で出力されたデータは各項の配列として扱われます。

```json
"name": ["taro", "jiro", "hanako"]
"gender": ["men", "men", "woman"]
```

なので`jiro`の性別を取得したい場合は`name`から`jiro`のインデックスを出して、`gender`からそのインデックスの値を取得する必要があります。
これは結構ネックなポイントでした。

#### レスポンスデータのマッピング

レスポンス全体が配列になっている場合、配列データとして全てを取得できませんでした。これは追々改善されるのではないかと思いますが、現時点でこのようなレスポンスのAPIを利用したい場合は`Code by Zapier`でリクエストするのが良いと思います。

レスポンスがこのように配列になっている場合、配列の１番目のデータしかアウトプットで取得できません。
```json
[
  {
    "name": "taro"
  },
  {
    "name": "jiro"
  }
]
```

### スプレッドシートの行の削除
[Google Sheets Integrations](https://zapier.com/apps/google-sheets/integrations)では`Delete Spreadsheet Row`がありますが、これはその行のデータを削除してくれるのみで、行自体の削除はしてくれません。
そのため表のようにデータを管理していた場合、歯抜けの表になってしまうため注意が必要です。

# まとめ
Zapierはノーコードでできることが多く、エンジニア以外の人が自動化を実現するにはかなり有用なサービスだと思います。細かい部分は結局コードを書くのですが、それでも量はすごく少なくて済みます。これからも活用していきたいです。