암시적 교차 연산자: @

암시적 교차 연산자는 암시적 교차로라고 알려진 논리를 사용하여 단일 값을 반환한다.

설명
app.js
index.html
styles.css

암시적 교차 논리는 많은 값을 단일 값으로 감소시킨다. 사용자는 하나의 값을 반환하기 위해 함수를 강제하여 함수 앞에 @를 추가할 수 있고, 따라서 셀은 하나의 값만 포함할 수 있다. 함수가 단일 값을 반환하는 경우 암시적 교차로는 아무 것도 수행하지 않습니다. (그것이 기술적으로 뒤에서 행해지고 있었더라도). 논리는 다음과 같다:

  • 값이 단일 항목인 경우 해당 항목을 반환하십시오.
  • 값이 범위인 경우 함수와 동일한 행 또는 열에 있는 셀의 값을 반환하십시오.
  • 값이 배열인 경우 왼쪽 위의 값을 선택하십시오.

동적 배열의 등장으로 SpreadJS는 함수에서 단일 값을 반환하는 데만 국한되지 않으므로, 침묵의 암시적 교차는 더 이상 필요하지 않다. 이전 공식이 보이지 않게 암시적 교차로를 트리거할 수 있는 경우, 동적 배열을 활성화한 SpreadJS는 @에서 발생했을 위치를 보여준다.

Note:

  • 암시적 교차 연산자 @는 allowDynamicArray가 참일 때만 유효하다.
암시적 교차 논리는 많은 값을 단일 값으로 감소시킨다. 사용자는 하나의 값을 반환하기 위해 함수를 강제하여 함수 앞에 @를 추가할 수 있고, 따라서 셀은 하나의 값만 포함할 수 있다. 함수가 단일 값을 반환하는 경우 암시적 교차로는 아무 것도 수행하지 않습니다. (그것이 기술적으로 뒤에서 행해지고 있었더라도). 논리는 다음과 같다: 값이 단일 항목인 경우 해당 항목을 반환하십시오. 값이 범위인 경우 함수와 동일한 행 또는 열에 있는 셀의 값을 반환하십시오. 값이 배열인 경우 왼쪽 위의 값을 선택하십시오. 동적 배열의 등장으로 SpreadJS는 함수에서 단일 값을 반환하는 데만 국한되지 않으므로, 침묵의 암시적 교차는 더 이상 필요하지 않다. 이전 공식이 보이지 않게 암시적 교차로를 트리거할 수 있는 경우, 동적 배열을 활성화한 SpreadJS는 @에서 발생했을 위치를 보여준다. Note: 암시적 교차 연산자 @는 allowDynamicArray가 참일 때만 유효하다.
window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(_getElementById("ss")); initSpread(spread); }; function initSpread(spread) { spread.options.allowDynamicArray = true; var sheet = spread.getActiveSheet(); spread.suspendPaint(); spread.suspendCalcService(); sheet.name('@'); sheet.setText(0, 1, 'The implicit intersection operator @, evaluates an expression using implicit intersection. The formula can return a value, range, or error.'); sheet.setText(1, 1, 'Where value is a range, @ will return the value at the intersection of the row and column of the formula cell.'); sheet.setText(2, 1, ' Syntax: @value'); var row = 7; var col = 1; var col2 = col + 2; var rowCount = 11; applyTableStyleForRange(sheet, row, col, rowCount, 1); applyTableStyleForRange(sheet, row, col2, rowCount, 1); sheet.getCell(row, col).text('Item #').hAlign(2); sheet.getCell(row, col2).text('@').hAlign(2); row++; sheet.setFormula(row, col, 'SEQUENCE(10)'); for(var i = 0, r = row; i < 10; i++, r++) { sheet.setFormula(r, col2, '@$B$9:$B$18'); } sheet.setFormula(20, col2, '@$B$9:$B$18'); sheet.setText(20, col2 + 1, ' <--- error because no intersection'); sheet.setFormula(9, col2 + 2, '@$B$10:$D$10'); sheet.setText(9, col2 + 3, ' <--- error because intersection with multiple cells'); spread.resumeCalcService(); spread.resumePaint(); } function applyTableStyleForRange(sheet, row, col, rowCount, colCount, options) { var tableName = "tmpTable"; var TableThemes = GC.Spread.Sheets.Tables.TableThemes; // use table to help set style then remove like convert table to range in Excel sheet.tables.add(tableName, row, col, rowCount, colCount, TableThemes.medium7, options); sheet.tables.remove(tableName, 2 /* keep style */); } function _getElementById(id) { return document.getElementById(id); }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta name="spreadjs culture" content="ko-kr"/> <meta charset="utf-8" /> <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" style="width:100%; height: 100%"></div> </div></body> </html>
.sample { position: relative; height: 100%; overflow: auto; } .sample::after { display: block; content: ""; clear: both; } .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; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .option-row { font-size: 14px; padding: 5px; margin-top: 10px; } .option-group { margin-bottom: 6px; } label { display: block; margin-bottom: 6px; } input { margin-bottom: 5px; padding: 2px 4px; width: 100%; box-sizing: border-box; } input[type=button] { margin-bottom: 6px; } hr { border-color: #fff; opacity: .2; margin: 5px 0; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }