特定のレコードを修正した場合に「変更有り」のフラグを立て、それによって通知が送られるような設定にしたいと考えています。
いくつか試したのですが、一部どうしてもうまくいかず、ご相談させてください。
■関連するレコード(フィールドコード/フィールドタイプ)
①事務局・セミナー名/文字列(1行)
②アドレス1/文字列(1行)
③受信者/ルックアップ(テーブル1)
④メールアドレス/リンク(テーブル2)
⑤計算1/計算
⑥計算2/計算
⑦情報修正/ドロップダウン ※初期値は「変更無し」、①~⑥のいずれかを変更すると「変更有り」に自動で変更されるようにしたい
※③④は同じテーブル内にはありません。
※③④を変更した際に⑦が変わらなかったため、以下を参考にして⑤⑥を作成しました。
そのため③④変更時に意図通り動作すれば、⑤⑥は不要になります。
https://jp.cybozu.help/k/ja/utility/app/tableline_count.html
■現在のソースコード
(function() {
"use strict";
kintone.events.on( ["app.record.edit.change.事務局・セミナー名","app.record.edit.change.アドレス1","app.record.edit.change.受信者","app.record.edit.change.メールアドレス","app.record.edit.change.計算1","app.record.edit.change.計算2"], function(event){
if(event.record.情報修正.value == "変更無し"){
event.record.情報修正.value = "変更有り";
}
return event;
});
})();
■問題点
①②を変更したときは、意図通り⑦が「変更有り」に変わったのですが、③~⑥を変更しても⑦はそのままになってしまいます。
どのように修正すればよいか、ご教示いただけますと幸いです。よろしくお願いいたします。
こちら に書いてある通り、ルックアップやリンク(及び計算)はchangeイベントを発生させることができません。
同じような処理をする場合、edit.submitイベントでedit.showで取得しておいた値と比較するか、APIで同じレコードを取得して比較するかが必要になるかと思います。
恐らく以下のような処理で可能です。が、変更時に通知を出したいというのは毎回の変更時でしょうか?一度でも「変更あり」で通知されたレコードは、通知条件を満たさない形(「変更あり」以外の値)で保存された後に再度通知条件を満たす形(「変更あり」)で保存しない限り通知されません(「変更あり」で通知されたレコードをedit.showイベントやchangeイベントで「変更無し」にしても、保存時に「変更あり」であれば、新たに通知条件を満たしたことにはなりません)。毎回通知を出す場合、edit.submit.successイベントまたはdetail.showイベントで「変更無し」に書き換えるAPIが必要になると思われます。
(() => {
'use strict';
let changeCheckTables = { // 左にサブテーブルのフィールドコード・右にサブテーブル上のフィールドのフィールドコード
'テーブル1': '受信者',
'テーブル2': 'メールアドレス'
};
let tables = {};
kintone.events.on('app.record.edit.show', (event) => {
let record = event.record;
Object.keys(changeCheckTables).forEach((table) => {
tables[table] = record[table];
});
return event;
});
kintone.events.on([
'app.record.edit.change.事務局・セミナー名',
'app.record.edit.change.アドレス1'
], (event) => {
let record = event.record;
record['情報修正'].value = '変更あり';
return event;
});
kintone.events.on('app.record.edit.submit', (event) => {
let record = event.record;
let isChange = Object.keys(changeCheckTables).some((table) => {
if (tables[table].value.length !== record[table].value.length) return true;
return record[table].value.some((row, index) => {
if (!tables[table].value[index].value[changeCheckTables[table]].value && !row.value[changeCheckTables[table]].value) {
return false;
} else {
return tables[table].value[index].value[changeCheckTables[table]].value !== row.value[changeCheckTables[table]].value
}
});
});
if (isChange) record['情報修正'].value = '変更あり';
return event;
});
})();
mls-hashimoto様 ありがとうございます!(以前こちらで質問させていただいた際も、mls-hashimoto様にご回答いただきました。本当にありがとうございます)
根本的な部分を見落としており、大変失礼いたしました。
一度「変更有り」になった場合は、別途契約しているgusuku Customineの定期実行タスクで「変更無し」に戻す設定にしようと考えているため、今回は該当のフィールドが変更されたときに「変更有り」に変わる設定さえできればやりたいことが実現できる状況です。
教えていただいたソースコードで、無事に問題なく動作いたしました。不勉強で、それぞれのソースコードがどういう動きをしているのかまだ理解できていないため、ひとつずつ解読して自分でも書けるように勉強を進めてまいります。
本当にありがとうございました!
system
(system)
Closed
5
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。