JavaScriptでkintone上の長文から正規表現で単語を抜き出し、各フィールドに振り分ける

# 概要

kintoneでは、クラフテクス社の[データシンカー](https://datasyncer.craftex.jp/csv_zero)やクロス・ヘッド社の[メル箱](https://www.crosshead.co.jp/solution/crosslink_melbako/)など、メールの受信を感知して自動でkintoneのレコードに流入させる機能を持つプラグインはありますが、メール本文がそのまま一つのフィールドの値として存在するだけだと使いにくいことも。

:::note info
データシンカーはjson設定にて分割できるが、流入するメールの種類が複数でシステムの安定稼働を考えると、分岐せずそのまま流入させた方がいいケースもある。
:::

そこで今回は、kintoneのフィールドに入力されたテキストから情報を抽出し、他のフィールドに自動的に振り分けるJavaScriptの実装方法を紹介します。

# 事前準備

## フィールド設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/53869ece-e786-cf49-f565-86109211b6d4.png)


1. **入力元フィールド**:
   - **フィールドコード**: `inputField`

2. **スペースフィールド**:
   - **フィールドコード**: `pullOutButton`

3. **抽出したデータを格納するフィールド**:
   - **情報元**: フィールドコード `source`
   - **名前**: フィールドコード `name`
   - **電話番号**: フィールドコード `phone`
   - **メールアドレス**: フィールドコード `email`
   - **住所**: フィールドコード `address`

#### 想定データフォーマット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/f0a1c60d-0528-02b3-414a-2ba991c96274.png)

下記のようなデータが文字列（複数）フィールド
`inputField` に入力されていると仮定します:

```
情報元: ウェブサイト
名前: 山田 太郎
電話: 080-1234-5678
メール: taro@example.com
住所: 東京都渋谷区渋谷1-1-1
```

### JavaScript コードサンプル

以下のコードを kintone のカスタマイズ JavaScript として追加します。
※フィールドコードは事前に用意したものと一致させてください。

```javascript:divisionText.js
(function() {
    'use strict';

    // レコードの作成・編集画面が表示されたときに発生するイベント
    kintone.events.on(['app.record.create.show', 'app.record.edit.show'], function(event) {
        // ボタンがすでに画面上に存在するか確認し、存在する場合は追加しない
        if (document.getElementById('extractButton') !== null) {
            return event;
        }

        // 情報抽出用ボタンの生成
        const extractButton = createExtractButton();

        // ボタンの配置（指定されたスペースフィールドに追加）
        kintone.app.record.getSpaceElement('pullOutButton').appendChild(extractButton);

        // ボタンがクリックされたときの情報抽出処理
        extractButton.onclick = function() {
            extractInformationAndSetFields();
        };

        return event;
    });

    // 情報抽出用のボタンを生成する関数
    function createExtractButton() {
        const button = document.createElement('button');
        button.id = 'extractButton';
        button.innerText = '情報を抽出';
        return button;
    }

    // レコードから情報を抽出し、各フィールドに値を設定する関数
    function extractInformationAndSetFields() {
        // レコード情報の取得
        const record = kintone.app.record.get();
        const textValue = record.record.inputField.value;

        // 各情報のパターンを定義（正規表現による抽出）
        const patterns = {
            // 情報元を抽出する: 改行で終わる「情報元:」以降のあらゆる文字列
            source: /情報元:\s*(.+?)\n/,
    
            // 名前を抽出する: 改行で終わる「名前:」以降のあらゆる文字列
            name: /名前:\s*([^\n]+)\n/,
    
            // 電話番号を抽出する: 改行で終わる一般的な日本の電話番号フォーマット（数字とハイフン）
            phone: /電話:\s*(\d{2,4}-\d{2,4}-\d{3,4})\n/,
    
            // メールアドレスを抽出する: 「メール:」から始まる正当なメールアドレス
            email: /(?:メール:)\s*([^\s]+@[^\s]+)\n/,
    
            // 住所を抽出する: 改行または文末で終わる「住所:」以降のあらゆる文字列
            address: /住所:\s*(.+?)(?:\n|$)/
        };

        // 各パターンに基づいて情報を抽出し、対応するフィールドに値を設定
        for (const fieldCode in patterns) {
            const match = textValue.match(patterns[fieldCode]);
            if (match) {
                record.record[fieldCode].value = match[1];
            }
        }

        // レコードの変更を保存
        kintone.app.record.set(record);
    }

})();
```

## 結果

ぶじに動作しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/1153aad0-c80b-efa5-9f77-dd5d2e04b962.png)


# まとめ

kintoneアプリ内でのデータ抽出と整理を自動化できるようになりました。

単調なのに間違えることができない抜き出し作業がある場合に、
ぜひこの方法を試してみてください。

正規表現を適宜調整することで、
他のフォーマットにも柔軟に対応可能です。