"use client"; import { useState } from "react"; import type { Block, ButtonBlockProps, FormBlockProps } from "@/features/editor/state/editorStore"; import { NumericPropertyControl } from "@/features/editor/components/NumericPropertyControl"; import { computeFormControllerPublicTokens } from "@/features/editor/utils/formHelpers"; import { useAppLocale } from "@/features/i18n/LocaleProvider"; import { getEditorFormControllerPanelMessages } from "@/features/i18n/messages/editorFormControllerPanel"; interface FormControllerPanelProps { block: Block; // type === "form" blocks: Block[]; selectedBlockId: string | null; updateBlock: (id: string, partial: any) => void; } export function FormControllerPanel({ block, blocks, selectedBlockId, updateBlock }: FormControllerPanelProps) { if (!selectedBlockId || block.id !== selectedBlockId) return null; const [showSheetsGuide, setShowSheetsGuide] = useState(false); const formProps = block.props as FormBlockProps; const locale = useAppLocale(); const m = getEditorFormControllerPanelMessages(locale); const sheetsScriptExample = (() => { const tokens = computeFormControllerPublicTokens(block, blocks); const fieldNames = tokens.fields.map((f) => f.name).filter((name) => !!name); if (fieldNames.length === 0) { return ( "function doPost(e) {\n" + ' var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("시트1");\n' + " if (!sheet) { sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; }\n" + " var params = e.parameter; // x-www-form-urlencoded\n" + " var row = [\n" + ' params.name || "",\n' + ' params.email || "",\n' + ' params.message || "",\n' + " new Date(),\n" + " ];\n" + " sheet.appendRow(row);\n" + " return ContentService\n" + " .createTextOutput(JSON.stringify({ ok: true }))\n" + " .setMimeType(ContentService.MimeType.JSON);\n" + "}" ); } const headerNames = [...fieldNames, "createdAt"]; const rowLines = fieldNames.map((name) => ` params.${name} || "",`); rowLines.push(" new Date(),"); const lines: string[] = []; lines.push("function doPost(e) {"); lines.push(' var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("시트1");'); lines.push(" if (!sheet) { sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; }"); lines.push(" var params = e.parameter; // x-www-form-urlencoded"); lines.push(" // 시트의 1행 헤더는 다음과 같이 맞춰 주세요:"); lines.push(` // ${headerNames.join(", ")}`); lines.push(" var row = ["); for (const line of rowLines) { lines.push(line); } lines.push(" ];"); lines.push(" sheet.appendRow(row);"); lines.push(" return ContentService"); lines.push(" .createTextOutput(JSON.stringify({ ok: true }))"); lines.push(" .setMimeType(ContentService.MimeType.JSON);"); lines.push("}"); return lines.join("\n"); })(); return (
{m.introTextPrefix}
/api/forms/submit
{m.introTextSuffix}
{m.sheetsGuideIntro}