# kintoneの複数の条件によってslackの通知を変えたい

**URL:** <https://community.cybozu.dev/t/topic/7716>\
**Category:** kintone 開発相談\
**Created:** [2023 年 7 月 3 日午前 8:55 UTC](https://community.cybozu.dev/t/topic/7716 "2023-07-03T08:55:26Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Jun](https://avatars.discourse-cdn.com/v4/letter/j/8e7dd6/32.png) [@Jun](https://community.cybozu.dev/u/Jun)\
**Post date:** [2023 年 7 月 3 日午前 8:55 UTC](https://community.cybozu.dev/t/topic/7716/1 "2023-07-03T08:55:26Z")

</div>

### 実現したいこと

レコードの新規追加、また編集時に複数選択項目の値を読み込み  
それによってslackのメンション先を変えたいと思っています。

（例）  
A複数選択項目：発注／Aさんへメンション【発注依頼が来ています】  
B複数選択項目：連絡依頼／Bさんへメンション【連絡依頼が来ています】

### 問題点

一つの条件の場合は通知できるのですが、複数設定すると一番最初の条件で処理が終わってしまいます。（上記ではA選択項目の条件を通るとAさんへの通知で終わる）

Promise.allを使うといいというところまでは検索出来たのですが具体的にどこをthenで繋げばよいのか分かりません。

### 実際のコード

webhookなどの定義は省きます

```javascript
var flag = false;
(function () {
    'use strict';

    //編集時、変更があればフラグをtrueにする
    kintone.events.on('app.record.edit.change.A選択項目', function(event){
      flag = true;
    });
    kintone.events.on('app.record.edit.change.B選択項目', function(event){
      flag = true;
    });
    
    //レコード新規作成イベント
     kintone.events.on('app.record.create.submit.success', function(event){
     var rec = event.record;

	if(rec['A複数選択項目'].value == "発注"){
         var payload = {
            'text':"Aさんへのメンション：発注依頼です。" + '\n' 
            };
            return new kintone.Promise(function(resolve, reject) {        
                kintone.proxy(WEBHOOK_URL, 'POST', {}, payload, function(body, status, headers) {
                    console.log(status, body);            
                    resolve(event);
                });
            }, function(err) {
                reject('データの取得に失敗しました。');
                return;
            })
        }

	if(rec['B複数選択項目'].value == "連絡依頼"){
         var payload = {
            'text':"Bさんへのメンション：連絡成依頼です。" + '\n' 
            };
            return new kintone.Promise(function(resolve, reject) {        
                kintone.proxy(WEBHOOK_URL, 'POST', {}, payload, function(body, status, headers) {
                    console.log(status, body);            
                    resolve(event);
                });
            }, function(err) {
                reject('データの取得に失敗しました。');
                return;
            })
        }
 });
    return event;

})();

```

---

<div class="post-metadata">

**Author:** ![mls-hashimoto](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/mls-hashimoto/32/34_2.png) [@mls-hashimoto](https://community.cybozu.dev/u/mls-hashimoto)\
**Post date:** [2023 年 7 月 3 日午後 11:36 UTC](https://community.cybozu.dev/t/topic/7716/2 "2023-07-03T23:36:58Z")

</div>

Promise.allでも可能ですが、おそらくasync/awaitを使った方が簡単かもしれません（処理がもっと多ければPromise.allの方が良いです）。  
[Promiseの代わりにasync/await編](https://cybozudev.zendesk.com/hc/ja/articles/900001244323-%E7%9B%AE%E6%8C%87%E3%81%9B-JavaScript%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E4%B8%AD%E7%B4%9A%E8%80%85-%EF%BC%92-Promise%E3%81%AE%E3%81%8B%E3%82%8F%E3%82%8A%E3%81%ABasync-await%E7%B7%A8-?_ga=2.44827238.370198531.1688424570-1717530967.1688424570)が参考になると思います。

もしくは

```javascript
                    resolve(event);

```

これが「return new kintone.Promiseの処理を終了（以降の処理はせずレコードの保存処理に移る）」という意味になるので、この部分で終了させず更にもう一つの条件分岐をして書いていく方法でも可能です（①Aの場合kintone.proxyを実行し、成功時コールバック関数にBの判定とkintone.proxyを実行、成功時コールバック関数でresolve(event)／②Bの場合kintone.proxyを実行し、成功時コールバック関数でresolve(event)と2パターン記載しなければなりませんが）。その場合は[kintone.Promiseとは](https://cybozudev.zendesk.com/hc/ja/articles/215029846-kintone-Promise%E3%81%A8%E3%81%AF?_ga=2.57274216.370198531.1688424570-1717530967.1688424570)の「複数のkintone.Promiseを待ち合わせする例」が参考になると思いますが、kintone.Promise自体がPromiseの対応していない古いブラウザ（IE等）で動作させるためのもので、IEが動作しなくなった現在では非推奨です。

Promise.allで実装する場合、kintone.proxy(…)の成功時コールバック関数を省略することでPromiseが返るようになるので、これを配列に入れて

```javascript
    return Promise.all([/*Promise（kintone.proxy）の配列*/]).then(() => {
        return event;
    })  

```

と実行する必要があります。  
kintone.Promiseと一般的なPromiseは別物で、そちらを理解しておく必要があります。[kintoneにおけるPromiseの書き方の基本](https://cybozudev.zendesk.com/hc/ja/articles/360023047852-kintone%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BPromise%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AE%E5%9F%BA%E6%9C%AC?_ga=2.86764122.370198531.1688424570-1717530967.1688424570)が参考になるかもしれません。

---

<div class="post-metadata">

**Author:** ![Jun](https://avatars.discourse-cdn.com/v4/letter/j/8e7dd6/32.png) [@Jun](https://community.cybozu.dev/u/Jun)\
**Post date:** [2023 年 7 月 4 日午前 6:50 UTC](https://community.cybozu.dev/t/topic/7716/3 "2023-07-04T06:50:25Z")

</div>

橋本様、ご回答ありがとうございます。  
色々と参照してみたのですが、async/awaitを使う方式が仰る通り良さそうだったため、その方式に今修正しています！また出来次第こちらに投稿させていただきます。

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2023 年 9 月 27 日午前 6:34 UTC](https://community.cybozu.dev/t/topic/7716/4 "2023-09-27T06:34:17Z")

</div>

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。
