スマートフォンのレコード閲覧画面にて作業開始ボタンを作成し、クリック後に作業実績のテーブル内に作業開始日付フィールドに現在の時刻を自動入力する。 ただし、作業開始フィールドの最終行が本日あるいは空白の場合は同行を現在時刻に更新。本日以前の場合は、行を追加し現在時刻を更新する。
上記のコードを考えていますがうまくいきません。
どこが間違えているのでしょうか?
(function() {
‘use strict’;
// 作業開始ボタンを作成
var startButton = document.createElement(‘button’);
startButton.textContent = ‘作業開始’;
startButton.addEventListener(‘click’, handleStartButtonClick);
// レコードの詳細画面に作業開始ボタンを追加
kintone.events.on(‘app.record.detail.show’, function(event) {
var record = event.record;
var table = record[‘作業実績’].value;
var startDateFieldCode = ‘作業開始日付’;
if (table && table.length > 0) {
var lastRecord = table[table.length - 1];
// 最終行の作業開始日付フィールドが本日もしくは空白の場合、同行を更新
if (!lastRecord[startDateFieldCode].value || isToday(lastRecord[startDateFieldCode].value)) {
updateStartDateTime(lastRecord, startDateFieldCode);
} else {
// 最終行の作業開始日付フィールドが本日以前の場合、新しい行を追加
addNewRecord(startDateFieldCode);
}
} else {
// テーブルが空の場合、新しい行を追加
addNewRecord(startDateFieldCode);
}
// 作業開始ボタンをフィールドに追加
var fieldElement = kintone.app.record.getFieldElement(startDateFieldCode);
if (fieldElement) {
fieldElement.appendChild(startButton);
}
});
// 作業開始日付を更新する関数
function updateStartDateTime(record, startDateFieldCode) {
var startDateTime = moment().format(‘YYYY-MM-DDTHH:mm:ssZ’);
record[startDateFieldCode].value = startDateTime;
kintone.app.record.set(record);
}
// 新しい行を追加する関数
function addNewRecord(startDateFieldCode) {
var startDateTime = moment().format(‘YYYY-MM-DDTHH:mm:ssZ’);
var newRecord = {};
newRecord[startDateFieldCode] = { value: startDateTime };
kintone.app.record.get().record[‘作業実績’].value.push(newRecord);
kintone.app.record.set(kintone.app.record.get());
}
// 日付が本日かどうかを判定する関数
function isToday(date) {
var today = moment().format(‘YYYY-MM-DD’);
return date === today;
}
// 作業開始ボタンがクリックされた時の処理
function handleStartButtonClick() {
// 作業開始ボタンがクリックされたときの処理をここに記述する(必要に応じて実装)
}
})();
レコード閲覧画面は閲覧するための画面なので、kintoine.app.record.get()やkintone.app.record.set()ではレコードを書き換えることができません(今回の実装に関係ないですがモバイル版ならイベント指定も全てmobile.app.record…と書かなければなりません)。
閲覧画面(detail.show)でレコードを書き換える場合、1件のレコードを更新する等のREST APIでなければなりません。
ありがとうございます。
レコード編集画面の場合も作成してみましたが
うまく動作しません。どのが悪いのでしょうか?
(function() {
“use strict”;
var mySpaceFieldButton = document.createElement(“button”);
mySpaceFieldButton.id = “my_space_field_button”;
mySpaceFieldButton.innerHTML = “作業開始”;
mySpaceFieldButton.onclick = function() {
var tableFieldCode = “作業実績_0”; // 作業実績のテーブルフィールドコード
var startDateFieldCode = “作業開始”; // 作業開始日付フィールドコード
var record = kintone.mobile.app.record.get();
var table = record.record[tableFieldCode].value;
var lastRow;
if (table && table.length > 0) {
lastRow = table[table.length - 1];
var lastStartDate = lastRow[startDateFieldCode].value;
if (lastStartDate && moment(lastStartDate).isSameOrBefore(moment(), “day”)) {
// 最終行が空白もしくは本日の場合、最終行を更新
lastRow[startDateFieldCode].value = moment().format(“YYYY-MM-DDTHH:mm”);
} else {
// 最終行が本日以前の場合、新しい行を追加
var newRow = {};
newRow[startDateFieldCode] = {
value: moment().format(“YYYY-MM-DDTHH:mm”)
};
table.push(newRow);
}
} else {
// テーブルが存在しない場合は何もしない
return;
}
kintone.mobile.app.record.set(record);
alert(“作業開始!保存を押してください!”);
};
kintone.events.on([“mobile.app.record.create.show”, “mobile.app.record.edit.show”], function(event) {
var spaceElement = kintone.mobile.app.getHeaderSpaceElement();
spaceElement.appendChild(mySpaceFieldButton);
});
})();
gri_gri33 さま
以下3点が気になりました。
lastRow = table[table.length - 1];
↓
lastRow = table[table.length - 1].value;
サブテーブル内フィールドは「record[①’サブテーブルのフィールドコード’].value[②インデックス番号].value[③’サブテーブル内フィールドのフィールドコード’].value」となります。次の行で「lastRow[startDateFieldCode].value」と書いてあるので、②と③の間のvalueが抜けていることになります。
var newRow = {};
newRow[startDateFieldCode] = {
↓
var newRow = {
value: {}
};
newRow.value[startDateFieldCode] = {
1.と同じ理由でvalueが足りていないようです。
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: 'フィールドの値'
}
};
といった形にする必要があります。
同じことが書いてありますがこちらの記事が参考になると思います。また、フィールドのタイプを知りたい場合はフィールド形式のページに掲載されています。
以下は実装後の話になりますが「同じ行内に他のフィールドがある場合、それら全てのフィールドを指定する必要がある」と書いた通り、フォームの設定でサブテーブル内フィールドを増やしたり減らしたりした場合はコードも書き換えなければなりません。
慣れてくればフィールドの増減は関係なく動き続けるコードを書くこともできます(フォーム情報を取得したり、1行目のデータを使ったり等)が、まずは理屈を覚えるためにもフィールド全て書いてみるのをおすすめします。
system
(system)
クローズされました:
5
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。