kintone で JavaScript プログラムを新規で作ることがあって、そのための雛形を記述します。
想定としては、ABC 画面の現在のステータス表示が「請求書印刷」だったとして、DEF 画面の「受注日」と「発注書送付日」が入力されている条件で、指定されたステータス(「発注書印刷」に戻す)に更新します。
フラグ変更は、単にチェックボックスのオン/オフを切り替えます(印刷済みを外す)。
ステータス表示やフラグ表示は編集不可(disabled=true)にしていることがあるので、本プログラムで強制的に変更できるようにします。
100_新しいツール_Config.js
/**
* @fileoverview 新しいツール_Config.js 設定情報を保持する
*/
(() => {
// 自フィールドと、他のアプリのフィールドを定義します
// option は、ここでは定義していますが、処理では必ずしも使用されていません
window.company = window.company || {};
window.company.config = {
FIELDS: {
内容: { id: '内容', option1: 'ステータス変更', option2: 'フラグ変更' },
ステータス変更_該当アプリ: { id: 'ステータス変更_該当アプリ' },
ステータス変更_該当レコード: { id: 'ステータス変更_該当レコード' },
現在のステップ: { id: '現在のステップ' },
フラグ変更_該当アプリ: { id: 'フラグ変更_該当アプリ' },
フラグ変更_該当レコード: { id: 'フラグ変更_該当レコード' },
請求書印刷: { id: '請求書印刷', option: '済' },
},
RELATED: {
ABC: {
論理削除: { id: '論理削除', option: '済' },
受付番号: { id: '受付番号' },
現在のステップ: { id: '現在のステップ' },
},
DEF: {
論理削除: { id: '論理削除', option: '済' },
受付番号: { id: '受付番号' },
受注日: { id: '受注日' },
発注書送付日: { id: '発注書送付日' },
請求書印刷: { id: '請求書印刷', option: '済' },
},
},
AppNameToIdMap: {
"ABC(dev)": 11,
"DEF(dev)": 12,
"ABC": 123,
"DEF": 124,
},
}
})();
110_新しいツール_Save.js
/**
* @fileoverview 新しいツール_Save.js 新規保存または編集保存時に指定された値に更新する
*/
(() => {
const CONFIG = window.company.config;
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], async (event) => {
const record = event.record;
const maintType = record[CONFIG.FIELDS.内容.id].value;
/**
* ステータス変更
*/
if (maintType === 'ステータス変更') {
const targetApp = record[CONFIG.FIELDS.ステータス変更_該当アプリ.id].value;
const targetRecordIdsRaw = record[CONFIG.FIELDS.ステータス変更_該当レコード.id].value;
const newStatus = record[CONFIG.FIELDS.現在のステップ.id].value;
if (!targetApp || !targetRecordIdsRaw) {
event.error = "ステータス変更する該当アプリと該当レコードを入力してください。";
return event;
}
// カンマ区切りのIDを配列に変換
const targetRecordIds = targetRecordIdsRaw.split(',').map(id => id.trim()).filter(id => id);
try {
for (const targetRecordId of targetRecordIds) {
// 現在の状態
const targetBody = {
app: CONFIG.AppNameToIdMap[targetApp],
id: targetRecordId,
};
const targetResp = await kintone.api(kintone.api.url('/k/v1/record.json', true), 'GET', targetBody);
const targetRecord = targetResp.record;
const currentNumber = targetRecord[CONFIG.RELATED.ABC.受付番号.id].value;
const currentStatus = targetRecord[CONFIG.RELATED.ABC.現在のステップ.id].value;
// 条件確認
const condApp = (targetApp === "ABC(dev)") ? "DEF(dev)" : ((targetApp === "ABC") ? "DEF" : null);
const condBody = {
app: CONFIG.AppNameToIdMap[condApp],
query: `受付番号 = "${currentNumber}" and 論理削除 not in ("済")`,
};
const condResp = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', condBody);
if (!condResp.records || condResp.records.length === 0) {
event.error = `同じ受付番号の ${condApp} のレコードが見つかりませんでした。(受付番号: ${currentNumber})`;
return event;
}
if (condResp.records.length > 1) {
event.error = `同じ受付番号で ${condApp} のレコードが複数見つかりました。(受付番号: ${currentNumber})`;
return event;
}
const condRecord = condResp.records[0];
const isSalesConfirmed = condRecord[CONFIG.RELATED.DEF.受注日.id] && condRecord[CONFIG.RELATED.DEF.受注日.id].value.length > 0;
const isDestinationConfirmed = condRecord[CONFIG.RELATED.DEF.発注書送付日.id] && condRecord[CONFIG.RELATED.DEF.発注書送付日.id].value.length > 0;
// アップデート
if (currentStatus === '請求書印刷' && isSalesConfirmed && isDestinationConfirmed) {
const putBody = {
app: CONFIG.AppNameToIdMap[targetApp],
id: targetRecordId,
record: {
[CONFIG.RELATED.ABC.現在のステップ.id]: {
value: newStatus
}
}
};
await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', putBody);
} else {
event.error = `更新条件を満たしていません。現在のステータスが「請求書印刷」であり、「DEF 受注日」と「DEF 発注書送付日」が記入されている必要があります。(案件番号: ${currentNumber})`;
return event;
}
}
if (targetRecordIds.length > 0) {
kintone.app.getHeaderSpaceElement().innerText = "ステータス変更が正常に完了しました。";
}
} catch (e) {
event.error = 'レコードの取得または更新中にエラーが発生しました: ' + e.message;
return event;
}
/**
* フラグ変更
*/
} else if (maintType === 'フラグ変更') {
const targetApp = record[CONFIG.FIELDS.フラグ変更_該当アプリ.id].value;
const targetRecordIdsRaw = record[CONFIG.FIELDS.フラグ変更_該当レコード.id].value;
const newStatus = record[CONFIG.FIELDS.請求書印刷.id].value;
if (!targetApp || !targetRecordIdsRaw) {
event.error = "フラグ変更する該当アプリと該当レコードを入力してください。";
return event;
}
// カンマ区切りのIDを配列に変換
const targetRecordIds = targetRecordIdsRaw.split(',').map(id => id.trim()).filter(id => id);
try {
for (const targetRecordId of targetRecordIds) {
// アップデート
const putBody = {
app: CONFIG.AppNameToIdMap[targetApp],
id: targetRecordId,
record: {
[CONFIG.RELATED.DEF.請求書印刷.id]: {
value: newStatus
}
}
};
await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', putBody);
}
if (targetRecordIds.length > 0) {
kintone.app.getHeaderSpaceElement().innerText = "フラグ変更が正常に完了しました。";
}
} catch (e) {
event.error = 'レコードの取得または更新中にエラーが発生しました: ' + e.message;
return event;
}
} else {
//
}
return event;
});
})();
画面イメージ
[ラジオボタン]内容 ● ステータス変更 〇 フラグ変更
[文字列(1行)]ステータス変更_該当アプリ ␣␣ABC(dev)
[文字列(1行)]ステータス変更_該当レコード ␣␣␣␣␣␣ (カンマ区切りで複数指定できます)
[ドロップダウン]現在のステップ 「発注書印刷」
[文字列(1行)]フラグ変更_該当アプリ ␣␣DEF(dev)
[文字列(1行)]フラグ_該当レコード ␣␣␣␣␣␣ (カンマ区切りで複数指定できます)
[チェックボックス]請求書印刷 □ 済