任意のボタンを設置し、そのボタンをクリックしたときに最新の時刻を取得したいです。
以下参考にしたのですが、ボタンをクリックしても時刻の取得ができませんでした。
参考:Luxon を使って kintone の日付や日時フィールドのフォーマットをカスタマイズする
作成したコード
(function() {
"use strict";
kintone.events.on(['app.record.edit.show'], function(event) {
// ボタンを設置
var mySpaceFieldButton = document.createElement('button');
mySpaceFieldButton.id = 'my_space_field_button';
mySpaceFieldButton.innerHTML = 'ボタン';
mySpaceFieldButton.onclick = function() {
// 時刻を取得して格納する
const currentDate = luxon.DateTime.local();
const dateFieldCode = 'テスト時刻';
const record = kintone.app.record.get().record;
const dateFieldValue = record[dateFieldCode].value;
const dateFieldDate = luxon.DateTime.fromISO(dateFieldValue);
};
kintone.app.record.getSpaceElement('my_space_field').appendChild(mySpaceFieldButton);
});
})();
Luxon のCDNは最新バージョンを上記のスクリプトの前に登録しています
時間の取得まではできました。
試行錯誤中です。
const dt = luxon.DateTime.now();
const time = dt.toLocaleString(luxon.DateTime.TIME_SIMPLE);
console.log("time",time);
現在時刻の取得ができましたが、それをkintoneのフィールドにセットする箇所で”Uncaught TypeError: Cannot read properties of undefined”のエラーになってしまいましたが、「テスト時刻」のフィールドコードは存在します。
フィールドコードへのセット方法は以下を参照しました
参照:ユーザーにボタンを押下して時刻を登録させたい
作成したスクリプト
(function() {
"use strict";
kintone.events.on(['app.record.edit.show'], function(event) {
// ボタンを設置
var mySpaceFieldButton = document.createElement('button');
mySpaceFieldButton.id = 'my_space_field_button';
mySpaceFieldButton.innerHTML = 'ボタン';
mySpaceFieldButton.onclick = function() {
// 時刻を取得して格納する
const dt = luxon.DateTime.now(); //最新日時の取得
const time = dt.toLocaleString(luxon.DateTime.TIME_SIMPLE);
console.log("time",time);
const record = kintone.app.record.get().record; //レコード情報取得
record['record']['テスト時刻']['value'] = time; // <--- ここでエラー発生!!
kintone.app.record.set(record); // レコード情報の登録
};
kintone.app.record.getSpaceElement('my_space_field').appendChild(mySpaceFieldButton);
return event;
});
})();
recordが一つ多いようです。kintone.app.record.get()でrecordを宣言している場合は
record['record']['テスト時刻']['value'] = time;
で問題ありませんが、kintone.app.record.get().recordで宣言しているので、
record['テスト時刻']['value'] = time;
以上のようになります。
また、kintone.app.record.get().recordで宣言しているのであれば、レコードへの登録は
kintone.app.record.set({ record: record });
になります。
const recordData = kintone.app.record.get();
const record = recordData.record;
record['テスト時刻']['value'] = time;
kintone.app.record.set(recordData);
と宣言を分けた方が分かりやすいかもしれません。
以下解説ですが、取り敢えずそういう形と覚えるだけでも良いと思います。
kintone.app.record.get()で取得するものは
{
record: {
*フィールドコード*: {
value: 'フィールドの値'
}
}
}
という連想配列になっています。そのため、kintone.app.record.get()をrecordに代入すると、
record = {
record: {
*フィールドコード*: {
value: 'フィールドの値'
}
}
};
となります。そのためフィールドコードの値にアクセスするには「record.record.フィールドコード.value」と記載する必要があります(1つ目のrecordは変数、2つ目のrecordは変数内のオブジェクトのrecord)。
また、kintone.app.record.set()でレコードへ反映させるためには
{
record: {
*フィールドコード*: {
value: 'フィールドの値'
}
}
}
という形である必要があります。
宣言を分けた方が良いと言ったのは、
let recordData = kintone.app.record.get();
let record = recordData.record;
とすることで
recordData = {
record: {
*フィールドコード*: {
value: 'フィールドの値'
}
}
}
record = {
*フィールドコード*: {
value: 'フィールドの値'
}
}
となり、フィールドコードの値を変えたい場合はrecord.フィールドコード.valueでアクセスでき、レコードへ反映させたい場合はrecordDataで可能だからという理由によります。
mls-hashimoto さん
ありがとうございます。
ご指摘通り修正したら、時刻をセットできました。
system
(system)
クローズされました:
6
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。