kintoneアプリストアの営業支援パックを使ってkintone Promise を実装してみる

kintoneアプリストアで提供されている営業支援パックを使って、kintone Promiseを実装してみました。
できるだけそのまま動くような資料にしたいと思います。

#概要
- 営業支援パックについてはこちらをご覧下さい。https://jp.cybozu.help/k/ja/user/basic/sales_pack.html
- 案件管理アプリに顧客番号フィールドを追加して、顧客番号の入力をトリガーにして顧客情報と活動履歴を取得し表示します。
- changeイベントとPromiseの使い方のサンプルになっています。

#アプリの準備
- kintoneアプリストアから営業支援パックを追加します。
- 案件管理アプリにフィールドを追加します。フィールドコードは"顧客番号"とします。
<img width="575" alt="スクリーンショット 2018-10-14 20.40.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/831aa48d-aeb5-e1ba-9774-b31b4f04ebce.png">

- 案件管理アプリにサブテーブルを追加します。
<img width="862" alt="スクリーンショット 2018-10-14 19.52.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/28f93995-35ab-1fd1-a719-223136dce118.png">
- tbレコード番号は数値フィールド
- tb対応日時は日時フィールド
- tb対応内容は文字列１行
- tb商談メモは文字列複数です。（どれもフィールドコードはフィールド名と同じ）

#サンプルコード

```javascript
(function() {
    "use strict";
    // 新規レコード詳細画面にて、フィールド値のchangeイベントで発火
    kintone.events.on('app.record.create.change.顧客番号', function(event) {
        console.log(event);
        let changes = event.changes;
        console.log(changes.field.value);

        // 処理A： 顧客管理アプリから情報を取得する処理
        let getDataA = new kintone.Promise(function(resolve, reject) {
            // 顧客データを取得する
            let body = {
                "app": 100, // 顧客管理アプリのID
                "id": changes.field.value
            };
            console.log(body);
            kintone.api(kintone.api.url('/k/v1/record', true), 'GET', body, function(resp){ resolve(resp) });
        });

        // 処理B： 顧客管理アプリから情報を取得する処理
        let getDataB = new kintone.Promise(function(resolve, reject) {
            // 顧客データを取得する
            let body = {
                "app": 101, // 活動履歴アプリのID
                "query": "顧客管理レコード番号_関連レコード一覧紐付け用 = " + changes.field.value,
                "fields": ["$id", "対応日時", "対応内容", "商談メモ"],
                "totalCount": true
            };
            console.log(body);
            kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, function(resp){ resolve(resp) });
        });

        // 上記の２つの処理を繋げて実行
        kintone.Promise.all([getDataA, getDataB]).then(function(results) {
            console.log(results);
            // 処理Aの結果を取得
            let result1 = results[0];
            console.log(result1);
            // 処理Bの結果を取得
            let result2 = results[1];
            console.log(result2);

            // 案件管理アプリのレコードオブジェクトを取得
            let obj = kintone.app.record.get();
            console.log(obj);
            // 案件管理アプリのレコードを更新
            obj.record['顧客名'].value = result1.record['顧客名'].value;
            console.log(result2.records.length);
            for (let i = 0, len = result2.records.length; i < len; i++) {
                console.log(result2.records[i].$id.value);
                if (i+1 < len) {
                    let newRow = {
                        value: {
                            tbレコード番号: {type: "NUMBER", value: undefined},
                            tb商談メモ: {type: "MULTI_LINE_TEXT", value: undefined},
                            tb対応内容: {type: "SINGLE_LINE_TEXT", value: undefined},
                            tb対応日時: {type: "DATETIME", value: undefined}
                        }
                    };
                    obj.record.Table.value.push(newRow);
                }
                obj.record.Table.value[i].value['tbレコード番号'].value = result2.records[i].$id.value;
                obj.record.Table.value[i].value['tb商談メモ'].value = result2.records[i]['商談メモ'].value;
                obj.record.Table.value[i].value['tb対応内容'].value = result2.records[i]['対応内容'].value;
                obj.record.Table.value[i].value['tb対応日時'].value = result2.records[i]['対応日時'].value;
            }
            kintone.app.record.set(obj);
            console.log("処理完了！");
            console.log(obj);
            // changesイベントではPromiseをリターンしない
        }).catch(function(error) {
            console.error(error);
        });
    });
})();
```
#説明
- サンプルコード中にコメントやデバッグコードを残してあります。ご確認ください。
- アプリのIDは環境に合わせて変更してください。

#参考リンク
- https://developer.cybozu.io/hc/ja/articles/204564604
- https://www.joyzo.co.jp/blog/2021
- https://www.joyzo.co.jp/blog/2433