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;
});
})();
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;
});
})();
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;
});
});
})();
Kazuma
8
これで合ってますでしょうか。追加してみましたが、動作しませんでした・・。
const query = 作成者 = "${社員名}"
;
Kazuma
11
色々とありがとうございました。あとは自分で考えてやってみます。
system
(system)
クローズされました:
12
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。