목표값 찾기

목표값 찾기는 수식에서 특정 목표 결과를 얻기 위해 필요한 입력 값을 찾는 가상 분석 도구입니다. 원하는 결과는 알고 있지만 그 결과를 얻는 데 필요한 입력 값을 확인해야 하는 시나리오에 유용합니다.

목표값 찾기는 수식에서 특정 목표를 달성하기 위해 필요한 입력 값을 찾는 강력한 가상 분석 도구입니다. 이 데모는 GC.Spread.Sheets.CalcEngine.goalSeek API를 사용하여 대상 값에 도달하는 데 필요한 값을 찾는 방법을 보여 줍니다. 예제 시나리오 이 데모에는 두 가지 실용적인 예제가 포함되어 있습니다. 예제 1: 매출 계산 단가(B3): $100에서 시작 판매 수량(B4): 50개 총매출(B5): =B3*B4($5,000으로 계산) $10,000의 매출을 달성하려는 경우 목표값 찾기는 필요한 단가 또는 판매 수량 값을 자동으로 결정할 수 있습니다. 예제 2: 대출 상환액 계산 대출 금액(B9): $10,000 기간(개월)(B10): 18개월 이자율(B11): 5.00%(초기값) 월 상환액(B12): =-PMT(B11/12,B10,B9) 월 상환액을 $600으로 맞추려는 경우 목표값 찾기는 필요한 이자율(약 10%)을 찾을 수 있습니다. API 메서드 시그니처 매개 변수 이름 형식 설명 changingSheet GC.Spread.Sheets.Worksheet 조정할 셀이 포함된 워크시트입니다. changingRow number 조정할 셀의 0부터 시작하는 행 인덱스입니다. changingColumn number 조정할 셀의 0부터 시작하는 열 인덱스입니다. formulaSheet GC.Spread.Sheets.Worksheet 수식 셀이 포함된 워크시트입니다. formulaRow number 수식 셀의 0부터 시작하는 행 인덱스입니다. formulaColumn number 수식 셀의 0부터 시작하는 열 인덱스입니다. desiredResult number 수식 셀이 도달해야 하는 목표 값입니다. options IGoalSeekOptions(선택 사항) 목표값 찾기 반복 동작과 정확도를 제어하는 선택적 설정입니다. options.maximumIterations number(선택 사항) 최대 반복 횟수입니다. 기본값: 200. options.tolerance number(선택 사항) 수식 결과와 목표 결과 사이에 허용되는 최대 차이입니다. 기본값: 0.001. options.callback (info: IGoalSeekStepInfo) => boolean | void | Promise<boolean | void>(선택 사항) 각 반복 후 호출되는 콜백입니다. 현재 시도 해를 받고, true를 반환하면 목표값 찾기를 조기에 중지하며 false 또는 void를 반환하면 계속 진행합니다. 콜백이 Promise를 반환하면 목표값 찾기는 다음 반복으로 진행하기 전에 해당 Promise가 완료될 때까지 기다립니다. 시각화를 위해 일시 중지하는 등 비동기 작업을 수행하려면 콜백을 async 함수로 선언할 수 있습니다. 반환 값 boolean: 동기 호출(점진적 계산 및 비동기 콜백 없음)의 경우 해를 찾았는지 여부를 나타냅니다. Promise<boolean>: 점진적 계산 시나리오이거나 options.callback이 제공된 경우, 해를 찾으면 true, 그렇지 않으면 false로 확인되는 Promise를 반환합니다. 예제 참고 이 API를 호출하면 변경 셀이 찾은 값으로 업데이트됩니다. 답을 찾지 못하면 해당 셀의 원래 값이 복원됩니다. callback이 제공되면 각 반복 후 현재 단계 정보와 함께 호출됩니다. 콜백이 true를 반환하거나 true로 확인되면 goalSeek는 조기에 중지되고 현재 값을 최종 결과로 처리합니다.
window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 1 }); initSpread(spread); }; function initSpread(spread) { var sheet = spread.getSheet(0); // Set up sample data sheet.setValue(0, 0, 'Goal Seek Example'); sheet.getRange(0, 0, 1, 2).font('bold 14px Arial'); sheet.setValue(2, 0, 'Unit Price:'); sheet.setValue(2, 1, 100); sheet.setFormatter(2, 1, '$#,##0.00'); sheet.setValue(3, 0, 'Units Sold:'); sheet.setValue(3, 1, 50); sheet.setValue(4, 0, 'Total Revenue:'); sheet.setFormula(4, 1, '=B3*B4'); sheet.setFormatter(4, 1, '$#,##0.00'); sheet.getCell(4, 1).backColor('#e3f2fd'); sheet.setColumnWidth(0, 120); sheet.setColumnWidth(1, 100); // Add PMT example sheet.setValue(6, 0, 'Loan Payment Example (PMT)'); sheet.getRange(6, 0, 1, 2).font('bold 14px Arial'); sheet.setValue(8, 0, 'Loan Amount:'); sheet.setValue(8, 1, 10000); sheet.setFormatter(8, 1, '$#,##0.00'); sheet.setValue(9, 0, 'Term (Months):'); sheet.setValue(9, 1, 18); sheet.setValue(10, 0, 'Interest Rate:'); sheet.setValue(10, 1, 0.05); sheet.setFormatter(10, 1, '0.00%'); sheet.setValue(11, 0, 'Monthly Payment:'); sheet.setFormula(11, 1, '=-PMT(B11/12,B10,B9)'); sheet.setFormatter(11, 1, '$#,##0.00'); sheet.getCell(11, 1).backColor('#fff3cd'); // Add instructions sheet.setValue(13, 0, 'Instructions:'); sheet.getCell(13, 0).font('bold 12px Arial'); sheet.setValue(14, 0, '1. Example 1: Use B5 as formula cell to find revenue target'); sheet.setValue(15, 0, '2. Example 2: Use B12 as formula cell with target 600'); sheet.setValue(16, 0, ' and B11 as variable to find required interest rate'); sheet.setValue(17, 0, '3. Enter your values and click "Run Goal Seek"'); // Goal Seek implementation document.getElementById("runGoalSeek").addEventListener('click', function() { var formulaCellRef = document.getElementById("formulaCell").value; var targetValue = parseFloat(document.getElementById("targetValue").value); var variableCellRef = document.getElementById("variableCell").value; var maximumIterations = parseInt(document.getElementById("maximumIterations").value) || 100; var tolerance = parseFloat(document.getElementById("tolerance").value) || 0.001; var resultDiv = document.getElementById("result"); try { var formulaCell = parseCellReference(sheet, formulaCellRef); var variableCell = parseCellReference(sheet, variableCellRef); var seekResult = GC.Spread.Sheets.CalcEngine.goalSeek( variableCell.sheet, variableCell.row, variableCell.col, formulaCell.sheet, formulaCell.row, formulaCell.col, targetValue, { maximumIterations: maximumIterations, tolerance: tolerance }); if (seekResult) { resultDiv.innerHTML = '<div class="success">Goal Seek succeeded!<br/>Found value: ' + formulaCell.sheet.getValue(formulaCell.row, formulaCell.col).toFixed(2) + '</div>'; } else { resultDiv.innerHTML = '<div class="error">Goal Seek could not find a solution.<br/>Try a different target value.</div>'; } } catch (e) { resultDiv.innerHTML = '<div class="error">Error: ' + e.message + '</div>'; } }); } function parseCellReference(sheet, address) { var ranges = GC.Spread.Sheets.CalcEngine.formulaToRanges(sheet, address, 0, 0); if (ranges && ranges.length === 1 && ranges[0].ranges.length === 1 && ranges[0].ranges[0].rowCount === 1 && ranges[0].ranges[0].colCount === 1) { return { sheet: sheet.getParent().getSheetFromName(ranges[0].sheetName), row: ranges[0].ranges[0].row, col: ranges[0].ranges[0].col }; } else { throw new Error('Invalid cell reference: ' + address); } }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="spreadjs culture" content="ko-kr" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-resources-ko/dist/gc.spread.sheets.resources.ko.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div id="ss" class="sample-spreadsheets"></div> <div class="options-container"> <div class="option-row"> <label>Set Formula Cell:</label> <input type="text" id="formulaCell" value="B5" placeholder="e.g., B5" /> </div> <div class="option-row"> <label>Target Value:</label> <input type="number" id="targetValue" value="10000" placeholder="e.g., 10000" /> </div> <div class="option-row"> <label>Variable Cell:</label> <input type="text" id="variableCell" value="B3" placeholder="e.g., B3" /> </div> <div class="option-row"> <label>Maximum Iterations:</label> <input type="number" id="maximumIterations" value="100" placeholder="Default: 100" /> </div> <div class="option-row"> <label>Tolerance:</label> <input type="number" id="tolerance" value="0.001" step="0.0001" placeholder="Default: 0.001" /> </div> <div class="option-row"> <input type="button" value="Run Goal Seek" id="runGoalSeek" /> </div> <div class="option-row"> <label>Result:</label> <div id="result" class="result-container"></div> </div> </div> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height:100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; overflow: auto; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; } .option-row { margin-bottom: 12px; } .option-row label { display: block; margin-bottom: 4px; font-weight: bold; font-size: 12px; } input[type=text], input[type=number] { width: 100%; padding: 6px; border: 1px solid #ccc; border-radius: 3px; box-sizing: border-box; } input[type=button] { width: 100%; padding: 8px 6px; margin-bottom: 6px; background: #007acc; color: white; border: none; border-radius: 3px; cursor: pointer; font-weight: bold; } input[type=button]:hover { background: #005a9e; } .result-container { padding: 8px; border-radius: 3px; min-height: 40px; } .success { background: #d4edda; color: #155724; padding: 8px; border-radius: 3px; } .error { background: #f8d7da; color: #721c24; padding: 8px; border-radius: 3px; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }