レコードの再利用(追加)時に別レコードの値を編集したい

お世話になっております。

アプリ内のレコードを再利用し、レコードを追加する際の動作についてご質問があります。
以下のような動作はできますでしょうか。
①Aレコードを再利用
②再利用をクリックした際、Aレコードの文字列フィールドにある値を編集
例) ユーザー名 ⇒ ユーザー名_yyyymmdd

別アプリでユーザー名を用いてルックアップを設定しており、
レコードを保存した時点で自動更新をかけているため重複禁止にしているため
上記のように編集できないかと思っております。

何か良い案がありましたらご教示いただけますでしょうか。
よろしくお願いいたします。

y-kishi さん

レコードを保存した時点で自動更新をかけているため重複禁止

こちらのようなカスタマイズでルックアップをAPIで更新する狙いで、フォーカスされているユーザー名を入れるフィールドには重複禁止を設定している状況下で、再利用時に日付(当日?)を付加した状態で新規登録画面を立ち上げようとしているということかと思います。

_yyyymmddをどのように付加するかですが、例えば当日の日付がセットされるとすると同日中に再利用を複数行うと重複禁止にかかるところと矛盾してしまうという訳ですよね。

という認識であっていて、重複禁止にならないことを優先するとすると、付加する内容は現状のピュアな日付は難しく、付加する内容を検討するしかないと思います。現状の延長的な方法は2つくらいかなぁと思います。ひとつは、付加する内容に時刻までを入れて_yyyymmddhhmm等ににする、もうひとつは日付に自動採番の仕組みを組み合わせて、_yyyymmdd_ **** のように付加するといった感じかと思います。

ご回答ありがとうございます。

URLでご案内いただいている通りの内容で、別アプリのルックアップをAPIで更新したいと考えております。

ただ、日付を付加した状態で新規登録画面を立ち上げるのではなく、フォーカスされているユーザー名はそのまま再利用し、再利用元のレコードのユーザー名に日付を付加したいと考えております。

新規登録画面のイベントで、別レコードのフィールドの値を変更するにはどのようなスクリプトを用いればよろしいのでしょうか。

失礼しました。

よく読めてませんでした。既存のAを更新して、新しく作成するレコードが「ユーザー名」だけになる感じですね。

であれば、保存イベントのPromiseで、既存レコードの更新を挟むことで実現できると思います。

お世話になっております。

ご案内いただいたURLを参考に、Promiseオブジェクトで既存レコードの更新をしようと思いましたが

既存レコードの抽出の仕方がよく分からず、難航しております。

 

おそらく、for文を使用して既存レコードの重複しているユーザー名を抽出するのかと思いますが、そのようなjavascriptのサンプルをご教示いただけませんでしょうか。

 

大変厚かましいお願いで恐縮ですが、よろしくお願いいたします。

 

> ご案内いただいたURLを参考に、Promiseオブジェクトで既存レコードの更新をしようと思いましたが既存レコードの抽出の仕方がよく分からず、難航しております。

今どのようなコードになっていますか?

 

以前少し書かせて頂きましたが、 自動採番の仕組み (サンプルは例えば こちら )を取り入れて、GET/recordsのクエリを

 

ユーザー名 like “ユーザー名_yyyymmdd” order by ユーザー名 desc limit 1

 

で指定して、最大値を見つけるイメージです。

お世話になっております。

本件、作業の優先度変更のため後回しとなっておりました。

現在、以下のようなコードとなっております。


//kintone.apiが返すkintone.Promiseオブジェクトを利用する場合

kintone.events.on(‘app.record.create.submit’, function (event) {

var record = event.record;
var userName = record[‘user’][‘value’];

var objDate = new Date();
y = objDate.getFullYear();
m = objDate.getMonth()+1;
d = objDate.getDate();

var update = userName + y + m + d;

var masterAppId = 118;

var query = ‘user="’ + userName + ‘"’

  • ’ order by user desc limit 1’;

var params = {app: masterAppId, query: query};

kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params).then(function(resp) {

var update_rec = kintone.app.record.get();
update_rec[‘record’][‘user’][‘value’] = update;
console.log(update_rec.record);

kintone.app.record.set(update_rec);

});
});


同じユーザー名があるレコードを検索し、ヒットしたレコードに対して

「ユーザー名+yyyymdd」を付加する意図で作成しているのですが、

 

上記では再利用した、新しいレコードのユーザー名が変更されてしまいます。

 

再利用元のレコードを修正するためには、どのように記載するべきなのでしょうか。

kintone.app.record.get()/set()

は、表示中のレコードを操作する関数ですので、GETで取得した resp から得られる既存レコードのIDを指定したPUTでの更新処理が必要です。

お世話になっております。

 

最終、以下のようなコードで解決しました。

============================================

//kintone.Promiseコンストラクタを利用する場合

kintone.events.on(‘app.record.create.submit’, function (event) {

var record = event.record;
var userName = record[‘user’].value;
var userinf = record[‘seimei’].value;

var objDate = new Date();
y = objDate.getFullYear();
m = objDate.getMonth()+1;
d = objDate.getDate();
h = objDate.getHours();
mi = objDate.getMinutes();
var update = userName + y + m + d + h + mi;

// スタッフ名が重複することを確認
var masterAppId = 118;
var query = ‘user="’ + userName + '" order by user desc limit 1 ';

return new kintone.Promise(function(resolve, reject) {
var params = {app: masterAppId, query: query};

kintone.api(‘/k/v1/records’, ‘GET’, params, function(resp) {
resolve(resp);
});

}).then(function(resp) {

if (resp.records.length) {

var respId = resp.records[0].レコード番号.value;

var json1 = {
app :masterAppId,
id:respId,
record : {
user : {
value : update
}
}
};

kintone.api(‘/k/v1/record’, ‘PUT’, json1,
function(resp) {

window.alert(“レコードを更新しました”);

});

}

return event;

});
});

 

============================================

 

お手数おかけしました。

見落としていて、すみません。

 

ベストではないですが、ベターはこんな感じでしょうか。

 

kintone.events.on('app.record.create.submit', function(event) {

var record = event.record;
var userName = record['user'].value;
var userinf = record['seimei'].value;

var objDate = new Date();
y = objDate.getFullYear();
m = objDate.getMonth() + 1;
d = objDate.getDate();
h = objDate.getHours();
mi = objDate.getMinutes();
var update = userName + y + m + d + h + mi;

// スタッフ名が重複することを確認
var masterAppId = 118;
var query = 'user="' + userName + '" order by user desc limit 1 ';

return new kintone.Promise(function(resolve, reject) {
var params = {
app: masterAppId,
query: query
};

kintone.api('/k/v1/records', 'GET', params, function(resp) {
resolve(resp);
});

}).then(function(resp) {
if (resp.records.length) {
var respId = resp.records[0].レコード番号.value;
var json1 = {
app: masterAppId,
id: respId,
record: {
user: {
value: update
}
}
};
return kintone.api('/k/v1/record', 'PUT', json1);
}
}).then(function(resp) {
window.alert("レコードを更新しました");
return event;
});
});

 

PUTのところの非同期が、PUTを待たずにreturnされてしまうような感じになっていました。恐らく、この動きは以前からreturnと(今回で言う)PUTは非同期(並行)に走っても問題として顕在化しなかったと思いますが、thenでしっかり最後にreturnしようとすると、こんな感じかと。

Ryu Yamashita 様

補足いただきありがとうございます。

アプリの設定を見直したところ、 record[‘user’][‘value’];のフォーム設定で、重複禁止チェックが外れておりました・・・

ご指摘いただいた部分を加えたところ、重複禁止にチェックが入っている状態でも問題なくレコード更新がかかりました。

 

今回、別アプリでユーザー名を用いてルックアップを設定しているのですが、

値(ユーザー名)に更新がなければ別アプリへのルックアップが更新されないようでした。

 

これはkintoneの仕様という認識でよろしいのでしょうか?

> 今回、別アプリでユーザー名を用いてルックアップを設定しているのですが、

> 値(ユーザー名)に更新がなければ別アプリへのルックアップが更新されないようでした。

 

(今回の流れをちょっと忘れてしまいましたが、)ルックアップはリレーションとは異なりコピー機能ですので、コピー元でルックアップでコピーされた元の値が変更された際にもコピー先のフィールドの値は「取得」を押し直す(もしくはAPIでキーフィールドを更新する)ことをしないと、コピー先では最新の値は維持できません。

 

で、お応えになっていますでしょうか。

 

お世話になります。

ルックアップの動作について理解が深まりました。

ご回答いただきありがとうございました。