カスタマイズの実装に困った場合は、実現したいことを分割して検討するとよいです。たとえば、本投稿の内容は以下のように分割・検討できます。
-
アプリAのレコード保存時に処理を実行
イベントハンドラーを登録するAPIを利用すると、 レコード追加画面で保存するときのイベント、 レコード編集画面で保存するときのイベント、 レコード一覧画面のインライン編集で保存するときのイベントの発生時に処理を実行できます。 -
ドロップダウンが「成約」の場合に限定
たとえば、ドロップダウンフィールドのフィールドコードが「状況」の場合は、if (event.record['状況'].value !== '成約') return event;
のように記述することで、「成約」ではない場合に処理を中断できます。 -
レコードの一部をアプリBにコピー
「コピー」が指す処理がレコード追加の場合は 1件のレコードを登録するAPI、レコード更新の場合は 1件のレコードを更新するAPIを利用してアプリBにコピーできます。このとき、 kintone REST APIリクエストを送信するAPIを利用してリクエストを送信することや、 フィールド形式に沿ったかたちでコピーする内容を指定できます。 -
コピー時にアプリBのユーザーにメール通知
kintone JavaScript APIやkintone REST APIで実現するのは難しいかと思いますので、標準機能のレコードの条件通知を活用するとよいと思います。なお、メール通知の設定も必要です。
そのうえで、アプリAでドロップダウンが「成約」の状態で保存されたレコードについて、アプリAの項目1をアプリBの項目X、項目2を項目Yにコピーしてレコードを追加するコード例は以下となります。
(() => {
'use strict';
// アプリAのレコード保存時に処理を実行
const saveEvents = [
'app.record.create.submit',
'app.record.edit.submit',
'app.record.index.edit.submit'
];
kintone.events.on(saveEvents, (event) => {
// ドロップダウンが「成約」の場合に限定
if (event.record['状況'].value !== '成約') return event;
// レコードの一部をアプリBにコピー
const body = {
app: N,
record: {
項目X: {
value: event.record['項目1'].value
},
項目Y: {
value: event.record['項目2'].value
},
コピー済: {
value: '済'
}
}
};
kintone.api(
kintone.api.url('/k/v1/record', false),
'POST',
body,
(res) => alert(`成功`),
(err) => alert(`失敗 ( ${err} ) `)
);
return event;
});
})();
なお、上記の例ではコピー先のアプリBに、ドロップダウンフィールド「コピー済」(フィールドコードも同じ)が配置済みで、項目「済」が含まれていることを前提としています。「コピー済」が「済」になったタイミングでレコードの条件通知を利用して対象ユーザーに通知するとよいと思います。
また、app: N
のN
はコピー先のアプリBのアプリIDは置き換えます。
加えて、コピーするフィールドを調整するには、const body = { ... };
内のrecord: { ... }
を以下の形式で記述します。必要に応じて フィールド形式を参照してください。
コピー先アプリのフィールドコード: {
value: event.record['コピー先アプリのフィールドコード'].value
},
最後に、kintoneカスタマイズやJavaScriptにあまり慣れていない場合は、チュートリアルから始めるとよいと思います。
(更に発展した話ですが、メールの送信は内容などいろいろカスタマイズしたい場合はsendgridつかうのもよさそうですね
ご回答ありがとうございます。
頂いた記述例を参考に動作確認したのですが、
アプリBにレコードのコピーが出来ませんせんでした。アラートも出ておりません。
基本的な間違いなどがあれば教えてください。
(() => {
‘use strict’;
// アプリAのレコード保存時に処理を実行
const saveEvents = [
'app.record.create.submit',
'app.record.edit.submit',
'app.record.index.edit.submit'
];
kintone.events.on(saveEvents, (event) => {
// ドロップダウンが「成約」の場合に限定
if (event.record['状況'].value !== '契約') return event;
// レコードの一部をアプリBにコピー
const body = {
app: 1366,
record: {
moshikomiB: {
value: event.record['moshikomiA'].value
},
keiyakuB: {
value: event.record['keiyakuA'].value
},
コピー済: {
value: '済'
}
}
};
kintone.api(
kintone.api.url('/k/v1/record', false),
'POST',
body,
(res) => alert(`成功`),
(err) => alert(`失敗 ( ${err} ) `)
);
return event;
});
})();
アラートが表示されていないということなのでkintone.api()
より前で止まっていることが考えられます。
フィールドコードや項目の名称が一致するか、各処理の前後にconsole.log()
を追加してどこまで到達しているか、開発者ツールのコンソールでエラー(赤い背景のメッセージ)が発生しているか等を確認されるとよいかと存じます。
デバッグの詳細についてcybozu developer networkに記事がありますので一例をご紹介します。