アプリアクションを実行して、アクション先のアプリのレコード保存成功後イベントを受けて、アクション元のレコードを更新するサンプルです。
※コードにはエラー処理などは入れてませんのであくまで参考程度にしてください。
環境
- TypeScript
動作イメージ
kintoneな人はイメージできると思いますが。。。
Aアプリ・・・アクション元
Bアプリ・・・アクション先
- Aアプリ---(アプリアクション)---> Bアプリの新規登録画面が別タブで開かれる
- Bアプリ---(いろいろ編集)--->保存--->サーバーの保存成功
- Bアプリで登録したデータをAアプリに更新登録
コード
'use strict'
interface KintoneEvent {
record: kintone.types.SavedFields;
}
class AppAction {
appId: number
recordId: number
action: number
constructor(action?: number, appId?: number, recordId?: number) {
this.action = action;
this.appId = appId;
this.recordId = recordId;
}
isAction() {
if (this.action !== null) {
return true;
} else {
return false;
}
}
}
// アプリアクションで呼ばれたレコード作成時にレコード保存成功後イベントを受けて
// 別アプリのレコードを更新する
const EVENTS = ['app.record.create.submit.success'];
kintone.events.on(EVENTS, (event: KintoneEvent) => {
// アプリアクションからの同線かを確認して、違ったらリターンする。
// https://example.cybozu.com/k/100/edit?action=1234567&app=99&record=1
const href: string = window.location.href;
const params = (new URL(href)).searchParams;
if (!params.has('action')) {
return event;
}
let appAction =
new AppAction(
Number(params.get('action')),
Number(params.get('app')),
Number(params.get('record')),
);
return new kintone.Promise((resolve) => {
// アプリアクション元のレコードを更新する
const record = event.record;
const body = {
'app': appAction.appId,
'id': appAction.recordId,
'record': {
'customerCode': {
'value': record['顧客コード'].value
}
}
};
resolve(kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', body));
})
.then(result => {
// アプリアクションの呼び出し元のウィンドウをリロードする。
const response = result;
console.log(response);
const windowOpenerRef = window.opener;
windowOpenerRef.location.reload(true);
return event;
})
.catch(error => {
console.log(error);
})
});
スクリーンショット
参考