JS初心者です…
現金精算テーブル内にある数値フィールド「現金_金額」に0以外の数字が入っていたら、添付フィールド「現金_領収書」を必須項目にしたいです!(カンパニーカードテーブルも同様に)
AIに下記のコードを作ってもらったのですが、保存できなかったりとうまくいかず…
コミュニティー内を探してもピンとくるようなスレッドを見つけられませんでした…
添付フィールドの条件付き必須項目設定は難しいのでしょうか?ご教示いただけますと幸いです…!よろしくお願いします![]()
コードをここに入力// 即時関数(IIFE)でコード全体を囲むことで、他のJavaScriptファイルとの変数名の衝突を防ぐ、大切なおまじないです。
(function() {
'use strict'; // プログラムのエラーをチェックしやすくするための、おまじない(厳格モード宣言)です。
// --------------------------------------------------------------------------------
// 設定エリア:君の新しいルールに合わせて、ここを書き換えたよ!
// --------------------------------------------------------------------------------
// ▼▼▼ 1つ目のテーブル(現金精算) ▼▼▼
const CASH_TABLE = '現金精算';
const CASH_AMOUNT = '現金_金額'; // ★きっかけを「日付」から「金額」に変更!
const CASH_ATTACHMENT = '現金_領収書';
// ▼▼▼ 2つ目のテーブル(カンパニーカード精算) ▼▼▼
const CARD_TABLE = 'カンパニーカード精算';
const CARD_AMOUNT = 'カード_金額'; // ★きっかけを「日付」から「金額」に変更!
const CARD_ATTACHMENT = 'カード_領収書';
/**
* 必須項目の「見た目」(赤い*マーク)と「エラー表示」(赤枠)を更新するための関数です。
* @param {object} record - kintoneのレコードオブジェクト
*/
function updateFieldState(record) {
// 1. 現金精算テーブルを処理
if (record[CASH_TABLE] && record[CASH_TABLE].value) {
record[CASH_TABLE].value.forEach((row) => {
if (!row.value[CASH_AMOUNT] || !row.value[CASH_ATTACHMENT]) return;
const amountValue = row.value[CASH_AMOUNT].value; // ★日付(dateValue)から金額(amountValue)に変更
const attachmentValue = row.value[CASH_ATTACHMENT].value;
// ★金額に値があれば(0や空欄でなければ)、添付を必須(true)に
const isRequired = !!amountValue;
row.value[CASH_ATTACHMENT].required = isRequired;
if (isRequired && attachmentValue.length === 0) {
row.value[CASH_ATTACHMENT].error = '必須です。';
} else {
row.value[CASH_ATTACHMENT].error = null;
}
});
}
// 2. カンパニーカード精算テーブルを処理
if (record[CARD_TABLE] && record[CARD_TABLE].value) {
record[CARD_TABLE].value.forEach((row) => {
if (!row.value[CARD_AMOUNT] || !row.value[CARD_ATTACHMENT]) return;
const amountValue = row.value[CARD_AMOUNT].value; // ★日付(dateValue)から金額(amountValue)に変更
const attachmentValue = row.value[CARD_ATTACHMENT].value;
const isRequired = !!amountValue;
row.value[CARD_ATTACHMENT].required = isRequired;
if (isRequired && attachmentValue.length === 0) {
row.value[CARD_ATTACHMENT].error = '必須です。';
} else {
row.value[CARD_ATTACHMENT].error = null;
}
});
}
}
/**
* テーブルが表示されるまで待ち、その後「変化」をずっと見張る監視員を配置する関数
* @param {string} tableCode - 監視対象のテーブルのフィールドコード
*/
function observeTable(tableCode) {
const tableElement = kintone.app.record.getFieldElement(tableCode);
if (!tableElement) {
setTimeout(() => observeTable(tableCode), 100);
return;
}
// テーブルが見つかったら、監視員(MutationObserver)を作成
const observer = new MutationObserver(() => {
// 監視中にテーブルで何か変化があったら(他のJSの再描画など)、
// もう一度、必須チェックの「見た目」を更新する!
// ★保存時のエラーを防ぐため、kintone.app.record.get() を使って最新のレコード情報を取得
const currentRecord = kintone.app.record.get();
if (currentRecord) {
updateFieldState(currentRecord.record);
}
});
// 監視員に、テーブルを厳しく監視するように命令
observer.observe(tableElement, {
childList: true, // 行の追加/削除などを監視
subtree: true // テーブル内のあらゆる変化を監視
});
}
// --------------------------------------------------------------------------------
// メイン処理(イベントハンドラの設定)
// --------------------------------------------------------------------------------
// 1. 画面表示時と、テーブル・「金額」・添付ファイルが変更された時
const uiEvents = [
'app.record.create.show', 'app.record.edit.show',
'app.record.create.change.' + CASH_TABLE, 'app.record.edit.change.' + CASH_TABLE,
'app.record.create.change.' + CASH_AMOUNT, // ★「日付」から「金額」に変更
'app.record.edit.change.' + CASH_AMOUNT,
'app.record.create.change.' + CARD_TABLE, 'app.record.edit.change.' + CARD_TABLE,
'app.record.create.change.' + CARD_AMOUNT, // ★「日付」から「金額」に変更
'app.record.edit.change.' + CARD_AMOUNT,
'app.record.create.change.' + CASH_ATTACHMENT, 'app.record.edit.change.' + CASH_ATTACHMENT,
'app.record.create.change.' + CARD_ATTACHMENT, 'app.record.edit.change.' + CARD_ATTACHMENT
];
kintone.events.on(uiEvents, (event) => {
// ★ 画面が開かれたら、監視員を配置する
if (event.type.endsWith('.show')) {
observeTable(CASH_TABLE);
observeTable(CARD_TABLE);
}
// ★ kintoneのイベント(event.record)を使って、即座に見た目を更新
updateFieldState(event.record);
return event;
});
// 2. 保存ボタンが押された時
const saveEvents = [
'app.record.create.submit',
'app.record.edit.submit'
];
kintone.events.on(saveEvents, (event) => {
// ★★★
// 保存時も、kintoneが持っている古いデータ(event.record)ではなく、
// 「今、画面に表示されている本当の最新データ」を使ってチェックする!
const currentRecord = kintone.app.record.get().record;
let errorMessage = '';
// 現金精算テーブルをチェック
currentRecord[CASH_TABLE].value.forEach((row, index) => {
const amountValue = row.value[CASH_AMOUNT].value; // ★「金額」をチェック
const attachmentValue = row.value[CASH_ATTACHMENT].value;
// エラーをセットするのは、kintoneに渡す「event.record」に対して行う
const eventRow = event.record[CASH_TABLE].value[index];
if (eventRow.value[CASH_ATTACHMENT]) {
eventRow.value[CASH_ATTACHMENT].error = null;
}
// ★「金額」に値があるのに、添付が0件だったら
if (amountValue && attachmentValue.length === 0) {
errorMessage += `現金精算テーブルの ${index + 1} 行目: 領収書が添付されていません。\n`;
if (eventRow.value[CASH_ATTACHMENT]) {
eventRow.value[CASH_ATTACHMENT].error = '必須です。';
}
}
});
// カンパニーカード精算テーブルをチェック
currentRecord[CARD_TABLE].value.forEach((row, index) => {
const amountValue = row.value[CARD_AMOUNT].value; // ★「金額」をチェック
const attachmentValue = row.value[CARD_ATTACHMENT].value;
const eventRow = event.record[CARD_TABLE].value[index];
if (eventRow.value[CARD_ATTACHMENT]) {
eventRow.value[CARD_ATTACHMENT].error = null;
}
// ★「金額」に値があるのに、添付が0件だったら
if (amountValue && attachmentValue.length === 0) {
errorMessage += `カンパニーカード精算テーブルの ${index + 1} 行目: 領収書が添付されていません。\n`;
if (eventRow.value[CARD_ATTACHMENT]) {
eventRow.value[CARD_ATTACHMENT].error = '必須です。';
}
}
});
// 3. エラーが一つでもあったら、保存を止める
if (errorMessage) {
const errorTitle = '必須項目に未入力があります。赤くなっている項目を確認してください。';
event.error = errorTitle;
if (typeof Swal !== 'undefined') {
Swal.fire({
icon: 'error',
title: errorTitle,
html: `<pre style="text-align: left; font-size: 14px;">${errorMessage}</pre>`
});
} else {
alert(errorTitle + '\n\n' + errorMessage);
}
return Promise.reject(event);
}
return event;
});
})();または貼り付け

