kintoneでフィールドが特定の値に変更された時にLINEへ通知する設定とJavaScriptサンプルコード

:::note alert
悲報

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/18f26ee6-4763-0d49-b51f-39db0be95dde.png)

えぇ…記事公開から24時間も経たないうちになんというニュース…
:::

https://roboin.io/article/2024/10/07/line-terminates-line-notify-service/


# 概要
前の記事にて、kintoneのレコード保存で、
Slackへ通知する方法を記載しました。

https://qiita.com/ito_futa/items/4b6ba9b75fffd7d776b7

が、コードはほぼそのままで、
LINE Notify APIを使うことでLINEへも簡単に通知することができたので、
こちらに手順を記載していきます。

## 前準備

### LINE Notifyにログインします。

サイトは以下となります。

https://notify-bot.line.me/ja/

初めてログインするとLINEにて、LINE Notifyからトークが届いています。
確認し、通知を行いたいルームへLINE Notifyを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/d568c14a-1552-ecb7-76c6-7ecbddec0118.png)

### アクセストークンの発行

PCのLINE Notify管理画面に戻り、マイページから、
「アクセストークンの発行(開発者向け)」を選択。

すると、どのルームに対し発行するかを求められるので
先ほどのルームを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/7cd998f9-a1cd-301c-5b9c-05b2e96b40dc.png)

すると無事にアクセストークンを発行できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/fc5c5244-ce77-b956-9b75-187140379933.png)

これを用いてコードを記述します。

### 発行したアクセストークンを設定します。

## コード

`yourLineNotifyToken`に先ほどのトークンを貼り付けつつ、全体の情報を変更します。

```javascript
(function () {
    const subdomain = 'yourDomain'; // あなたのkintoneのサブドメイン
    const appId = '123'; // あなたのkintoneのアプリID
    const targetFieldCode = 'yourFieldCode'; // 監視するフィールドコード
    const specificValue = 'yourValue'; // 監視するフィールドコードの値
    const lineNotifyToken = 'yourLineNotifyToken'; // LINE Notifyのアクセストークン
    let oldValue; // 監視対象のフィールドコードの旧値を保持する変数
    // メッセージに含みたいフィールドコードIDがあれば追加で変数を定義する

    // 編集画面が表示されたときに発火するイベント
    kintone.events.on('app.record.edit.show', function (event) {
        // 監視対象のフィールドコードの旧値を取得
        oldValue = event.record[targetFieldCode].value;
    });

    // 保存ボタンが押されたときに発火するイベント
    kintone.events.on('app.record.edit.submit', function (event) {
        // 現在のフィールドの値を取得
        const currentValue = event.record[targetFieldCode].value;

        // 監視するフィールドの値が旧値から変更されていて、なおかつ指定した特定の値に等しい場合のみ、LINE通知する処理を続行する
        if (currentValue !== oldValue && currentValue === specificValue) {
            // 対象レコードのURLを取得（メッセージ用）
            const recordId = event.recordId;
            const recordUrl = `https://${subdomain}.cybozu.com/k/${appId}/show#record=${recordId}`;

            // LINEに送信するメッセージ
            const message = `フィールド ${targetFieldCode} の値が ${specificValue} に変更されました。\n対象レコード：${recordUrl}`;

            // kintone.proxyを使用してLINE Notify APIにPOSTリクエストを送信
            const body = `message=${encodeURIComponent(message)}`; // LINE NotifyはURLエンコードされた形式でメッセージを送信
            const requestOptions = {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Authorization': `Bearer ${lineNotifyToken}`
                },
                body: body
            };

            // kintone.proxyでリクエストを実行
            kintone.proxy('https://notify-api.line.me/api/notify', requestOptions.method, requestOptions.headers, requestOptions.body)
                .then(function (response) {
                    console.log('LINEへの通知に成功:', response);
                })
                .catch(function (error) {
                    console.error('LINEへの通知に失敗:', error);
                });
        }

        return event; // 処理を続行
    });
})();
```

:::note info
前回のSlackと同様に、コード内にトークンを入れるのはそれなりにリスクがあるため、
場合によっては環境変数などで行うことをオススメします
:::


### テスト

kintoneのレコード編集でぶじに通知が来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/c3b0c098-82ad-5018-1830-d9016ade98bb.png)

なお、Slackの通知と共存することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/01f44ec6-b849-aa61-1fc1-0f49565ee8e9.png)

## まとめ

基本的に通常の内容はSlackで良いと思いますが、
緊急性を要するものや重大な内容についてはLINEなど、
棲み分けをすることで対応意識に差をつけることができると思います。

内容や組織体によってどちらを使うか選んでいきましょう！