kintoneのテーブルに対して条件に応じた都度通知を行う

# はじめに
こんにちは！
サッカー選手から転身して、kintoneカスタマイズを楽しんでいるよしきです！

突然ですが、kintoneのテーブルと通知って、とても相性悪いですよね。
今回は、テーブルに登録したユーザーに対して都度通知を行うためのJSカスタマイズを紹介します！

kintoneアドベントカレンダー12/12の記事です !!

https://adventar.org/calendars/10522

# こんな人に読んでほしい！

* テーブルを使ったアプリを構築している人
* kintoneカスタマイズ初心者
* 通知機能を強化したい人


# kintoneとは
業務のシステム化や効率化を実現するアプリが「シュシュッと」つくれるノーコードツールです！

https://kintone.cybozu.co.jp/what_is_kintone/

# 実現したいこと
プロジェクト管理アプリで発生するタスクをテーブルで管理をしたい。
そこで、タスクごとの担当者をアサインする度にその担当者へ通知を出したい！

![スクリーンショット 2024-12-11 15.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/7d8939f1-859b-7ec7-4be9-8a7898ffb65d.png)



が、、しかし！
kintoneにはこんな制約があります！
> テーブルに設定したフィールドを使用した条件を設定する場合：
テーブルのいずれかの行でフィールドの値が条件を満たしたときに通知されます。ただし、ほかの行のフィールドの値が条件をすでに満たしていた場合は、通知されません。

なんと、条件を満たす度に順次通知を出すことができないのです！！
これは困った、、

そこで、カスタマイズでちゃちゃっと実装してしまおうと考えました。
テーブルに対して条件に応じた通知を実現させます！


# 解説

## 標準機能の実装

①「タスク一覧」テーブルの外に「通知フラグ」と「レコード条件通知用」フィールドを追加します。
　また、「タスク一覧」テーブルの中に「担当者変更検知フラグ」を追加します。

![スクリーンショット 2024-12-11 14.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/9e94d7bc-b0aa-4cd6-8b2b-7b2291c6ac76.png)


②「レコード条件通知用」フィールドに対してレコード条件通知設定を行います。
これで、保存時に「通知フラグ」が"ON"の場合、「レコード条件通知用」に登録されたユーザーへ通知を出すことができます。

![スクリーンショット 2024-12-11 14.03.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/5a8c2df9-95f1-94fe-d29c-7edad5313107.png)


## カスタマイズの実装

処理の流れはこんな感じです。
1. レコード追加/編集画面にて「担当者」に値が入ったら「通知フラグ」を"ON"にする
1. レコード保存前イベントにて「担当者変更検知フラグ」が"ON"の行の「担当者」を全て「レコード条件通知用」へセットする
1. 正常に保存されると、レコード条件通知により「レコード条件通知用」に含まれるユーザーへ通知される！
1. レコード保存後イベントにて、テーブル内「担当者変更検知フラグ」と「通知フラグ」「レコード条件通知用」の値をクリアし自レコードに対して更新をかける

### サンプルコード
``` javascript


(() => {
    'use strict';

    /**
     * レコードの値編集時
    **/
    kintone.events.on([
        'app.record.create.change.担当者',
        'app.record.edit.change.担当者'
    ], (event) => {
        const record = event.record;
        const taskManagers = event.changes.row.value.担当者.value;
        if (taskManagers.length > 0) {
            event.changes.row.value.担当者変更検知フラグ.value = "ON";
        }
        return event;
    });

    /**
     * レコード保存前
    **/
    kintone.events.on([
        'app.record.create.submit',
        'app.record.edit.submit'
    ], (event) => {
        const record = event.record;
        record.タスク一覧.value.forEach(row => {
            if (row.value.担当者変更検知フラグ.value === "ON") {
                record.レコード条件通知用.value.push(...row.value.担当者.value);
                record.通知フラグ.value = "ON";
            }
        })
        return event;
    });

    /**
     * レコード保存成功後
    **/
    kintone.events.on([
        'app.record.create.submit.success',
        'app.record.edit.submit.success'
    ], async (event) => {
        try {
            const record = event.record;
            record.タスク一覧.value.forEach(row => {
                row.value.担当者変更検知フラグ.value = "OFF"
            })
            record.レコード条件通知用.value = [];
            record.通知フラグ.value = "OFF";

            const body = {
                app: kintone.app.getId(),
                id: event.recordId,
                record: {
                    タスク一覧: record.タスク一覧,
                    レコード条件通知用: { value: [] },
                    通知フラグ: { value: "OFF" }
                }
            }
            await kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body);

        } catch (error) {
            console.error(error);
        }
        return event;
    });

})();

```

# まとめ
この記事ではテーブルの通知が標準機能では柔軟に対応できない制約をカスタマイズで克服する実例を紹介しました。
このカスマイズをすることで、テーブルのデータ変更時に担当者へ確実に通知を届けることが可能になります。

この記事が皆さんのkintoneカスタマイズのヒントになれば幸いです！