SpreadJS製品ヘルプ
動的配列数式
SpreadJS > 開発者の手引き > 機能 > ユーザーインタフェースの管理 > 数式 > 動的配列数式

Spread.Sheetsでは、配列数式を拡張した動的配列数式がサポートされています。

使用例

動的配列数式は、セル範囲を自動スピルおよび範囲指定することで、複数の結果を出力として返し、スプレッドシート内の配列数式を簡単ですばやく処理できます。

動的配列数式は、次の場合に役立ちます。

UNIQUE 関数

UNIQUE関数は、セル範囲内のすべての一意の値の一覧を返します。

たとえば、セルC4で設定されている数式「=UNIQUE(A4:A15)」がセル範囲A4~A15の値から一意の顧客名のみを返します。次の図で示すように、 一意の値の数に基づいて、動的配列式はセル範囲C5~C8に自動的にスピルされます。

 

FILTER 関数

FILTER関数を使用することで、定義されている条件に基づいてセル範囲をフィルタできます。フィルタ操作では、単一または複数の条件を適用できます。 2つ以上のフィルタ条件を組み合わせて使用するには、「*」演算子を使用できます。

たとえば、セルF5で設定されている数式「=FILTER(A5:D17, C5:C17=F1)」が
あるフィルター条件(セル範囲C5~C17がセルF1の値りんごと一致する場合)に基づいてセル範囲A5~D17をフィルタします。セル範囲A5~D17内に製品が「りんご」となっている項目がすべて表示されます。

 

この図では、セルF14で設定されている数式「=FILTER(A5:D17, (C5:C17=F1)*(A5:A17=F2))」が、乗算演算子(*)を使用することで、セル範囲A5~D17に2つのフィルタ条件を適用します。最初の条件は、セル範囲C5~C17がセルF1の製品値「りんご」に一致することです。また、2番目の条件は、セル範囲A5~A17が地域「東」に一致することです。 その結果、セル範囲A5~D17から製品が「りんご」および地域が「東」となっている項目がすべて表示されます。

RANDARRAY 関数

RANDARRAY 関数は、ランダムな数値の配列を返します。行と列の数、最小値と最大値、および整数または 10 進数の値を返すかどうかを指定できます。

たとえば、次の図では、セルA8に設定されている数式「=RANDARRAY(5,3)」が0~1の範囲の乱数値セットを返します。

SORT 関数

SORT 関数を使用することで、範囲または配列のデータを並べ替えます。本関数の結果は、昇順(増加)または降順(減少)で並べている値の動的配列を持つ範囲になります。


たとえば、セルD4で設定されている数式「=SORT(A4:A15)」が、昇順で並べ替えられている顧客名を返します。

 

セルA4~A15の範囲内のすべての一意の値を並べ替えるには、列C4に表示される一意の一覧にSORT関数を適用するか、SORT関数とUNIQUE関数を組み合わせて単一の数式として使用できます。

たとえば、セルE4で設定されている数式「=SORT(C4#)」(「#」は一覧を示す)が、列C(セルC4ではすでにUNIQUE関数「=UNIQUE(A4:A15)」が設定されている)の値のリストをソートし、結果を列Eに表示します。

または、SORTとUNIQUEの両方の関数を組み合わせることもできます。 たとえば、次の図では、セルF4に数式「=SORT(UNIQUE(A4:A15))」が設定されていて、A4:A15の範囲内のすべての一意の値がアルファベット順に並べ替えられます。

SORT BY 関数

SORTBY 関数は、範囲または配列の内容を、対応する範囲または配列の値に基づいて並べ替えます。

たとえば、セルG4で設定されている数式「=SORTBY(A4:B15,B4:B15)」が、セル範囲A4~B15を別のセル範囲B4~B15に基づいて並べ替え、顧客名を年齢昇順で並べ替えて表示します。

SEQUENCE 関数

SEQUENCE関数は、連続した数値の一覧を昇順で配列として返します。

たとえば、セルA2で設定されている数式「=SEQUENCE(4,5)」が、1、2、3、4など(20まで)の数値を順序で4行5列のセル範囲で並べた配列返します。

SINGLE 関数

SINGLE関数は、共通部分ロジックを使用して、単一の値、単一のセル範囲、またはエラーを返します。

たとえば、セルA15で設定されている数式「=SINGLE(A15:E15)」が、セル範囲A15〜E15の行と列の共通 部分を評価してセルC16にその結果「C」を返します。

スピル配列数式

スプレッドシートで一般的な数式を使用する際、計算するすべてのセルに数式を手動でコピーする必要があるため、非常に不便となります。セルに動的配列数式が使用されている場合、配列の要素は隣接する空のセルにスピルされ、複数の値が返されます。

スピル-すべての数式が配列内の複数の値を返す場合、計算されたデータが隣接するセルに自動的に入力される動作は、スピルと呼ばれます。 複数の結果を返す可能性がある数式は、動的配列数式と呼ばれます。

スピル配列数式- スプレッドシートのセル範囲にて複数の値を返し、正常にスピルされている数式を、スピル配列数式と呼ばれます。

スピル範囲演算子- スピル範囲演算子(#)を使用することで、スピル範囲全体を参照できます。 数式が複数の値を返す場合、#スピルのエラーが返されます。

動的配列関数を有効にする

スプレッドシートで動的配列関数を使用するには、次のサンプルコードで示すように、動的配列を有効にする必要があります。

JavaScript
コードのコピー
// 動的配列を有効にします。
spread.options.allowDynamicArray = true;

 

コードの使用

次のサンプルコードは、スプレッドシートで動的配列関数を使用する方法を示しています。

JavaScript
コードのコピー
// Spreadを初期化します。
var spread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'), {
  sheetCount: 4
});
// activesheetを取得します。
var activeSheet = spread.getActiveSheet();
// 動的配列を有効にします。
spread.options.allowDynamicArray = true;
activeSheet.FrozenRowCount = 1;
activeSheet.setText(0, 0, "動的配列関数");
activeSheet.getCell(0, 0).backColor("LightGray");
activeSheet.addSpan(0, 0, 1, 3, GC.Spread.Sheets.SheetArea.viewport);
// Sheet[0] のセルにデータを設定します。
activeSheet.setText(2, 0, "名前");
activeSheet.getCell(2, 0).backColor("LightGray");
activeSheet.setText(3, 0, "Larry");
activeSheet.setText(4, 0, "Safeway");
activeSheet.setText(5, 0, "Safeway");
activeSheet.setText(6, 0, "Raley");
activeSheet.setText(7, 0, "Vallarta");
activeSheet.setText(8, 0, "Safeway");
activeSheet.setText(9, 0, "Raley");
activeSheet.setText(10, 0, "Larry");
activeSheet.setText(11, 0, "Gilbert");
activeSheet.setText(12, 0, "Larry");
activeSheet.setText(13, 0, "Larry");
activeSheet.setText(14, 0, "Raley");
activeSheet.setColumnWidth(0, 120.0, GC.Spread.Sheets.SheetArea.viewport);
activeSheet.setText(2, 1, "年齢");
activeSheet.getCell(2, 1).backColor("LightGray");
activeSheet.setText(3, 1, "32");
activeSheet.setText(4, 1, "23");
activeSheet.setText(5, 1, "23");
activeSheet.setText(6, 1, "39");
activeSheet.setText(7, 1, "18");
activeSheet.setText(8, 1, "23");
activeSheet.setText(9, 1, "39");
activeSheet.setText(10, 1, "32");
activeSheet.setText(11, 1, "19");
activeSheet.setText(12, 1, "32");
activeSheet.setText(13, 1, "32");
activeSheet.setText(14, 1, "39");
activeSheet.setColumnWidth(1, 50.0, GC.Spread.Sheets.SheetArea.viewport);
// UNIQUE数式を設定します。
activeSheet.setText(2, 2, "一意のリスト");
activeSheet.getCell(2, 2).backColor("LightBlue");
activeSheet.setFormula(3, 2, "UNIQUE(A4:A15)");
activeSheet.setColumnWidth(2, 90.0, GC.Spread.Sheets.SheetArea.viewport);
// Sort 数式を設定します。
activeSheet.setText(2, 3, "ソートされた名前");
activeSheet.getCell(2, 3).backColor("LightBlue");
activeSheet.setFormula(3, 3, "SORT(A4:A15)");
activeSheet.setColumnWidth(3, 90.0, GC.Spread.Sheets.SheetArea.viewport);
// 一意リストにSort 数式を設定します。
activeSheet.setText(2, 4, "ソートされた一意の値");
activeSheet.getCell(2, 4).backColor("LightBlue");
activeSheet.setFormula(3, 4, "SORT(C4#)");
activeSheet.setColumnWidth(4, 90.0, GC.Spread.Sheets.SheetArea.viewport);
// Sort とUnique数式、両方を設定します。
activeSheet.setText(2, 5, "ソートされた一意の値");
activeSheet.getCell(2, 5).backColor("LightBlue");
activeSheet.setFormula(3, 5, "SORT(UNIQUE(A4:A15)");
activeSheet.setColumnWidth(5, 90.0, GC.Spread.Sheets.SheetArea.viewport);
// SortBy 数式を設定してB4:B15の範囲に基づいてA4:B15の範囲を並べ替えます。
activeSheet.setText(2, 6, "SortBy");
activeSheet.getCell(2, 6).backColor("LightBlue");
activeSheet.setFormula(3, 6, "SORTBY(A4:B15, B4:B15)");
activeSheet.setColumnWidth(6, 90.0, GC.Spread.Sheets.SheetArea.viewport);
// 2番目のシートを取得します。
var activeSheet = spread.getSheet(1);
// Sheet[1]のセルにデータを設定します。
for (var i = 0; i < 9; i++)
  activeSheet.setColumnWidth(i, 70.0, GC.Spread.Sheets.SheetArea.viewport);
activeSheet.setText(3, 0, "地域");
activeSheet.getCell(3, 0).backColor("LightGray");
activeSheet.setText(4, 0, "東");
activeSheet.setText(5, 0, "北");
activeSheet.setText(6, 0, "西");
activeSheet.setText(7, 0, "東");
activeSheet.setText(8, 0, "東");
activeSheet.setText(9, 0, "東");
activeSheet.setText(10, 0, "西");
activeSheet.setText(11, 0, "南");
activeSheet.setText(12, 0, "北");
activeSheet.setText(13, 0, "北");
activeSheet.setText(14, 0, "東");
activeSheet.setText(15, 0, "南");
activeSheet.setText(16, 0, "西");
activeSheet.setText(3, 1, "販売員");
activeSheet.getCell(3, 1).backColor("LightGray");
activeSheet.setText(4, 1, "Tom");
activeSheet.setText(5, 1, "Fred");
activeSheet.setText(6, 1, "Amy");
activeSheet.setText(7, 1, "Sal");
activeSheet.setText(8, 1, "Hector");
activeSheet.setText(9, 1, "Xi");
activeSheet.setText(10, 1, "Amy");
activeSheet.setText(11, 1, "Sal");
activeSheet.setText(12, 1, "Fred");
activeSheet.setText(13, 1, "Tom");
activeSheet.setText(14, 1, "Hector");
activeSheet.setText(15, 1, "Sravan");
activeSheet.setText(16, 1, "Xi");
activeSheet.setText(3, 2, "製品");
activeSheet.getCell(3, 2).backColor("LightGray");
activeSheet.setText(4, 2, "りんご");
activeSheet.setText(5, 2, "ぶどう");
activeSheet.setText(6, 2, "梨");
activeSheet.setText(7, 2, "バナナ");
activeSheet.setText(8, 2, "りんご");
activeSheet.setText(9, 2, "バナナ");
activeSheet.setText(10, 2, "バナナ");
activeSheet.setText(11, 2, "梨");
activeSheet.setText(12, 2, "りんご");
activeSheet.setText(13, 2, "ぶどう");
activeSheet.setText(14, 2, "ぶどう");
activeSheet.setText(15, 2, "りんご");
activeSheet.setText(16, 2, "ぶどう");
activeSheet.setText(3, 3, "単位");
activeSheet.getCell(3, 3).backColor("LightGray");
activeSheet.setText(4, 3, "6380");
activeSheet.setText(5, 3, "2344");
activeSheet.setText(6, 3, "3434");
activeSheet.setText(7, 3, "5461");
activeSheet.setText(8, 3, "2341");
activeSheet.setText(9, 3, "3234");
activeSheet.setText(10, 3, "6532");
activeSheet.setText(11, 3, "7323");
activeSheet.setText(12, 3, "2334");
activeSheet.setText(13, 3, "8734");
activeSheet.setText(14, 3, "1932");
activeSheet.setText(15, 3, "7682");
activeSheet.setText(16, 3, "3293");
activeSheet.setText(0, 4, "製品:");
activeSheet.getCell(0, 4).backColor("LightGray");
activeSheet.setText(0, 5, "りんご");
activeSheet.setText(1, 4, "地域:");
activeSheet.getCell(1, 4).backColor("LightGray");
activeSheet.setText(1, 5, "東");
activeSheet.setText(2, 5, "1つの条件に基づいて実行されているフィルタリング");
activeSheet.getCell(2, 5).backColor("LightBlue");
activeSheet.addSpan(2, 5, 1, 4, GC.Spread.Sheets.SheetArea.viewport);
activeSheet.setText(3, 5, "地域");
activeSheet.getCell(3, 5).backColor("LightGray");
activeSheet.setText(3, 6, "販売員");
activeSheet.getCell(3, 6).backColor("LightGray");
activeSheet.setText(3, 7, "製品");
activeSheet.getCell(3, 7).backColor("LightGray");
activeSheet.setText(3, 8, "単位");
activeSheet.getCell(3, 8).backColor("LightGray");
// Filter数式(1つの条件)を設定して、C5:C21の範囲内の値がセルF1の値と一致する
// 基準に基づいてA5:D21範囲の項目をフィルタします。
activeSheet.setFormula(4, 5, "FILTER(A5:D21, C5:C21=F1)", GC.Spread.Sheets.SheetArea.viewport);
activeSheet.setText(12, 5, "地域");
activeSheet.getCell(12, 5).backColor("LightGray");
activeSheet.setText(12, 6, "販売員");
activeSheet.getCell(12, 6).backColor("LightGray");
activeSheet.setText(12, 7, "製品");
activeSheet.getCell(12, 7).backColor("LightGray");
activeSheet.setText(12, 8, "単位");
activeSheet.getCell(12, 8).backColor("LightGray");
activeSheet.setText(11, 5, "複数の条件に基づいて実行されているフィルタリング");
activeSheet.getCell(11, 5).backColor("LightBlue");
activeSheet.addSpan(11, 5, 1, 4, GC.Spread.Sheets.SheetArea.viewport);
// Filter数式(2つの条件)を設定して、C5:C21の範囲内の値がセルF1の値と一致する、
// かつ、A5:A21の範囲内の値がセルF2の値と一致する基準に基づいてA5:D21範囲の項目をフィルタします。
activeSheet.setFormula(13, 5, "FILTER(A5:D21, (C5:C21=F1)*(A5:A21=F2))", GC.Spread.Sheets.SheetArea.viewport);
// 2番目のシートを取得します。
var activeSheet = spread.getSheet(2);
for (var i = 0; i < 7; i++)
  activeSheet.setColumnWidth(i, 130.0, GC.Spread.Sheets.SheetArea.viewport);
// Sequence 数式を設定します。
FormulaactiveSheet.Columns[0, 7].Width = 130;
activeSheet.setText(0, 0, "SEQUENCE(4,5) Function");
activeSheet.addSpan(0, 0, 1, 2, GC.Spread.Sheets.SheetArea.viewport);
activeSheet.getCell(0, 0).backColor("SkyBlue");
activeSheet.setFormula(1, 0, "SEQUENCE(4,5)", GC.Spread.Sheets.SheetArea.viewport);
// RandArray数式を設定します。
activeSheet.setText(6, 0, "RANDARRAY(5,3) Function");
activeSheet.addSpan(6, 0, 1, 2, GC.Spread.Sheets.SheetArea.viewport);
activeSheet.getCell(6, 0).backColor("SkyBlue");
activeSheet.setFormula(7, 0, "RANDARRAY(5,3)", GC.Spread.Sheets.SheetArea.viewport);
// Single数式を設定します。
activeSheet.setText(13, 0, "SINGLE関数は「@」(例えば、=@(A15:E15))で表されます。;
    activeSheet.addSpan(13, 0, 1, 4, GC.Spread.Sheets.SheetArea.viewport); activeSheet.getCell(13, 0).backColor("SkyBlue"); activeSheet.setValue(14, 0, "A"); activeSheet.setValue(14, 1, "B"); activeSheet.setValue(14, 2, "C"); activeSheet.setValue(14, 3, "D"); activeSheet.setValue(14, 4, "E"); activeSheet.setFormula(15, 2, "@(A15:E15)", GC.Spread.Sheets.SheetArea.viewport);