ログインユーザーの最新レコードのレコードID取得方法について

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

レコードの作成時に一番最近に作成したレコードのサブテーブルの内容を

初期値として格納したいと思っています。

そのためにはログインユーザーの最新レコードIDの取得が必要だと思っていますが

その方法がわかりません

どなたかご教授お願いします。

OKADAさん
cstapの瀧ヶ平です

現状公式の機能でそういったものはないようなので、レコードログ保存用のアプリを用意し、kintoneの全体カスタマイズJavaScriptにて、“app.record.create.submit.success” イベント時にレコードのレコードの作成のログをそちらに登録し、レコードの作成時にはそのアプリからユーザーの最新の作成レコードを取得して格納するような方法で実装するほかなさそうです。

 

参考になりますでしょうか

瀧ヶ平さん。

ご返信ありがとうございます。

 

難しそうなので別のロジックを組んで対応したいと思います。

 

ありがとうございました。

また何かありましたらよろしくお願い致します。

OKADAさん

実現なさりたいのは、

 ログインしたユーザーごとに、そのユーザーが最後に作ったレコードの、特定のサブテーブルを新しいレコードにコピーしたい

ということでしょうか?

それであれば、レコード追加時に、作成日時またはレコードidの降順でレコードをGETして、その1レコード目の内容を新しいレコードにコピーすればいいかと思います。そうすれば別アプリを作らなくてもできる気がします

milkyway0307さん

ご返信ありがとうございます。

 

金曜日に、milkyway0307さんの提示していただいた方法を思いついて

ちょうど今、その実装方法について考えていたところです。

 

(function() {
‘use strict’;

kintone.events.on(‘app.record.create.show’, function(event) {
// 行の作成
var newRow1 = createValue_(‘作業項目’, ‘作業内容’);

// Table名:作業テーブルに初期値を定義する
event.record.作業テーブル.value = [
newRow1,
];
return event;
});
//反映
function createValue_(number,text) {
return {
‘value’: {
‘作業項目’: {
‘type’: ‘SINGLE_LINE_TEXT’,
‘value’: text
},
‘作業内容’: {
‘type’: ‘SINGLE_LINE_TEXT’,
‘value’: text
}
}
};
}

/*
//ログインユーザー取得
var user = kintone.getLoginUser();
//ログインユーザーの報告日の降順に並び替え処理
Name in (" USER", LOGINUSER()) order by 報告日 desc’;
*/

})();

 

現状このような状況です。

取得してきたサブテーブルの内容をnewRow1に格納してcreateValue_で反映させるという感じです。

(今は生データをnewRow1に入れています)

これでレコード作成したらnewRow1の中身がサブテーブルに反映されているのであとはコメントアウトしている部分に追記をして情報を取得し、newRow1に格納すれば完成。だと思っています。

kintone.apiについてまだよくわかっていない状態なのでわかるようであれば、ご教授をお願い致します。

OKADAさま

APIでGETする処理はこれから組むのですね。「作業テーブル」の内容を、「作成日時」ではなく「報告日」の降順で、ログインユーザーが最後に作成したレコードをコピーするということでよろしいですか?

そして、「作業テーブル」には、「作業項目」「作業内容」というフィールドがある、ということでよろしいですか?

milkyway0307さん

 

その通りです。

報告日の降順で、作業テーブルには「作業項目」「作業内容」というフィールドがあります。

OKADA様

kintoneのフォームでは、デフォルトで「作成日時」「作成者」というフィールドが用意されていますが、それを使わずに「報告日」「Name」というフィールドを用意しているのか、これらのフィールドのフィールドコードを「報告日」「Name」に設定されているのか、どちらでしょうか?

OKADA様

サンプルコードをご提供します。

細かいことかも知れませんが、kintoneで自動設定される「作成日時」「作成者」を基準にした方がいいと思い、そちらを参照するようにしています。そのフィールド名を「報告日」「Name」とされているのであれば、以下のコードでもその部分は修正してご利用ください。もっとも、日時フィールド、ユーザー選択フィールドをそれぞれ指定すればそれはそれで動くと思いますが、ユーザーが改変できるフィールドを使うのは、プログラムを作成する側が想定しない操作をされるとエラーになる可能性もあります。

ここでご紹介しているコードでは、ログインユーザーが「作成者」である「作成日時」が最新の1件のレコードを抽出した上で、その「作業テーブル」フィールドをコピーして登録しています。

ひとつ注意しなければいけないのは、kintone.apiは非同期リクエストなので、kintone.apiでGETをするとapp.record.create.showイベントのほうが先に終わってしまい、せっかく得られたデータをデフォルトとして保存できないということです。そのため、ここではXMLHttpRequestによる同期リクエストを使っています。

(function() {
"use strict";

kintone.events.on('app.record.create.show',function(event){
//アプリIDの取得
var appId = kintone.app.getId();
//ログインユーザーが「作成者」になっている、最新のレコード1件を抽出するクエリ
var query = '作成者 in (LOGINUSER()) order by 作成日時 desc limit 1';
//URLのクエリパラメータを作ります
//参考資料:https://cybozudev.zendesk.com/hc/ja/articles/202331474
var params = '?app=' + appId + '&query=' + encodeURIComponent(query);
var url = kintone.api.url('/k/v1/records') + params;

//XMLHttpRequestによる同期リクエスト
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send(null);

//取得したデータがrespに入ります
var resp = JSON.parse(xhr.responseText);
 //取得したデータがあれば、その最初のレコードをrefRecordとしておきましょう
//(もっとも、クエリのlimitを1件にしているので、2つ以上のレコードはないはずですが)
if (resp.records.length>0){
var refRecord = resp.records[0];
//recordは、これから追加しようとしているレコードです。
var record=event.record;
//refRecordの「作業テーブル」にデータがあれば、それをrecordにコピーします。
if (refRecord['作業テーブル'].value.length>0){
record['作業テーブル'].value=refRecord['作業テーブル'].value;
}
}
return event;
});

})(); // End of function

 

milkyway0307さん

サンプルコードのご提供ありがとうございます。

 

頂いたコードを基にkintone.apiの学習、アプリの作成を頑張っていこうと思います

 

ありがとうございました。

また何かありましたらその際はよろしくお願い致します。