様々なプログラムを参照してきましたが、なかなか思ったようにいきません。
よろしくお願い致します。
■実現したいこと
レコード再利用した際に、そのレコードを最新版と判断できるよう、再利用元のレコードのカウンター(フィールド名:最新判定(文字列))を0に変更したい。
1.新規作成時に最新判定に1が入力される
2.管理番号の重複は無し
■現在の状況
再利用レコードの保存ボタンを押しても、詳細画面に戻らないが保存はされている
再利用元レコードの最新判定は1のまま変化なし
(() => {
‘use strict’;
kintone.events.on(‘app.record.create.submit.success’, (event) => {
const teisyutu = event.record[‘提出回数’][‘value’];
const app = kintone.app.getid();
var kanri = (event.record[“管理番号”][“value”])?parseInt(event.record[“管理番号”][“value”]):0;
kanri = kanri-1;
query = 管理番号 = ${kanri}
;
var params = {app: app,
query: query,
}
if(teisyutu > 1){ //新規レコード追加時は実行しない
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’,
params).then(function(resp) {
var record = kintone.app.record.get();
resp.record.record[‘最新判定’].value = 0;
kintone.app.record.set(record);
});
};
});
})();
詳細画面に戻らないのは
const app = kintone.app.getid();
この部分でエラーが起きているためです。アプリIDを求めるにはgetid()ではなくgetId()です。
エラー情報等はこちら からコンソールを確認することができるので、エラーが出るか等を参考にされると良いでしょう。
回答頂きありがとうございます。
レコード詳細画面に戻らない現象は解消されました。
しかし、再利用元のレコードは変化をさせることができず、エラー表示が遅れて出てきます。
■エラー表示
Uncaught (in promise) Error: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received
■コード
(() => {
'use strict';
// レコード再利用ボタンで編集、保存成功後に適用
kintone.events.on('app.record.create.submit.success', (event) => {
const teisyutu = event.record['提出回数']['value'];
const app = kintone.app.getId();
var kanri = (event.record["管理番号"]["value"])?parseInt(event.record["管理番号"]["value"]):0;
kanri = kanri-1;
var query = '管理番号 = "' + kanri + '"';
var params = {app: app,
query: query,
}
if(teisyutu > 1){ //新規レコード追加時は実行しない
kintone.api(kintone.api.url('/k/v1/records', true), 'GET',
params).then(function(resp) {
resp.record.records[0].最新判定.value = 0;
kintone.app.record.set(record);
});
};
return event;
});
})();
BTS佐々木 さま
次に発生しているエラーは、処理を続けようとしているものの、先にレコード保存に伴うページ推移が発生している旨のエラーです。この辺りについては、Promiseの理解が必要です。また、そのエラーを解消しても
resp.records[0].最新判定.value = 0;
↑取得したレコードに対しての書き換えはできません。実現させるためには、レコードの更新APIが必要です。
kintone.app.record.set(record);
↑(処理がPromiseの場合)イベントハンドラ内でkintone.app.record.setは使えないのと、そもそもrecordが宣言されていないのでエラーになります。
と、まだ修正箇所があります。一つ一つ解消と思っていましたが、Promiseの理解には時間が掛かると思うので、取り敢えずは
(() => {
'use strict';
kintone.events.on([
'app.record.create.submit.success',
'mobile.app.record.create.submit.success'
], (event) => {
let appId = event.appId;
let isReuse = location.href.match(/edit\?/);
if (!isReuse) return event;
let recordId = location.href.split(/record=|&reuse/)[1];
let param = {
app: appId,
id: recordId,
record: {
'管理番号': {
value: 0
}
}
};
return kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', param).then(() => {
return event;
}).catch((error) => {
alert(JSON.stringify(error));
return event;
});
});
})();
こちらをお使い下さい。
mls-hashimoto様
コードを書いていただきありがとうございます。
自分で作ることが出来ず悔しいですが、頂いたコードを一つ一つ調べて
スキルアップできるよう努力します。
system
(system)
クローズされました:
2023 年 11 月 9 日午前 7:39
6
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。