最新時刻の取得

任意のボタンを設置し、そのボタンをクリックしたときに最新の時刻を取得したいです。

以下参考にしたのですが、ボタンをクリックしても時刻の取得ができませんでした。

参考: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 さん

ありがとうございます。
ご指摘通り修正したら、時刻をセットできました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。