# スマートフォンでの現在時刻入力について

**URL:** <https://community.cybozu.dev/t/topic/1669>\
**Category:** kintone 開発相談\
**Created:** [2023 年 6 月 16 日午前 1:24 UTC](https://community.cybozu.dev/t/topic/1669 "2023-06-16T01:24:52Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Legacy\_Account465](https://avatars.discourse-cdn.com/v4/letter/l/82dd89/32.png) [@Legacy\_Account465](https://community.cybozu.dev/u/Legacy_Account465)\
**Post date:** [2023 年 6 月 16 日午前 1:24 UTC](https://community.cybozu.dev/t/topic/1669/1 "2023-06-16T01:24:52Z")

</div>

スマートフォンのレコード閲覧画面にて作業開始ボタンを作成し、クリック後に作業実績のテーブル内に作業開始日付フィールドに現在の時刻を自動入力する。 ただし、作業開始フィールドの最終行が本日あるいは空白の場合は同行を現在時刻に更新。本日以前の場合は、行を追加し現在時刻を更新する。

上記のコードを考えていますがうまくいきません。

どこが間違えているのでしょうか？

(function() {  
&nbsp; ‘use strict’;

&nbsp; // 作業開始ボタンを作成  
&nbsp; var startButton = document.createElement(‘button’);  
&nbsp; startButton.textContent = ‘作業開始’;  
&nbsp; startButton.addEventListener(‘click’, handleStartButtonClick);

&nbsp; // レコードの詳細画面に作業開始ボタンを追加  
&nbsp; kintone.events.on(‘app.record.detail.show’, function(event) {  
&nbsp; &nbsp; var record = event.record;  
&nbsp; &nbsp; var table = record[‘作業実績’].value;

&nbsp; &nbsp; var startDateFieldCode = ‘作業開始日付’;

&nbsp; &nbsp; if (table && table.length \> 0) {  
&nbsp; &nbsp; &nbsp; var lastRecord = table[table.length - 1];

&nbsp; &nbsp; &nbsp; // 最終行の作業開始日付フィールドが本日もしくは空白の場合、同行を更新  
&nbsp; &nbsp; &nbsp; if (!lastRecord[startDateFieldCode].value || isToday(lastRecord[startDateFieldCode].value)) {  
&nbsp; &nbsp; &nbsp; &nbsp; updateStartDateTime(lastRecord, startDateFieldCode);  
&nbsp; &nbsp; &nbsp; } else {  
&nbsp; &nbsp; &nbsp; &nbsp; // 最終行の作業開始日付フィールドが本日以前の場合、新しい行を追加  
&nbsp; &nbsp; &nbsp; &nbsp; addNewRecord(startDateFieldCode);  
&nbsp; &nbsp; &nbsp; }  
&nbsp; &nbsp; } else {  
&nbsp; &nbsp; &nbsp; // テーブルが空の場合、新しい行を追加  
&nbsp; &nbsp; &nbsp; addNewRecord(startDateFieldCode);  
&nbsp; &nbsp; }

&nbsp; &nbsp; // 作業開始ボタンをフィールドに追加  
&nbsp; &nbsp; var fieldElement = kintone.app.record.getFieldElement(startDateFieldCode);  
&nbsp; &nbsp; if (fieldElement) {  
&nbsp; &nbsp; &nbsp; fieldElement.appendChild(startButton);  
&nbsp; &nbsp; }  
&nbsp; });

&nbsp; // 作業開始日付を更新する関数  
&nbsp; function updateStartDateTime(record, startDateFieldCode) {  
&nbsp; &nbsp; var startDateTime = moment().format(‘YYYY-MM-DDTHH:mm:ssZ’);  
&nbsp; &nbsp; record[startDateFieldCode].value = startDateTime;  
&nbsp; &nbsp; kintone.app.record.set(record);  
&nbsp; }

&nbsp; // 新しい行を追加する関数  
&nbsp; function addNewRecord(startDateFieldCode) {  
&nbsp; &nbsp; var startDateTime = moment().format(‘YYYY-MM-DDTHH:mm:ssZ’);  
&nbsp; &nbsp; var newRecord = {};  
&nbsp; &nbsp; newRecord[startDateFieldCode] = { value: startDateTime };  
&nbsp; &nbsp; kintone.app.record.get().record[‘作業実績’].value.push(newRecord);  
&nbsp; &nbsp; kintone.app.record.set(kintone.app.record.get());  
&nbsp; }

&nbsp; // 日付が本日かどうかを判定する関数  
&nbsp; function isToday(date) {  
&nbsp; &nbsp; var today = moment().format(‘YYYY-MM-DD’);  
&nbsp; &nbsp; return date === today;  
&nbsp; }

&nbsp; // 作業開始ボタンがクリックされた時の処理  
&nbsp; function handleStartButtonClick() {  
&nbsp; &nbsp; // 作業開始ボタンがクリックされたときの処理をここに記述する（必要に応じて実装）  
&nbsp; }  
})();

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1177](https://avatars.discourse-cdn.com/v4/letter/l/77aa72/32.png) [@Legacy\_Account1177](https://community.cybozu.dev/u/Legacy_Account1177)\
**Post date:** [2023 年 6 月 16 日午前 3:09 UTC](https://community.cybozu.dev/t/topic/1669/2 "2023-06-16T03:09:21Z")

</div>

レコード閲覧画面は閲覧するための画面なので、kintoine.app.record.get()やkintone.app.record.set()ではレコードを書き換えることができません（今回の実装に関係ないですがモバイル版ならイベント指定も全てmobile.app.record…と書かなければなりません）。

閲覧画面（detail.show）でレコードを書き換える場合、[1件のレコードを更新する](https://cybozu.dev/ja/kintone/docs/rest-api/records/update-record/)等のREST APIでなければなりません。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account465](https://avatars.discourse-cdn.com/v4/letter/l/82dd89/32.png) [@Legacy\_Account465](https://community.cybozu.dev/u/Legacy_Account465)\
**Post date:** [2023 年 6 月 16 日午前 11:45 UTC](https://community.cybozu.dev/t/topic/1669/3 "2023-06-16T11:45:45Z")

</div>

ありがとうございます。

レコード編集画面の場合も作成してみましたが

うまく動作しません。どのが悪いのでしょうか？

(function() {  
&nbsp; “use strict”;

&nbsp; var mySpaceFieldButton = document.createElement(“button”);  
&nbsp; mySpaceFieldButton.id = “my\_space\_field\_button”;  
&nbsp; mySpaceFieldButton.innerHTML = “作業開始”;  
&nbsp; mySpaceFieldButton.onclick = function() {  
&nbsp; &nbsp; var tableFieldCode = “作業実績\_0”; // 作業実績のテーブルフィールドコード  
&nbsp; &nbsp; var startDateFieldCode = “作業開始”; // 作業開始日付フィールドコード

&nbsp; &nbsp; var record = kintone.mobile.app.record.get();  
&nbsp; &nbsp; var table = record.record[tableFieldCode].value;

&nbsp; &nbsp; var lastRow;  
&nbsp; &nbsp; if (table && table.length \> 0) {  
&nbsp; &nbsp; &nbsp; lastRow = table[table.length - 1];  
&nbsp; &nbsp; &nbsp; var lastStartDate = lastRow[startDateFieldCode].value;

&nbsp; &nbsp; &nbsp; if (lastStartDate && moment(lastStartDate).isSameOrBefore(moment(), “day”)) {  
&nbsp; &nbsp; &nbsp; &nbsp; // 最終行が空白もしくは本日の場合、最終行を更新  
&nbsp; &nbsp; &nbsp; &nbsp; lastRow[startDateFieldCode].value = moment().format(“YYYY-MM-DDTHH:mm”);  
&nbsp; &nbsp; &nbsp; } else {  
&nbsp; &nbsp; &nbsp; &nbsp; // 最終行が本日以前の場合、新しい行を追加  
&nbsp; &nbsp; &nbsp; &nbsp; var newRow = {};  
&nbsp; &nbsp; &nbsp; &nbsp; newRow[startDateFieldCode] = {  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value: moment().format(“YYYY-MM-DDTHH:mm”)  
&nbsp; &nbsp; &nbsp; &nbsp; };  
&nbsp; &nbsp; &nbsp; &nbsp; table.push(newRow);  
&nbsp; &nbsp; &nbsp; }  
&nbsp; &nbsp; } else {  
&nbsp; &nbsp; &nbsp; // テーブルが存在しない場合は何もしない  
&nbsp; &nbsp; &nbsp; return;  
&nbsp; &nbsp; }

&nbsp; &nbsp; kintone.mobile.app.record.set(record);  
&nbsp; &nbsp; alert(“作業開始！保存を押してください！”);  
&nbsp; };

&nbsp; kintone.events.on([“mobile.app.record.create.show”, “mobile.app.record.edit.show”], function(event) {  
&nbsp; &nbsp; var spaceElement = kintone.mobile.app.getHeaderSpaceElement();  
&nbsp; &nbsp; spaceElement.appendChild(mySpaceFieldButton);  
&nbsp; });  
})();

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1177](https://avatars.discourse-cdn.com/v4/letter/l/77aa72/32.png) [@Legacy\_Account1177](https://community.cybozu.dev/u/Legacy_Account1177)\
**Post date:** [2023 年 6 月 17 日午前 5:03 UTC](https://community.cybozu.dev/t/topic/1669/4 "2023-06-17T05:03:13Z")

</div>

gri\_gri33 さま

以下3点が気になりました。

1. 

```
    lastRow = table[table.length - 1];

```

↓

```
    lastRow = table[table.length - 1].value;

```

サブテーブル内フィールドは「record[①’サブテーブルのフィールドコード’].value[②インデックス番号].value[③’サブテーブル内フィールドのフィールドコード’].value」となります。次の行で「lastRow[startDateFieldCode].value」と書いてあるので、②と③の間のvalueが抜けていることになります。

&nbsp;

1. 

```
      var newRow = {};
      newRow[startDateFieldCode] = {

```

↓

```
      var newRow = {
value: {}
};
      newRow.value[startDateFieldCode] = {

```

1.と同じ理由でvalueが足りていないようです。

&nbsp;

1. 

```
        newRow[startDateFieldCode] = {
          value: moment().format("YYYY-MM-DDTHH:mm")
        };

```

↓

```
      newRow.value[startDateFieldCode] = {
type: 'DATETIME',
          value: moment().format("YYYY-MM-DDTHH:mm")
        };

```

サブテーブルにpush()で行を追加するためには、フィールドの値（value）だけでなく、フィールドのタイプ（type）も必要です。そして、同じ行内に他のフィールドがある場合、それら全てのフィールドを指定する必要があります。

例として、作業開始（日時フィールド）とは別に備考（文字列1行フィールド）がある場合

```
          newRow.value[startDateFieldCode] = {
            type: 'DATETIME',
            value: moment().format("YYYY-MM-DDTHH:mm")
          };
newRow.value['備考'] = {
type: 'SINGLE_LINE_TEXT',
value: 'フィールドの値'
};

```

もしくは

```
        newRow.value = {
           [startDateFieldCode]: {
            type: 'DATETIME',
          value: moment().format("YYYY-MM-DDTHH:mm")
},
'備考': {
type: 'SINGLE_LINE_TEXT',
value: 'フィールドの値'
}
          };

```

といった形にする必要があります。

同じことが書いてありますが[こちらの記事](https://yourkinlife.com/kintone-customize-javascript-subtable/#index_id3)が参考になると思います。また、フィールドのタイプを知りたい場合は[フィールド形式](https://cybozu.dev/ja/kintone/docs/overview/field-types/#field-type)のページに掲載されています。

&nbsp;

以下は実装後の話になりますが「同じ行内に他のフィールドがある場合、それら全てのフィールドを指定する必要がある」と書いた通り、フォームの設定でサブテーブル内フィールドを増やしたり減らしたりした場合はコードも書き換えなければなりません。  
慣れてくればフィールドの増減は関係なく動き続けるコードを書くこともできます（フォーム情報を取得したり、1行目のデータを使ったり等）が、まずは理屈を覚えるためにもフィールド全て書いてみるのをおすすめします。

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2023 年 9 月 27 日午前 6:41 UTC](https://community.cybozu.dev/t/topic/1669/5 "2023-09-27T06:41:21Z")

</div>

クローズされました: 2023 年 9 月 27 日午前 6:41 UTC

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