IQ Bot のカスタムロジック 基本のキ

こんにちは。

昨日[こちらの記事](https://qiita.com/IQBotJapan/items/fab5f59230ff38a98bbd)でご紹介したAutomation AnywhereのIQ Botですが・・・

11.3.3というバージョン以降、読み取り結果に対して、
Pythonというプログラミング言語を使ってちょっとした加工ができるようになりました。

Automation Anywhereの用語では、これを「カスタムロジック」と言っています。

2020年4月3日現在の情報によると、
A2019のクラウド版にくっついているIQ Botではカスタムロジックは使えないのですが、
A2019のオンプレやV11系統のバージョンでは使えます。

# カスタムロジックはどんなときに使う？

そもそもカスタムロジックってどんなときに使うんですか？

という質問に対して、答えは色々ありますが、以下に例を挙げてみます。

| パターン| 具体例| 
|:-----------|:-------------------------------|
|パターンの決まった文字化けの修正|・東京棘問題（東京が「棘」として読み込まれるというOCRあるある）の修正<br>・YY年MM月DD日の「日」がBや0に化ける問題（これもOCRあるある）の修正|
|読み取り結果からほしい要素だけを取り出す|・「お支払金額は123円になります」から金額の123だけを取り出す<br>・「あいう銀行かきく支店」から支店名だけを取り出す<br>・1000mgから単位のmgだけを抽出|
|固定値の代入|当該グループ（※）に対して値が一意に決まる場合は、固定値を入れてしまう|
|形式の適用|YYYY年MM月DD日をYYYY/MM/DDに直す|

単純にOCRで結果を読み取るだけだと、後続処理のデータとしては汚すぎて使えない・・・

という場合に、カスタムロジックでちょこっといじってあげると、きれいなデータができたりします。

# カスタムロジックはどう使う？

フィールド項目とテーブル項目で若干使い方が違うのでそれぞれ説明します。

## フィールド項目

###フィールド項目のカスタムロジックはどこで書ける？

カスタムロジックは、IQ Botの[マッピング設定画面](https://qiita.com/IQ_Bocchi/items/2c5a6e77d6059b968a74)で書くことができます。
下図の「JA-JP:LOGIC」と書いてあるタブをクリックして・・・ （※画面を開いてもタブがない！という場合は[カスタムロジックの有効化](https://qiita.com/IQ_Bocchi/items/b75d84be6784f5fd51fb#2-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96)を行います）

![フィールド_ロジックのありか.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/65f29f33-b709-fa6a-c167-6b9dc5fa46cb.jpeg)

こんなかんじ↓でロジックを定義していきます。
![フィールド_コード例.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/c88f7395-b1fb-5598-a120-c775c33d106d.jpeg)

###フィールド項目のカスタムロジックはどう書く？

フィールド項目の場合、ひとつひとつの項目に対してそれぞれカスタムロジックを適用できます。

読み取った素の値が`field_value`という変数に入っているので、それをいじくって加工します。

```python:フィールド項目へのカスタムロジック適用例：固定値代入の場合
field_value = "代入したい値"
```

こんなかんじです。

フィールド項目は、単純な文字列操作なのでかなりシンプル。
追々、便利なコピペ用コードを公開していきたいと思います。

## テーブル項目

###テーブル項目のカスタムロジックはどこで書ける？

テーブル項目の場合、ひとつひとつの項目を見てもロジックの入力欄がありません。
![テーブル_各項目ごとにはない.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/d6df7657-410d-8fb5-483b-c83d5483dfa5.jpeg)

かわりに、テーブル全体の設定をするエリアのここ↓からロジックを設定できます。
![テーブル_ここにある.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7a8181ce-efdb-032b-c8af-5d982c614bc1.jpeg)

上記の「Ja-JP:Logic」を開いて、こんな感じ↓でロジックを書いていきます。
![テーブル_こんなかんじ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/f5b4c007-f9e7-5f27-81d7-3431b7b50b4d.jpeg)

###テーブル項目のカスタムロジックはどう書く？

テーブル項目の場合、テーブル全体の内容が`table_value`という変数に入っています。
この`table_value`は、データフレームという特殊な型に入っていて、扱うときにちょっとしたお約束があります。

それがこちら↓

```python:テーブル項目へのカスタムロジックの書き方
#表の操作をするときに必ず入れるコード（最初）
import pandas as pd
df = pd.DataFrame(table_values)

#
# この間の部分に、処理したいコードを入れていく
#

#表の操作をするときに必ず入れるコード（最後）
table_values = df.to_dict()
```

上記のコードを、個人的には「おまじないコード」と読んでいます。

おまじないコードが何をやっている処理なのか、
気になる方のために[解説記事](https://qiita.com/IQBotter/items/68d3260c8afed7d27902)も書きましたが、

「テーブル項目を処理する場合は、最初と最後におまじないコードをつける」という点さえ押さえておけば、
上記の記事はスルーしても大丈夫です。

テーブル項目は、処理コードの部分にもちょっとしたお約束があって、
Pandasに慣れてない人（※）はけっこう迷ったりすることも多いと思います。

```python:
#　※白状します。それは私です・・・
```

そんなわけで、今後しばらく私のQiitaコンテンツでは、
テーブル項目まわりの便利コード（IQ Bot触ってて迷ったり調べたりしたやつ）を
紹介していこうと思います！

# まとめ

- IQ Botでは、読み取り結果をカスタムロジックで加工することで、後続の自動処理に耐えうる品質のデータを作れるよ
- カスタムロジックは、フィールド項目とテーブル項目で適用できる範囲が違うよ
- フィールド項目の場合は、`field_value`にという変数に格納された素の読み取り結果を加工するだけなので楽勝だよ
- テーブル項目の場合は、`table_value`にという変数にデータフレームとして格納されたテーブル全体を処理するので、Pandasに慣れてない人には若干ハードル高めかも
- そんなわけで、今後はテーブル項目に対するカスタムロジックのチートシート的なのを公開していくよ

では！