"use strict"; /* * タブ1(基本情報)へ新規追加した二択選択式フィールド(ClassZ:LINEWORKS有無、ClassY:プリザンター有無)の * ChoicesTextをSiteId=1のSiteSettings.Columnsへ設定する。既存Columns(52件)はそのまま維持し、 * 末尾に2件追記する(Columns配列は完全上書きのため、既存分を含めて送信する必要がある)。 * 既定はドライラン。実際に送信するには --execute を付ける。 * * 実行: node scripts/add-existence-flag-fields.js [--execute] */ const { getSite: fetchSite } = require("../src/lib/pleasanterClient"); const { saveSiteSnapshot } = require("../src/lib/siteConfigStore"); const BASE_URL = process.env.PLEASANTER_BASE_URL; const API_KEY = process.env.PLEASANTER_API_KEY; const SITE_ID = process.env.PLEASANTER_MASTER_SITE_ID; if (!BASE_URL || !API_KEY || !SITE_ID) { console.error("PLEASANTER_BASE_URL / PLEASANTER_API_KEY / PLEASANTER_MASTER_SITE_ID が未設定"); process.exit(1); } const NEW_COLUMNS = [ { ColumnName: "ClassZ", LabelText: "LINEWORKS有無", ChoicesText: "有\n無" }, { ColumnName: "ClassY", LabelText: "プリザンター有無", ChoicesText: "有\n無" }, ]; // サイト情報を取得するたびにconfigs/へ保存する(2026-08-08、ユーザー指示) async function getSite() { const data = await fetchSite({ baseUrl: BASE_URL, apiKey: API_KEY, siteId: SITE_ID }); saveSiteSnapshot(SITE_ID, data); return data; } async function updateSite(body) { const res = await fetch(`${BASE_URL.replace(/\/$/, "")}/api/items/${SITE_ID}/updatesite`, { method: "POST", headers: { "Content-Type": "application/json; charset=utf-8" }, body: JSON.stringify(body), }); const data = await res.json(); if (!res.ok || data.StatusCode !== 200) { throw new Error(`updatesite failed: ${res.status} ${JSON.stringify(data)}`); } return data; } async function main() { const execute = process.argv.includes("--execute"); const current = await getSite(); const currentColumns = (current.SiteSettings && current.SiteSettings.Columns) || []; const alreadyExists = currentColumns.some((c) => c.ColumnName === "ClassZ" || c.ColumnName === "ClassY"); if (alreadyExists) { console.log("[SKIP] ClassZ/ClassYは既にColumnsに存在します。二重追加を避けるため何もしません。"); return; } const mergedColumns = [...currentColumns, ...NEW_COLUMNS]; // 【重要】Columnsの詳細設定(ChoicesText等)はトップレベルではなくSiteSettings配下に // ネストして送る必要がある(公式マニュアルapi-site-updateで確認済み。トップレベルの // ClassHash等とは別の仕組み。ネストせずに送ると200 OKを返すのに実際には保存されない) const body = { ApiVersion: "1.1", ApiKey: API_KEY, ReferenceType: current.ReferenceType, ParentId: current.ParentId, InheritPermission: current.InheritPermission, Permissions: current.Permissions, SiteSettings: { ...current.SiteSettings, Columns: mergedColumns }, }; console.log("--- 現状 → 希望 ---"); console.log(`既存Columns件数: ${currentColumns.length} -> ${mergedColumns.length}`); console.log("追加するColumns:", JSON.stringify(NEW_COLUMNS, null, 2)); if (!execute) { console.log("\n[ドライラン] --execute を付けずに実行したため送信していません。"); return; } const result = await updateSite(body); console.log("\n[OK] 送信結果:", JSON.stringify(result)); await getSite(); // 反映後の状態をconfigs/へ保存(getSite内でsaveSiteSnapshot実行) console.log(`[OK] 反映後の状態をconfigs/${SITE_ID}/latest.jsonへ保存`); } main().catch((e) => { console.error(e); process.exit(1); });