// 健康診断管理 SiteId 513156(実施年度-集計): NumA~NumH(社員集計項目)をNum031~038へ置き換える // ワンショットスクリプト。設定(LabelText/Unit/TextAlign/NoWrap等)はそのまま維持し、ColumnNameのみ変更。 // EditorColumnHash.General内の配置位置もNumA~H→Num031~038に置換。既存アイテム件数0件を確認済みのため // データ移行は行わない(ColumnNameはPleasanterの物理列名に直結するため、データがあれば別途移行が必要)。 // updatesite(Mode:full)を使う。--execute指定時のみ実際に送信、指定なければプレビューのみ出力。 "use strict"; const fs = require("fs"); const path = require("path"); const { findSiteDir, newModifyDir } = require("../../site-paths.js"); const PROJECT_NAME = "健康診断管理"; const ENV = "production"; const SITE_ID = 513156; const SITE_NAME = "実施年度-集計"; const REQUEST_LABEL = "rename-numah-to-num031-038"; // [旧ColumnName, 新ColumnName] const RENAME_PAIRS = [ ["NumA", "Num031"], ["NumB", "Num032"], ["NumC", "Num033"], ["NumD", "Num034"], ["NumE", "Num035"], ["NumF", "Num036"], ["NumG", "Num037"], ["NumH", "Num038"], ]; const REPO_ROOT = path.join(__dirname, "..", "..", "..", ".."); const PROJECT_ROOT = path.join(REPO_ROOT, PROJECT_NAME); const CONFIGS_DIR = path.join(PROJECT_ROOT, "configs", ENV); function loadServerConfig() { const configPath = path.join(REPO_ROOT, `config_${ENV}.json`); const config = JSON.parse(fs.readFileSync(configPath, "utf-8")); if (!config.BaseUrl || !config.ApiKey) { console.error(`[エラー] ${configPath} に BaseUrl / ApiKey を設定してください。`); process.exit(1); } return config; } function loadLatest() { const siteDir = findSiteDir(CONFIGS_DIR, SITE_ID); if (!siteDir) { console.error(`[エラー] configs/${ENV}/site-${SITE_ID}_* が見つかりません。先にget-site-config.jsを実行してください。`); process.exit(1); } const p = path.join(siteDir, "sitesettings", `site-${SITE_ID}_latest.json`); const raw = JSON.parse(fs.readFileSync(p, "utf-8")); return { current: raw.Response.Data, siteDir, rawText: fs.readFileSync(p, "utf-8") }; } function buildDesiredSiteSettings(current) { const settings = JSON.parse(JSON.stringify(current.SiteSettings)); const renamedColumns = []; for (const [oldName, newName] of RENAME_PAIRS) { const col = settings.Columns.find((c) => c.ColumnName === oldName); if (!col) { console.error(`[エラー] Columns内に${oldName}が見つかりません。`); process.exit(1); } if (settings.Columns.some((c) => c.ColumnName === newName)) { console.error(`[エラー] Columns内に${newName}が既に存在します(重複防止のため中断)。`); process.exit(1); } col.ColumnName = newName; renamedColumns.push({ oldName, newName, label: col.LabelText }); } const general = settings.EditorColumnHash.General; const renameMap = new Map(RENAME_PAIRS); settings.EditorColumnHash.General = general.map((name) => renameMap.get(name) || name); // Links省略厳禁(全置換のため既存値をそのまま含める) settings.Links = current.SiteSettings.Links || []; return { settings, renamedColumns }; } function buildUpdateBody(apiKey, current, desiredSettings) { return { ApiVersion: "1.1", ApiKey: apiKey, SiteId: SITE_ID, Title: current.Title, ReferenceType: current.ReferenceType, ParentId: current.ParentId, InheritPermission: current.InheritPermission, SiteSettings: desiredSettings, }; } const execute = process.argv.includes("--execute"); const server = loadServerConfig(); (async () => { const { current, siteDir, rawText } = loadLatest(); const { settings: desiredSettings, renamedColumns } = buildDesiredSiteSettings(current); const body = buildUpdateBody(server.ApiKey, current, desiredSettings); const modifyDir = newModifyDir(siteDir, REQUEST_LABEL); const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); fs.writeFileSync(path.join(modifyDir, `before_site-${SITE_ID}_latest.json`), rawText, "utf-8"); const updatedPath = path.join(modifyDir, `site-${SITE_ID}_updated_${timestamp}.json`); fs.writeFileSync(updatedPath, JSON.stringify(body, null, 2), "utf-8"); console.log(`\n==== SiteId ${SITE_ID} (${SITE_NAME}) ====`); console.log("置き換え内容:"); for (const c of renamedColumns) console.log(` - ${c.oldName} → ${c.newName} (${c.label})`); console.log("EditorColumnHash.General 変更後:"); console.log(` [${desiredSettings.EditorColumnHash.General.join(", ")}]`); console.log(`プレビュー保存先: ${updatedPath}`); if (!execute) { console.log("\n(--execute 未指定のためプレビューのみ。送信していません)"); return; } const url = `${server.BaseUrl}api/items/${SITE_ID}/updatesite`; console.log(`送信先: ${url}`); const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); const json = await res.json(); console.log(`[結果] HTTP ${res.status}:`, JSON.stringify(json)); const resultPath = path.join(modifyDir, `site-${SITE_ID}_result_${timestamp}.json`); fs.writeFileSync(resultPath, JSON.stringify(json, null, 2), "utf-8"); })();