関数の紹介

LAMBDA関数の一例を紹介します。

LAMBDA関数の一例を紹介します。 最初のシートは、再帰的なLAMBDA関数の例をいくつか示しています。 2枚目と3枚目には、より複雑な例が2つあります。
var data = { Recursive: { values: { 1: { 1: "例" }, 3: { 1: "例1: 階乗を計算する" }, 4: { 1: "[名前の管理]で以下のように定義します:" }, 5: { 1: "名前:", 2: "myFact" }, 6: { 1: "範囲:", 2: "Workbook" }, 7: { 1: "コメント:", 2: "数値の階乗を計算する" }, 8: { 1: "参照:", 2: "=LAMBDA(num,\r\n IF(num<2,\r\n 1,\r\n num * myFact(num - 1)\r\n )\r\n)", }, 14: { 1: "データ", 2: "数式", 3: "結果" }, 15: { 1: 4 }, 16: { 1: 16 }, 17: { 1: 52 }, 19: { 1: "例2: 文字列内の文字を置換する" }, 20: { 1: "[名前の管理]で以下のように定義します:" }, 21: { 1: "名前:", 2: "ReplaceChars" }, 22: { 1: "範囲:", 2: "Workbook" }, 23: { 1: "コメント:", 2: "文字列中の指定された文字を置き換える" }, 24: { 1: "参照:", 2: '=LAMBDA(str, chars, sub\r\n IF(chars="",\r\n str,\r\n ReplaceChars(\r\n SUBSTITUTE(str, LEFT(chars), sub),\r\n MID(chars,2,LEN(chars) - 1),\r\n sub\r\n )\r\n )\r\n)', }, 34: { 1: "データ", 2: "数式", 3: "結果" }, 35: { 1: "WARNING!! <script>" }, 36: { 1: "#4 & #7 + $803*" }, 37: { 1: "Generally (#25) free" }, 39: { 1: "例3: 文字列の値を反転させる" }, 40: { 1: "3a. [名前の管理]で以下のように定義します:" }, 41: { 1: "名前:", 2: "HEAD" }, 42: { 1: "範囲:", 2: "Workbook" }, 43: { 1: "コメント:", 2: "文字列の最初の文字を返す" }, 44: { 1: "参照:", 2: '=LAMBDA(str,\r\n IF(str="",\r\n "",\r\n LEFT(str, 1)\r\n )\r\n)', }, 50: { 1: "3b. [名前の管理]で以下のように定義します:" }, 51: { 1: "名前:", 2: "TAIL" }, 52: { 1: "範囲:", 2: "Workbook" }, 53: { 1: "コメント:", 2: "文字列から1文字目を除いたものを返す" }, 54: { 1: "参照:", 2: '=LAMBDA(str,\r\n IF(str="",\r\n "",\r\n RIGHT(str, LEN(str) - 1)\r\n )\r\n)', }, 60: { 1: "3c. [名前の管理]で以下のように定義します:" }, 61: { 1: "名前:", 2: "REVERSE" }, 62: { 1: "範囲:", 2: "Workbook" }, 63: { 1: "コメント:", 2: "文字列を逆順で返す" }, 64: { 1: "参照:", 2: "=LAMBDA(str,\r\n IF(LEN(str)<2,\r\n str,\r\n REVERSE(TAIL(str)) & HEAD(str)\r\n )\r\n)", }, 70: { 1: "データ", 2: "数式", 3: "結果" }, 71: { 1: "palindrome" }, 72: { 1: "backwards" }, 73: { 1: "forwards" }, 75: { 1: "例4: 文字列が回文であるかどうかを調べる" }, 76: { 1: "[名前の管理]で以下のように定義します:" }, 77: { 1: "名前:", 2: "IsPalindrome" }, 78: { 1: "範囲:", 2: "Workbook" }, 79: { 1: "コメント:", 2: "文字列が回文である場合に TRUE を返します" }, 80: { 1: "参照:", 2: '=LAMBDA(str, \r\n LET(\r\n replaceStr, ReplaceChars(str, "!@#$%^&*()[]<>-?.,\'"" ", ""),\r\n lowStr, LOWER(replaceStr),\r\n lowStr = REVERSE(lowStr)\r\n )\r\n)', }, 87: { 1: "データ", 2: "数式", 3: "結果" }, 88: { 1: "I, man, am Regal, a German am I" }, 89: { 1: "Never odd or even" }, 90: { 1: "If I had a Hi-Fi" }, 91: { 1: "Madam, I'm Adam" }, 92: { 1: "Too hot to hoot" }, 93: { 1: "No lemons, no melon" }, 94: { 1: "Too bad I hid a boot" }, 95: { 1: "Lisa Bonet ate no basil" }, 96: { 1: "Warsaw was raw" }, 97: { 1: "Was it a car or a cat I saw?" }, }, formulas: { 15: { 2: "FORMULATEXT(D16)", 3: "MYFACT(B16)" }, 16: { 2: "FORMULATEXT(D17)", 3: "MYFACT(B17)" }, 17: { 2: "FORMULATEXT(D18)", 3: "MYFACT(B18)" }, 35: { 2: "FORMULATEXT(D36)", 3: 'REPLACECHARS(B36,"!@#$%^&*()[]<>-?.,","")' }, 36: { 2: "FORMULATEXT(D37)", 3: 'REPLACECHARS(B37,"!@#$%^&*()[]<>-?.,","")' }, 37: { 2: "FORMULATEXT(D38)", 3: 'REPLACECHARS(B38,"!@#$%^&*()[]<>-?.,","")' }, 71: { 2: "FORMULATEXT(D72)", 3: "REVERSE(B72)" }, 72: { 2: "FORMULATEXT(D73)", 3: "REVERSE(B73)" }, 73: { 2: "FORMULATEXT(D74)", 3: "REVERSE(B74)" }, 88: { 2: "FORMULATEXT(D89)", 3: "ISPALINDROME(B89)" }, 89: { 2: "FORMULATEXT(D90)", 3: "ISPALINDROME(B90)" }, 90: { 2: "FORMULATEXT(D91)", 3: "ISPALINDROME(B91)" }, 91: { 2: "FORMULATEXT(D92)", 3: "ISPALINDROME(B92)" }, 92: { 2: "FORMULATEXT(D93)", 3: "ISPALINDROME(B93)" }, 93: { 2: "FORMULATEXT(D94)", 3: "ISPALINDROME(B94)" }, 94: { 2: "FORMULATEXT(D95)", 3: "ISPALINDROME(B95)" }, 95: { 2: "FORMULATEXT(D96)", 3: "ISPALINDROME(B96)" }, 96: { 2: "FORMULATEXT(D97)", 3: "ISPALINDROME(B97)" }, 97: { 2: "FORMULATEXT(D98)", 3: "ISPALINDROME(B98)" }, }, cellStyles: { B2: 0, "B4:D4": 1, B5: 2, "B6:B8": 3, "C6:C8": 4, "D6:D8": 5, B9: 6, C9: 7, D9: 8, "B10:B13": 9, "C10:C13": 10, "D10:D13": 11, B14: 12, C14: 13, D14: 14, B15: 15, C15: 16, D15: 15, "B16:B18": 17, "C16:D18": 18, "B20:D20": 1, B21: 2, "B22:B24": 3, "C22:C24": 4, "D22:D24": 5, B25: 6, C25: 7, D25: 8, "B26:B33": 9, "C26:C33": 10, "D26:D33": 11, B34: 12, C34: 13, D34: 14, "B35:D35": 15, "B36:B38": 17, "C36:D38": 18, "B40:D40": 1, B41: 2, "B42:B44": 3, "C42:C44": 4, "D42:D44": 5, B45: 6, C45: 7, D45: 8, "B46:B49": 9, "C46:C49": 10, "D46:D49": 11, B50: 12, C50: 13, D50: 14, B51: 2, "B52:B54": 3, "C52:C54": 4, "D52:D54": 5, B55: 6, C55: 7, D55: 8, "B56:B59": 9, "C56:C59": 10, "D56:D59": 11, B60: 12, C60: 13, D60: 14, B61: 2, "B62:B64": 19, "C62:C64": 20, "D62:D64": 5, B65: 21, "C65:C70": 22, "D65:D70": 23, "B66:B69": 24, B70: 25, "B71:D71": 15, "B72:B74": 17, "C72:D74": 18, "B76:D76": 1, B77: 2, "B78:B80": 19, "C78:C80": 20, "D78:D80": 5, B81: 21, "C81:C87": 22, "D81:D87": 23, "B82:B86": 24, B87: 25, "B88:D88": 15, "B89:B98": 17, "C89:C98": 26, "D89:D98": 18, A99: 27, }, styles: { records: [ { foreColor: 0, font: 0, border: [null, null, 0] }, { foreColor: 0, font: 1, border: [null, null, 1] }, { foreColor: 0, font: 1 }, { backColor: 2, foreColor: 1, font: 1, border: [2, 2, 2, 2] }, { backColor: 3, font: 1, border: [2, null, 2, 2] }, { backColor: 3, font: 1, border: [2, 2, 2] }, { backColor: 2, foreColor: 1, font: 1, border: [2, 2, null, 2] }, { backColor: 3, font: 1, wordWrap: true, border: [2, null, null, 2] }, { backColor: 3, font: 1, wordWrap: true, border: [2, 2] }, { backColor: 2, foreColor: 1, font: 1, border: [null, 2, null, 2] }, { backColor: 3, font: 1, wordWrap: true, border: [null, null, null, 2] }, { backColor: 3, font: 1, wordWrap: true, border: [null, 2] }, { backColor: 2, foreColor: 1, font: 1, border: [null, 2, 2, 2] }, { backColor: 3, font: 1, wordWrap: true, border: [null, null, 2, 2] }, { backColor: 3, font: 1, wordWrap: true, border: [null, 2, 2] }, { backColor: 4, foreColor: 1, font: 1 }, { backColor: 4, foreColor: 1, font: 1, border: [2] }, { backColor: 6, foreColor: 5, border: [3, 3, 3, 3] }, { backColor: 8, foreColor: 7, font: 1, border: [3, 3, 3, 3] }, { backColor: 2, foreColor: 1, font: 1, border: [2, null, 2, 2] }, { backColor: 3, font: 1, border: [2, null, 2] }, { backColor: 2, foreColor: 1, font: 1, border: [2, null, null, 2] }, { backColor: 3, font: 1, wordWrap: true, border: [2, null, 2] }, { backColor: 3, font: 1, wordWrap: true, border: [2, 2, 2] }, { backColor: 2, foreColor: 1, font: 1, border: [null, null, null, 2] }, { backColor: 2, foreColor: 1, font: 1, border: [null, null, 2, 2] }, { backColor: 8, foreColor: 7, font: 1, border: [3, null, 3, 3] }, { foreColor: 9 }, ], borders: [ { color: "#accdea", style: 5 }, { color: "#9bc3e6", style: 2 }, { color: "#000000", style: 1 }, { color: "#7f7f7f", style: 1 }, ], colors: ["#44546a", "#ffffff", "#4472c4", "#d9e3f2", "#5b9bd5", "#3f3f76", "#ffcc99", "#fa7d00", "#f2f2f2", "#0563c1"], fonts: ["700 17.3px Calibri", "700 14.7px Calibri"], }, others: { columnWidth: { 0: 36, 1: 172, 2: 300, 3: 141 }, rowHeight: { 1: 24, 2: 21, 3: 21, 19: 21, 39: 21, 75: 21 }, spans: ["B81:B87", "B65:B70", "C45:D50", "C55:D60", "C65:D70", "C81:D87", "C9:D14", "C25:D34"], }, }, Calendar: { values: { 0: { 1: "Calendar関数" }, 2: { 1: "この例のLAMBDA関数は、連続した日付からセル範囲にカレンダーを生成します。" }, 5: { 1: "Calendarの構文:" }, 6: { 1: "=CALENDAR(serial, mark)" }, 7: { 1: "serial: カレンダーを生成するための連続した日付。" }, 8: { 1: 'mark: 連続した日付に "X " 印を付ける場合はTrue、それ以外はFalse。' }, 10: { 1: "この例のLAMBDA関数は複雑で、いくつかの定義済みの名前が必要です:" }, 12: { 1: "名前:", 2: "months" }, 13: { 1: "参照:", 2: '={"Jan";"Feb";"Mar";"Apr";"May";"Jun";"Jul";"Aug";"Sep";"Oct";"Nov";"Dec"}', }, 15: { 1: "名前:", 2: "days" }, 16: { 1: "参照:", 2: '={"Mon";"Tue";"Wed";"Thu";"Fri";"Sat";"Sun"}' }, 18: { 1: "名前:", 2: "getDay" }, 19: { 1: "範囲:", 2: "Workbook" }, 20: { 1: "コメント:", 2: "連続する日付の曜日をテキストで取得します。" }, 21: { 1: "参照:", 2: "=LAMBDA(serial, INDEX(days, WEEKDAY(serial, 2),1))" }, 23: { 1: "名前:", 2: "vcat" }, 24: { 1: "範囲:", 2: "Workbook" }, 25: { 1: "コメント:", 2: "2つの配列を順に重ねて1つの配列に連結します。", }, 27: { 1: "参照:", 2: "=LAMBDA(top,bot,\r\n LET(width, MIN(COLUMNS(top), COLUMNS(bot)),\r\n topH, ROWS(top),\r\n arrayMAKE(ROWS(bot)+topH, width,\r\n LAMBDA(i,j,\r\n IF(i <= topH,\r\n INDEX(top, i, j),\r\n INDEX(bot, i-topH, j)\r\n )\r\n )\r\n )\r\n )\r\n)", }, 41: { 1: "LAMBDAの実装" }, 42: { 1: "[名前の管理]で以下のように定義します:" }, 43: { 1: "名前:", 2: "Calendar" }, 44: { 1: "範囲:", 2: "Workbook" }, 45: { 1: "コメント:", 2: "連続した日付からセル範囲にカレンダーを生成します。" }, 46: { 1: "参照:", 2: '=LAMBDA(serial, mark,\r\n LET(daysInMonth, EOMONTH(serial, 0)-EOMONTH(serial, -1),\r\n foMonth, DATE(YEAR(serial), MONTH(serial), 1),\r\n dayPadding, WEEKDAY(foMonth, 2)-1,\r\n calendarRows, ROUNDUP((dayPadding+daysInMonth)/7, 0),\r\n body, arrayMAKE(calendarRows, 7,\r\n LAMBDA(i, j,\r\n LET(seqNum, ((i-1)*7+j)-dayPadding,\r\n IFS(seqNum<=0, "",\r\n seqNum=DAY(serial), IF(mark, "X", seqNum),\r\n seqNum<=daysInMonth, seqNum,\r\n TRUE, ""\r\n )\r\n )\r\n )\r\n ),\r\n vcat(\r\n arrayMAKE(1, 7,\r\n LAMBDA(i, j,\r\n IF(j=1,\r\n INDEX(months, MONTH(serial)),\r\n IF(j=2,\r\n YEAR(serial), \r\n ""\r\n )\r\n )\r\n )\r\n ),\r\n arrayMAKE(calendarRows+1, 7,\r\n LAMBDA(i, j,\r\n IF(i=1,\r\n INDEX(days, j, 1), \r\n INDEX(body, i-1, j)\r\n )\r\n )\r\n )\r\n)))', }, 84: { 1: "例" }, 85: { 1: "日付:", 2: "2021-12-31T16:00:00.000Z", 4: "数式:" }, 86: { 1: "マーク:", 2: false, 4: "結果:" } }, formulas: { 85: { 5: "FORMULATEXT(F87)" }, 86: { 5: "CALENDAR(C86,C87)" } }, cellStyles: { B1: 0, "B3:H4": 1, "B6:C6": 2, "B7:C7": 3, "B8:H9": 4, "B11:H12": 1, "B13:B14": 5, "C13:C14": 6, "D13:G14": 7, "H13:H14": 8, "B16:B17": 5, "C16:C17": 6, "D16:G17": 7, "H16:H17": 8, "B19:B22": 5, "C19:C22": 6, "D19:G22": 7, "H19:H22": 8, "B24:B25": 5, "C24:C25": 6, "D24:G25": 7, "H24:H25": 8, B26: 9, C26: 10, "D26:G26": 11, H26: 12, B27: 13, C27: 14, "D27:G27": 15, H27: 16, B28: 9, C28: 10, "D28:G28": 11, H28: 12, "B29:B39": 17, "C29:C39": 18, "D29:G39": 19, "H29:H39": 20, B40: 13, C40: 14, "D40:G40": 15, H40: 16, "B42:D42": 21, B43: 2, "B44:B83": 5, "C44:H45": 22, "C46:H83": 23, B85: 21, "B86:B87": 24, "C86:C87": 25, "E86:E87": 24, "F86:L94": 3, }, styles: { records: [ { font: 0 }, { foreColor: 0, font: 1, wordWrap: true }, { foreColor: 0, font: 1 }, { backColor: 2, foreColor: 1, font: 1, border: [0, 0, 0, 0] }, { backColor: 3, border: [1, 1, 1, 1] }, { backColor: 5, foreColor: 4, font: 1, border: [2, 2, 2, 2] }, { backColor: 6, font: 1, border: [2, null, 2, 2] }, { backColor: 6, font: 1, border: [2, null, 2] }, { backColor: 6, font: 1, border: [2, 2, 2] }, { backColor: 5, foreColor: 4, font: 1, border: [2, 2, null, 2] }, { backColor: 6, font: 1, wordWrap: true, border: [2, null, null, 2] }, { backColor: 6, font: 1, wordWrap: true, border: [2] }, { backColor: 6, font: 1, wordWrap: true, border: [2, 2] }, { backColor: 5, foreColor: 4, font: 1, border: [null, 2, 2, 2] }, { backColor: 6, font: 1, wordWrap: true, border: [null, null, 2, 2] }, { backColor: 6, font: 1, wordWrap: true, border: [null, null, 2] }, { backColor: 6, font: 1, wordWrap: true, border: [null, 2, 2] }, { backColor: 5, foreColor: 4, font: 1, border: [null, 2, null, 2] }, { backColor: 6, font: 1, wordWrap: true, border: [null, null, null, 2] }, { backColor: 6, font: 1, wordWrap: true }, { backColor: 6, font: 1, wordWrap: true, border: [null, 2] }, { foreColor: 0, font: 2, border: [null, null, 3] }, { backColor: 6, font: 1, border: [2, 2, 2, 2] }, { backColor: 6, font: 1, wordWrap: true, border: [2, 2, 2, 2] }, { backColor: 7, foreColor: 4, border: [2, 2, 2, 2] }, { backColor: 9, foreColor: 8, border: [0, 0, 0, 0] }, ], borders: [ { color: "#7f7f7f", style: 1 }, { color: "#b2b2b2", style: 1 }, { color: "#000000", style: 1 }, { color: "#accdea", style: 5 }, ], colors: ["#44546a", "#fa7d00", "#f2f2f2", "#ffffcc", "#ffffff", "#4472c4", "#d9e3f2", "#5b9bd5", "#3f3f76", "#ffcc99"], fonts: ["700 24px Calibri", "700 14.7px Calibri", "700 17.3px Calibri"], }, others: { columnWidth: { 0: 36, 1: 78, 2: 83 }, rowHeight: { 0: 31, 41: 24, 42: 21, 84: 24, 85: 21 }, spans: [ "C16:H16", "C17:H17", "C47:H83", "C44:H44", "C45:H45", "C13:H13", "C14:H14", "C46:H46", "B47:B83", "C24:H24", "C25:H25", "B26:B27", "C26:H27", "B28:B40", "C28:H40", "B3:H4", "B11:H12", "C19:H19", "C20:H20", "C21:H21", "C22:H22", ], }, }, NiceAxis: { values: { 0: { 1: "NiceAxis関数" }, 2: { 1: "この例のLAMBDA関数は、グラフ化するデータの最小値と最大値から、適切な軸の境界と増分値を計算する。", }, 5: { 1: "NiceAxisの構文:" }, 6: { 1: "=NiceAxis(min, max)" }, 7: { 1: "min: グラフ化するデータの最小値。" }, 8: { 1: "max: グラフ化するデータの最大値。" }, 10: { 1: "LAMBDAの実装" }, 11: { 1: "[名前の管理]で以下のように定義します:" }, 12: { 1: "名前:", 2: "Calendar" }, 13: { 1: "範囲:", 2: "Workbook" }, 14: { 1: "コメント:", 2: "グラフの適切な軸の境界と増分値を計算します" }, 15: { 1: "参照:", 2: "=LAMBDA(min_0,max_0,\r\n LET(\r\n min_1,MIN(min_0,max_0),\r\n max_1,MAX(min_0,max_0),\r\n delta,IF(min_1=max_1,9,max_1-min_1),\r\n min_2,\r\n IF(min_1=0,\r\n 0,\r\n IF(min_1>0,\r\n MAX(0,min_1-delta/100),\r\n min_1-delta/100\r\n )\r\n ),\r\n max_2,\r\n IF(max_1=0,\r\n IF(min_1=0,1,0),\r\n IF(max_1<0,\r\n MIN(0,max_1+delta/100),\r\n max_1+delta/100\r\n )\r\n ),\r\n power,LOG10(max_2-min_2),\r\n factor,10^(power-INT(power)),\r\n major_3,\r\n XLOOKUP(\r\n factor,\r\n {0,2.1,5,10},\r\n {0.2,0.5,1,2},,\r\n -1\r\n )*10^INT(power),\r\n min_3,major_3*INT(min_2/major_3),\r\n max_3,\r\n major_3*\r\n IF(max_2/major_3=INT(max_2/major_3),\r\n max_2/major_3,\r\n INT(max_2/major_3)+1\r\n ),\r\n CHOOSE({1;2;3},min_3,max_3,major_3)\r\n )\r\n)", }, 56: { 1: "例" }, 57: { 1: "データ", 3: "数式:" }, 58: { 1: 12.5, 3: "最小値" }, 59: { 1: 23.6, 3: "最大値" }, 60: { 1: 22.8, 3: "増分値" }, 61: { 1: 38.3 }, 62: { 1: 92.6 }, 63: { 1: 37.8 }, 64: { 1: 42.9 }, 65: { 1: 83.7 }, 66: { 1: 16.9 }, 67: { 1: 44.8 }, }, formulas: { 57: { 4: "FORMULATEXT(E59)" }, 58: { 4: "NICEAXIS(MIN(B59:B68),MAX(B59:B68))" } }, cellStyles: { B1: 0, "B3:H4": 1, "B6:C6": 2, "B7:C7": 3, "B8:F9": 4, B10: 2, "B11:D11": 5, B12: 2, "B13:B55": 6, "C13:G14": 7, "C15:G55": 8, B57: 5, B58: 9, "D58:D61": 10, "E58:E61": 3, "F58:G58": 3, "B59:B68": 11, }, styles: { records: [ { font: 0 }, { foreColor: 0, font: 1, wordWrap: true }, { foreColor: 0, font: 1 }, { backColor: 2, foreColor: 1, font: 1, border: [0, 0, 0, 0] }, { backColor: 3, border: [1, 1, 1, 1] }, { foreColor: 0, font: 2, border: [null, null, 2] }, { backColor: 5, foreColor: 4, font: 1, border: [3, 3, 3, 3] }, { backColor: 6, font: 1, border: [3, 3, 3, 3] }, { backColor: 6, font: 1, wordWrap: true, border: [3, 3, 3, 3] }, { backColor: 7, foreColor: 4, font: 1 }, { backColor: 7, foreColor: 4, font: 1, border: [3, 3, 3, 3] }, { backColor: 9, foreColor: 8, border: [0, 0, 0, 0] }, ], borders: [ { color: "#7f7f7f", style: 1 }, { color: "#b2b2b2", style: 1 }, { color: "#accdea", style: 5 }, { color: "#000000", style: 1 }, ], colors: ["#44546a", "#fa7d00", "#f2f2f2", "#ffffcc", "#ffffff", "#4472c4", "#d9e3f2", "#5b9bd5", "#3f3f76", "#ffcc99"], fonts: ["700 24px Calibri", "700 14.7px Calibri", "700 17.3px Calibri"], }, others: { columnWidth: { 0: 36, 1: 86, 6: 130 }, rowHeight: { 0: 31, 10: 24, 11: 21, 56: 24, 57: 21 }, spans: ["B3:H4", "B16:B55", "C16:G55", "C13:G13", "C14:G14", "C15:G15"], }, }, customNames: { arrayMAKE: "LAMBDA(r,c,f, LET(seq, SEQUENCE(r,c), IF(seq, LET(i, ROUNDDOWN((seq-1)/c, 0)+1, j, MOD(seq-1,c)+1, f(i,j)))))", Calendar: 'LAMBDA(serial,mark, LET(daysInMonth, EOMONTH(serial, 0)-EOMONTH(serial, -1), foMonth, DATE(YEAR(serial), MONTH(serial), 1), dayPadding, WEEKDAY(foMonth, 2)-1, calendarRows, ROUNDUP((dayPadding+daysInMonth)/7, 0), body, arrayMAKE(calendarRows, 7, LAMBDA(i,j, LET(seqNum, ((i-1)*7+j)-dayPadding, IFS(seqNum<=0, "", seqNum=DAY(serial), IF(mark, "X", seqNum), seqNum<=daysInMonth, seqNum, TRUE, "" ) ) ) ), vcat( arrayMAKE(1, 7, LAMBDA(i,j, IF(j=1, INDEX(months, MONTH(serial)), IF(j=2, YEAR(serial), "" ) ) ) ), arrayMAKE(calendarRows+1, 7, LAMBDA(i,j, IF(i=1, INDEX(days, j, 1), INDEX(body, i-1, j) ) ) ) )))', days: '{"Mon";"Tue";"Wed";"Thu";"Fri";"Sat";"Sun"}', getDay: "LAMBDA(serial, INDEX(days, WEEKDAY(serial, 2), 1))", HEAD: 'LAMBDA(str, IF(str="", "", LEFT(str,1)))', IsPalindrome: 'LAMBDA(str, LET( replaceStr, ReplaceChars(str, "!@#$%^&*()[]<>-?.,\'"" ", ""), lowStr, LOWER(replaceStr), lowStr = REVERSE(lowStr) ) )', months: '{"Jan";"Feb";"Mar";"Apr";"May";"Jun";"Jul";"Aug";"Sep";"Oct";"Nov";"Dec"}', myFact: "LAMBDA(num, IF(num<2, 1, num * myFact(num - 1) ) )", NiceAxis: "LAMBDA(min_0,max_0, LET( min_1,MIN(min_0,max_0), max_1,MAX(min_0,max_0), delta,IF(min_1=max_1,9,max_1-min_1), min_2, IF(min_1=0, 0, IF(min_1>0, MAX(0,min_1-delta/100), min_1-delta/100 ) ), max_2, IF(max_1=0, IF(min_1=0,1,0), IF(max_1<0, MIN(0,max_1+delta/100), max_1+delta/100 ) ), power,LOG10(max_2-min_2), factor,10^(power-INT(power)), major_3, XLOOKUP( factor, {0,2.1,5,10}, {0.2,0.5,1,2},, -1 )*10^INT(power), min_3,major_3*INT(min_2/major_3), max_3, major_3* IF(max_2/major_3=INT(max_2/major_3), max_2/major_3, INT(max_2/major_3)+1 ), CHOOSE({1;2;3},min_3,max_3,major_3) ) )", ReplaceChars: 'LAMBDA(str,chars,sub, IF(chars="", str, ReplaceChars( SUBSTITUTE(str, LEFT(chars), sub), MID(chars,2,LEN(chars) - 1), sub ) ) )', REVERSE: "LAMBDA(str, IF(LEN(str)<2, str, REVERSE(TAIL(str)) & HEAD(str) ) )", TAIL: 'LAMBDA(str, IF(str="", "", RIGHT(str, LEN(str) - 1)))', vcat: "LAMBDA(top,bot, LET(width, MIN(COLUMNS(top), COLUMNS(bot)), topH, ROWS(top), arrayMAKE(ROWS(bot)+topH, width, LAMBDA(i,j, IF(i <= topH, INDEX(top, i, j), INDEX(bot, i-topH, j) ) ) ) ) )", }, }; window.onload = function () { var workbook = new GC.Spread.Sheets.Workbook(document.getElementById("ss")); workbook.options.allowDynamicArray = true; workbook.suspendPaint(); // add custom name foreachObj(data.customNames, function (name, formula) { workbook.addCustomName(name, formula); }); workbook.setSheetCount(3); workbook.sheets[0].name("Recursive"); workbook.sheets[1].name("Calendar"); workbook.sheets[2].name("NiceAxis"); initSheet(workbook.getSheet(0), data.Recursive); initSheet(workbook.getSheet(1), data.Calendar); initSheet(workbook.getSheet(2), data.NiceAxis); workbook.getSheet(1).setValue(85, 2, new Date(2022, 0, 1)); workbook.resumePaint(); }; function initSheet(sheet, data) { setSheetPr(sheet, data); setCells(sheet, data); } function setCells(sheet, data) { foreachObj(data.values, function (r, row) { foreachObj(row, function (c, v) { setValue(sheet, Number(r), Number(c), v); }); }); foreachObj(data.formulas, function (r, row) { foreachObj(row, function (c, v) { setFormula(sheet, Number(r), Number(c), v); }); }); foreachObj(data.cellStyles, function (ref, id) { setStyle(sheet, ref, data.styles.records[id], data.styles); }); } function setValue(sheet, r, c, v) { if (v === undefined || v === null) return; sheet.setValue(r, c, v); } function setFormula(sheet, r, c, v) { if (v === undefined || v === null) return; sheet.setFormula(r, c, v); } function setStyle(sheet, ref, v, styles) { if (v === undefined || v === null) return; var range = sheet.getRange(ref); var foreColor = styles.colors[v.foreColor]; var backColor = styles.colors[v.backColor]; var font = styles.fonts[v.font]; var wordWrap = v.wordWrap; if (foreColor) { range.foreColor(foreColor); } if (backColor) { range.backColor(backColor); } if (font) { range.font(font); } if (wordWrap) { range.wordWrap(wordWrap); } var border = v.border || []; var borderTop = styles.borders[border[0]]; var borderRight = styles.borders[border[1]]; var borderBottom = styles.borders[border[2]]; var borderLeft = styles.borders[border[3]]; if (borderTop) { range.borderTop(createLineStyle(borderTop)); } if (borderBottom) { range.borderBottom(createLineStyle(borderBottom)); } if (borderLeft) { range.borderLeft(createLineStyle(borderLeft)); } if (borderRight) { range.borderRight(createLineStyle(borderRight)); } } function setSheetPr(sheet, data) { // set column width foreachObj(data.others.columnWidth, function (index, v) { sheet.setColumnWidth(Number(index), v); }); // set row height foreachObj(data.others.rowHeight, function (index, v) { sheet.setRowHeight(Number(index), v); }); // set spans var spans = data.others.spans || []; for (var i = 0; i < spans.length; i++) { var range = sheet.getRange(spans[i]); sheet.addSpan(range.row, range.col, range.rowCount, range.colCount); } // set tables var tables = data.others.tables || []; for (var i = 0; i < tables.length; i++) { var table = tables[i]; var range = sheet.getRange(table.ref); sheet.tables.add(table.name, range.row, range.col, range.rowCount, range.colCount); } } function createLineStyle(v) { return new GC.Spread.Sheets.LineBorder(v.color, v.style); } function foreachObj(obj, func) { if (!obj) return; var keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var v = obj[key]; func(key, v); } }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta name="spreadjs culture" content="ja-jp" /> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-resources-ja/dist/gc.spread.sheets.resources.ja.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> </body> </html>
input[type="text"] { width: 200px; margin-right: 20px; } label { display: inline-block; width: 110px; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: 100%; height: 100%; overflow: hidden; float: left; } label { display: block; margin-bottom: 6px; } input { padding: 4px 6px; } input[type=button] { margin-top: 6px; display: block; width:216px; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } code { border: 1px solid #000; }