kintone初心者です。初歩的なことかもしれませんが、何卒よろしくお願いいたします。
■背景・実現したいこと
【対象画面】レコード追加画面保存ボタン保存実行後
アプリAにて作成したテーブル内のデータを一行づつアプリBへレコードを登録。
そして アプリBへ登録したレコードのアプリコード付きレコード番号を、
アプリAのテーブルにある該当のテーブルレコードのフィールドへ追加し登録する。
この太字にあたる部分がうまく反映されません。
エラー情報 (開発者ツールのコンソール)
エラー表示なし。
利用したソースコード
kintone.events.on('app.record.create.submit',event => {
writingNewRecods(event);
return event;
});
async function writingNewRecods(event) {
const record = event.record;
const tableRecords = record.読込データテーブル.value;
for(let i = 0; tableRecords.length > i; i++) {
// 条件対象フィールド値
const rsDate = record.入出荷日.value;
const orderNumber = record.指示番号.value;
const equipmentCode = tableRecords[i].value.確認用_機材コード.value;
const shippingLabel = tableRecords[i].value.確認用_送り状番号.value;
const equipmentName = tableRecords[i].value.確認用_機材名.value;
//取得レコード条件式
const query = `入出荷日 = "${rsDate}" and 指示番号 = "${orderNumber}" and 機材コード = "${equipmentCode}" and 送り状番号 = "${shippingLabel}"`;
const body = {
'app': barcodeReadingDataAppId,
'query': query,
}
//追加レコードパラメ
const postParams = {
'app': barcodeReadingDataAppId,
'record': {
'シリアルコード': {'value': tableRecords[i].value.確認用_シリアルコード.value},
'データ区分': {'value': record.データ区分.value},
'メモ': {'value': tableRecords[i].value.確認用_メモ.value},
'入出荷日': {'value': record.入出荷日.value},
'店舗コード_ルックアップ用': {'value': record.店舗コード_ルックアップ用.value},
'指示番号': {'value': record.指示番号.value},
'数量': {'value': tableRecords[i].value.確認用_数量.value},
'検査フラグ_0': {'value': tableRecords[i].value.確認用_検査フラグ.value},
'機材コード': {'value': tableRecords[i].value.確認用_機材コード.value},
'状態': {'value': tableRecords[i].value.確認用_状態.value},
'送り状番号': {'value': tableRecords[i].value.確認用_送り状番号.value},
}
}
try {
//「バーコード読込データ」アプリ内レコード重複チェック
await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, async resp => {
alert('check');
if(resp.records.length === 0) {
try {
//「バーコード読込データ」アプリへレコードを追加
await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, async resp => {
alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);
});
//「バーコード読込データ」へ追加したレコードのアプリ付きレコード番号を取得
await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, getResp => {
//該当するテーブル行内のFieldの値を書き換え
tableRecords[i].value.バーコード読込データのレコード番号.value = getResp.records[i].value;
});
return event;
} catch (error) {
alert('error');
return event;
}
} else {
alert(`【${equipmentName}】同内容のレコードが既に登録されているため、このレコードは登録されません。`);
event.error = '同内容のレコードが既にバーコード読込データアプリに登録されています';
return event;
}
});
} catch (error) {
}
}
}
検証等しておりませんが、気になった部分として レコードの登録(POST) は成功時のレスポンスに登録したアプリのレコード番号が含まれているので、そちらを使えば良いかと思います。
//「バーコード読込データ」アプリへレコードを追加
await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, async resp => {
alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);
tableRecords[i].value['バーコード読込データのレコード番号'].value = 'アプリコード-' + resp.id;
});
また、forループ中にreturn eventがいくつかありますが、ループ1回目で処理が終わってしまうので、ループが終わってからreturn eventをする必要があります。
mls-hashimoto 様
お世話になっております。
この度はアドバイスをいただき本当にありがとうございます。
いただきましたアドバイスに基づき、for文の最後のみにreturn eventを入れ実行してみましたが、
思った結果にはならず、エラー情報もありませんでした。
アラートを使い、POSTのレスポンスから取得したレコード番号は正常に取得は出来ているようでしたので、
tableRecords[i].value[‘バーコード読込データのレコード番号’].value = ‘OK’;
といった文字列に変えてみても、テーブル内の「バーコード読込データのレコード番号」の値は空でした。
何度も申し訳ございませんが、打開策等ございましたら教えていただけますと幸いです。
山田麻未 さま
申し訳ありません。最初の部分を見落としておりました。
kintone.events.on('app.record.create.submit', async event => {
と、kintone.events.onの関数をasyncにして、この中でwritingNewRecods関数の処理内容を直接記載するか、writingNewRecods関数そのものもPromiseを返す関数にしてawaitで実行する必要があります。
mls-hashimoto 様
早速のご回答ありがとうございます。
管理の都合上2番目の方法で修正してみましたが、
やっぱり反映されずでした・・・。
await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, resp => {
// alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);
tableRecords[i].value.バーコード読込データのレコード番号.value = appCode + resp.id;
alert(tableRecords[i].value.バーコード読込データのレコード番号.value);
});
こちらのブロック内ではバーコード読込データのレコード番号のフィールドには、確かにアプリコードの値が格納されていましたが、event return をした際に反映されてないのでしょうか?
念のため、現在のコードも見ていただけますと幸いです。
お手数をお掛けして申し訳ございませんが、よろしくお願いいたします。
kintone.events.on('app.record.create.submit',async event => {
await writingNewRecods(event);
return event;
});
async function writingNewRecods(event) {
const record = event.record;
const tableRecords = record.読込データテーブル.value;
for(let i = 0; tableRecords.length > i; i++) {
// 条件対象フィールド値
const rsDate = record.入出荷日.value;
const orderNumber = record.指示番号.value;
const equipmentCode = tableRecords[i].value.確認用_機材コード.value;
const shippingLabel = tableRecords[i].value.確認用_送り状番号.value;
const equipmentName = tableRecords[i].value.確認用_機材名.value;
//取得レコード条件式
const query = `入出荷日 = "${rsDate}" and 指示番号 = "${orderNumber}" and 機材コード = "${equipmentCode}" and 送り状番号 = "${shippingLabel}"`;
const body = {
'app': barcodeReadingDataAppId,
'query': query,
}
//追加レコードパラメ
const postParams = {
'app': barcodeReadingDataAppId,
'record': {
'シリアルコード': {'value': tableRecords[i].value.確認用_シリアルコード.value},
'データ区分': {'value': record.データ区分.value},
'メモ': {'value': tableRecords[i].value.確認用_メモ.value},
'入出荷日': {'value': record.入出荷日.value},
'店舗コード_ルックアップ用': {'value': record.店舗コード_ルックアップ用.value},
'指示番号': {'value': record.指示番号.value},
'数量': {'value': tableRecords[i].value.確認用_数量.value},
'検査フラグ_0': {'value': tableRecords[i].value.確認用_検査フラグ.value},
'機材コード': {'value': tableRecords[i].value.確認用_機材コード.value},
'状態': {'value': tableRecords[i].value.確認用_状態.value},
// '目的': {'value': },
'送り状番号': {'value': tableRecords[i].value.確認用_送り状番号.value},
}
}
try {
//「バーコード読込データ」アプリ内レコード重複チェック
await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, async resp => {
if(resp.records.length === 0) {
try {
//「バーコード読込データ」アプリへレコードを追加
await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, resp => {
// alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);
tableRecords[i].value.バーコード読込データのレコード番号.value = appCode + resp.id;
});
} catch (error) {
alert('error');
}
} else {
alert(`【${equipmentName}】同内容のレコードが既に登録されているため、このレコードは登録されません。`);
event.error = '同内容のレコードが既にバーコード読込データアプリに登録されています';
}
});
} catch (error) {
alert(error);
}
}
return event;
}
山田麻未 さま
またしても勘違いしておりました。申し訳ありません。
awaitを使ってAPIを実行する場合、成功時のコールバック関数に続きの処理を記載するのではなく、同期的に記載する必要があります(コールバックに続きの処理を書かなくていいように作られたものがasync/awaitです)。
await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, async resp => {
if(resp.records.length === 0) {
try {
//「バーコード読込データ」アプリへレコードを追加
await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, resp => {
// alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);
tableRecords[i].value.バーコード読込データのレコード番号.value = appCode + resp.id;
});
} catch (error) {
alert('error');
}
} else {
alert(`【${equipmentName}】同内容のレコードが既に登録されているため、このレコードは登録されません。`);
event.error = '同内容のレコードが既にバーコード読込データアプリに登録されています';
}
});
↓
let get = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body);
if (get.records.length === 0) {
let add = await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParam);
tableRecords[i].value.バーコード読込データのレコード番号.value = appCode + add.id;
} else {
alert(`【${equipmentName}】同内容のレコードが既に登録されているため、このレコードは登録されません。`);
event.error = '同内容のレコードが既にバーコード読込データアプリに登録されています';
// tableRecords[i].value.バーコード読込データのレコード番号.error = 'エラー内容' の方が分かりやすいかもしれません。
}
mls-hashimoto 様
この度はご教授いただき本当にありがとうございます。
mls-hashimoto様に教えていただいた通りに修正いたしましたところ、
期待通りの結果になりました。
また理解しきれていなかったasync/awaitの使い方も、以前よりかなり理解することが出来ました。
本当に、本当にありがとうございます。
system
(system)
クローズされました:
8
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。