kintoneのイベント内の非同期処理で取得した値をe.recordに設定する方法

kintoneのイベント内で非同期処理を実行し、その結果をレコードに反映したいです。

通常はe.record[フィールドコード].valueを書き換えてreturn e;したら値は変わりますが、非同期処理で取得した値を設定しようとするとうまく設定できません。

 

以下のやり方で一応できたのですが、あっていますか?

kintone.app.record.get()/set()は本来イベント処理の中では実行できないので、イベント処理が終わる前に非同期処理が終わった場合など、タイミングによってエラーにならないか心配です。

let newEvents = [
"app.record.create.show",
"mobile.app.record.create.show"
];
kintone.events.on(newEvents, function (e) {
let param = {
app: 10,
filelds: ["住所"],
query: "社員名 in (LOGINUSER())"
};
// 別アプリから住所を取得する
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', param, function (resp) {
// 非同期処理だと以下の処理が使えない!
//e.record["住所"].value = resp.records["住所"].value;
//return e;

// なので、以下のやり方でやる。
// 現在のレコードを取得
let records = kintone.app.record.get();

// nullだったらモバイルビューと判定
let isMobile = records === null;
// mobile用のレコード取得関数を呼ぶ
if (isMobile) records = kintone.mobile.app.record.get();
// APIから取ってきた値を設定
records.record["住所"].value = resp.records["住所"].value;

// 取得した内容を反映する
if (isMobile){
kintone.mobile.app.record.set(records);
}else{
kintone.app.record.set(records);
}

}, function (error) {
console.log(error);
});
return e;
});

T-y さん

ばっちり合っています!

 

イベントによっては Promise をサポートしており、return event できるイベントが存在します。
少しややこしいので、余裕のある時に以下の記事を読んでみてください!

https://developer.cybozu.io/hc/ja/articles/204564604

ありがとうございます。安心しました!

Promise対応のイベントですが、こちらも返答をもらった翌日に使う案件が出てきましたので非常に助かりました笑