Kazuma
1
Kintone初心者です。Javascriptの作り方がわからず困っているのでご教授いただければ幸いです。
勤務管理表というアプリを作り、その中で有給休暇をラジオボタンで選択できるようにしています。また、有給休暇・代休管理表というアプリを別途作成し、勤務管理表で選択した有給休暇の日付及び数を関連レコード一覧にて表示できるようにしました。年次ごとに取得した有給休暇の合計を数値に自動的に入力されるようにしたいのですが、Javascriptの組み方がわからず困っています。下記のように入れてみたのですが、うまく動きません。よろしくお願いいたします。
(function () {
“use strict”;
// レコード詳細画面の表示時に実行
kintone.events.on("app.record.detail.show", async function (event) {
const record = event.record;
// 🔹 フィールドコード設定(適宜変更)
const relatedAppId = 123; // 「勤務管理表」アプリのIDを設定
const userFieldCode = "作成者及び参加者"; // 「勤務管理表」側のユーザー選択フィールド
const workTypeFieldCode = "勤務区分"; // 勤務区分(有給休暇かどうか判定)
const dateFieldCode = "開始日時"; // 勤務日(有給休暇の日付)
const sumFieldCode2024 = "有給休暇合計_2024"; // 2024年度の合計フィールド
const sumFieldCode2025 = "有給休暇合計_2025"; // 2025年度の合計フィールド
// 現在のユーザーを取得(作成者及び参加者と比較するため)
const currentUser = record[userFieldCode]?.value?.[0]?.code;
if (!currentUser) {
console.warn("ユーザー選択フィールドが空です");
return event;
}
// 「勤務管理表」アプリのレコードを取得
const query = `${userFieldCode} in ("${currentUser}") and ${workTypeFieldCode} = "有給休暇" order by ${dateFieldCode} asc limit 500`;
const params = {
app: relatedAppId,
query: query,
fields: [workTypeFieldCode, dateFieldCode]
};
try {
const resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params);
const records = resp.records;
let total2024 = 0;
let total2025 = 0;
records.forEach(function (item) {
const dateStr = item[dateFieldCode]?.value;
if (!dateStr) return;
const date = new Date(dateStr);
const year = date.getFullYear();
const month = date.getMonth() + 1;
let fiscalYear = (month >= 4) ? year : year - 1;
if (fiscalYear === 2024) {
total2024 += 1; // 有給休暇のカウントを1日ずつ加算
} else if (fiscalYear === 2025) {
total2025 += 1;
}
});
// 🔹 既存データと変わらない場合は更新しない
if (record[sumFieldCode2024].value == total2024 && record[sumFieldCode2025].value == total2025) {
return event;
}
// 🔹 レコードを更新
const updateParams = {
app: kintone.app.getId(),
id: record.$id.value,
record: {}
};
updateParams.record[sumFieldCode2024] = { value: total2024 };
updateParams.record[sumFieldCode2025] = { value: total2025 };
await kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', updateParams);
// 🔹 更新をユーザーに通知
alert("有給休暇の年度別合計を更新しました!");
// 🔹 ページをリロードして最新情報を表示
location.reload();
} catch (error) {
console.error("関連レコード取得エラー:", error);
}
return event;
});
})();
Maple
(もみじ)
2

開発者ツールに、こんなエラーが出ていませんか?
workTypeFieldCode は値が「有給休暇」になりうるようなので
これがラジオボタンなんだろうと思いますが、ラジオボタンは
クエリで = を使えないから、代わりに in を使う必要があります。
const query = `${userFieldCode} in ("${currentUser}") and ${workTypeFieldCode} = "有給休暇" order by ${dateFieldCode} asc limit 500`;
を
const query = `${userFieldCode} in ("${currentUser}") and ${workTypeFieldCode} in ("有給休暇") order by ${dateFieldCode} asc limit 500`;
と書き換えれば動くのでは。
Kazuma
3
ご回答ありがとうございます。
ご指摘いただいた内容で訂正してみました。ですがまだ動作が確認できませんでした。どこか間違っているところがあればご教授頂けますでしょうか。よろしくお願いいたします。
(function () {
“use strict”;
// レコード詳細画面の表示時
kintone.events.on("app.record.detail.show", async function (event) {
const record = event.record;
// 🔹 フィールドコード設定(適宜変更)
const relatedAppId = 456; // 「勤務管理表」アプリのIDを設定
const userFieldCode = "作成者及び参加者"; // 「勤務管理表」側のユーザー選択フィールド
const workTypeFieldCode = "勤務区分"; // 勤務区分(有給休暇かどうか判定)
const dateFieldCode = "開始日時"; // 勤務日(有給休暇の日付)
const sumFieldCode2024 = "有給休暇合計_2024"; // 2024年度の合計フィールド
const sumFieldCode2025 = "有給休暇合計_2025"; // 2025年度の合計フィールド
// 現在のユーザーを取得(作成者及び参加者を考慮)
const selectedUsers = record[userFieldCode]?.value || [];
if (selectedUsers.length === 0) {
console.warn("ユーザー選択フィールドが空です");
return event;
}
// ユーザーコードをクエリ用に加工
const userCodes = selectedUsers.map(user => `"${user.code}"`).join(", ");
// 「勤務管理表」アプリのレコードを取得
const query = `${userFieldCode} in (${userCodes}) and ${workTypeFieldCode} in ("有給休暇") order by ${dateFieldCode} asc limit 500`;
const params = {
app: relatedAppId,
query: query,
fields: [workTypeFieldCode, dateFieldCode]
};
try {
const resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params);
const records = resp.records;
let total2024 = 0;
let total2025 = 0;
records.forEach(function (item) {
const dateStr = item[dateFieldCode]?.value;
if (!dateStr) return;
const date = new Date(dateStr);
const year = date.getFullYear();
const month = date.getMonth() + 1;
let fiscalYear = (month >= 4) ? year : year - 1;
if (fiscalYear === 2024) {
total2024 += 1; // 有給休暇のカウントを1日ずつ加算
} else if (fiscalYear === 2025) {
total2025 += 1;
}
});
// 🔹 既存データと変わらない場合は更新しない
const current2024 = Number(record[sumFieldCode2024].value) || 0;
const current2025 = Number(record[sumFieldCode2025].value) || 0;
if (current2024 === total2024 && current2025 === total2025) {
return event;
}
// 🔹 レコードを更新
const updateParams = {
app: kintone.app.getId(),
id: record.$id.value,
record: {}
};
updateParams.record[sumFieldCode2024] = { value: total2024 };
updateParams.record[sumFieldCode2025] = { value: total2025 };
await kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', updateParams);
// 🔹 更新をユーザーに通知
alert("有給休暇の年度別合計を更新しました!");
// 🔹 ページをリロードして最新情報を表示
location.reload();
} catch (error) {
console.error("関連レコード取得エラー:", error);
}
return event;
});
})();
Maple
(もみじ)
5
その図の状況なら[有給休暇合計_2024]が2、[有給休暇合計_2025]が1となるように
[有給休暇カウント]の合計が、その右の数値フィールドに入ればいいんでしょうか?
もしそうなら、これを参考にすればできると思います。
Kazuma
6
ご返信ありがとうございます。お送りいただいたURLで試してみました。
ですが、まだ動作しません。何か間違っているでしょうか。
(() => {
‘use strict’;
const events = [
‘app.record.detail.show’,
‘app.record.edit.show’
];
kintone.events.on(events, (event) => {
const clientRecordId = event.recordId;
const relatedAppId = kintone.app.getRelatedRecordsTargetAppId(‘有給休暇取得状況_2024’);
const query = 作成者="${clientRecordId}"
;
const outputFields = [‘有給休暇アカウント’];
const appUrl = kintone.api.url(‘/k/v1/records’);
const params = {
app: relatedAppId,
query: query,
fields: outputFields
};
const elementId = 'totalAmount';
kintone.api(appUrl, 'GET', params, (resp) => {
let totalAccount = 0;
for (let i = 0; i < resp.records.length; i++) {
totalAccount += parseFloat(resp.records[i].有給休暇アカウント.value);
}
const divTotalAmount = document.createElement('div');
const formattedAmount = String(totalAccount.toFixed(0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,'));
divTotalAmount.style.fontWeight = 'bold';
divTotalAmount.style.textAlign = 'right';
divTotalAmount.style.fontSize = 12;
divTotalAmount.innerHTML = `¥${formattedAmount}-`;
kintone.app.record.getSpaceElement(elementId).appendChild(divTotalAmount);
return event;
});
});
})();
Maple
(もみじ)
7
const query = 作成者="${clientRecordId}";
ここの “${clientRecordId}” をサンプルコードから変えてないせいで
[作成者]と[レコード番号]が等しいレコードを探してしまっています。
[作成者]と[社員名]が等しいレコードを検索してください。
Kazuma
8
これで合ってますでしょうか。追加してみましたが、動作しませんでした・・。
const query = 作成者 = "${社員名}"
;
Maple
(もみじ)
9
クエリはまだ合っていませんし
[有給休暇カウント]が[有給休暇アカウント]になっています。
これらを直して、検索条件に[開始日時]を加えたら
2024年度分の[有給休暇カウント]合算はできました。
合計値を[有給休暇合計_2024]に入力して更新する処理や
2025年度分の合算はご自身で書いてみてください。
また、不具合が出るたびに逐一聞いていては切りがないので
下記のようにconsole.logでプログラムの進行状況やエラーの情報を
開発者ツールに出して、自力でデバッグすることもご一考ください。
(() => {
'use strict';
// レコード詳細画面が表示されたときのイベント
const events = ['app.record.detail.show'];
console.log('トリガーとなるイベント:', events);
// イベントが発生したときの処理を定義
kintone.events.on(events, (event) => {
console.log('以下のイベント発生を検知:', event);
// 現在表示されているレコードから[社員名]の値を取得
const employeeName = event.record.社員名.value;
console.log('社員名:', employeeName);
// 関連レコード一覧[有給休暇取得状況_2024]が参照するアプリのアプリIDを取得
const relatedAppId = kintone.app.getRelatedRecordsTargetAppId('有給休暇取得状況_2024');
console.log('参照するアプリのID:', relatedAppId);
// [作成者2]が[社員名]と一致し、[開始日時]が日本時間で「2024-04-01 00:00」以降かつ「2025-04-01 00:00」より前のレコードを検索するクエリ
const query = `作成者2="${employeeName}" and 開始日時 >= "2024-04-01T00:00:00+09:00" and 開始日時 < "2025-04-01T00:00:00+09:00"`;
console.log('クエリ:', query);
// 数の合計を求めるフィールドのフィールドコードを指定
const outputFields = ['有給休暇カウント'];
console.log('合計を算出するフィールド:', outputFields);
const appUrl = kintone.api.url('/k/v1/records');
console.log('URL:', appUrl);
const params = {
app: relatedAppId,
query: query,
fields: outputFields
};
console.log('リクエストのパラメータ:', params);
// パラメータに基づいてレコードを取得
kintone.api(appUrl, 'GET', params, (resp) => {
console.log('レスポンス:', resp);
let leave = 0; // [有給休暇カウント]の合計を格納する変数を初期化
console.log('有給休暇カウント合計の初期値:', leave);
// 取得したレコードをループして[有給休暇カウント]を合算
for (let i = 0; i < resp.records.length; i++) {
const count = parseFloat(resp.records[i].有給休暇カウント.value);
console.log(`レコード${i + 1}の有給休暇カウント:`, count);
leave += count;
}
console.log('有給休暇カウント合計:', leave);
return event;
});
});
})();
Maple
(もみじ)
10
なお、上のコードで[作成者]を[作成者2]としていますが
これは本件の[作成者]がデフォルトで存在する作成者フィールドではなさそうだからです。
このヘルプによると、関連レコード一覧の「表示するレコードの条件」で
参照するアプリのフィールド
に上記リンクの作成者は選べないはずなので。
Kazuma
11
色々とありがとうございました。あとは自分で考えてやってみます。
system
(system)
クローズされました:
12
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。