4D View Pro: カスタムファンクションの強化

時には、対象となるセルの数がわからないまま、列や行のコンテンツに基づいた特殊な計算が必要になることがあります。

4D 20 R5 では、スプレッドシートのカスタムファンクションに “A1:C10” のような複数セルのレンジを渡したり、”OBJECT(“Firstname”,B2, “Lastname”,C2)” のようなオブジェクトを渡したりして、それらのセルのコンテンツを格納したコレクションやオブジェクトを 4Dメソッドで取得できるようになりました。

HDI: 4D View Pro: カスタムファンクションとコレクション/オブジェクト引数

カスタムファンクションは、4D View Pro の強力な機能で、4D View Pro の可能性を拡張し、ニーズに合わせたカスタムの計算や操作を実行することができます。このカスタムファンクションの引数として、ユーザーにより指定されたセルレンジの値をコレクションやオブジェクトの形で渡せるようになりました。

コレクションを扱う場合

コレクションを使用したカスタムファンクションの例題として、指定されたセルレンジにおいてゼロでない値の平均を計算するファンクションを考えてみましょう。これを実現するには、まず 2つの基本ステップが必要です:

  1. 4D View Pro に呼び出されたカスタムファンクションが、計算を実行するのに使用するフォーミュラを作成します。
  2. カスタムファンクションのオプションを定義するオブジェクトを作成します。

この例題では、CustomFunctionCreator というクラスを作成して、これらのステップに対応します。

それではこれをどのように行うかを見てみましょう!

1. フォーミュラの作成

まず、4D View Pro が呼び出すファンクションの動作を定義するフォーミュラが必要ですが、ここでは CustomFunctionCreator クラスに _averageNonZeroValues() という名の関数を作成して、フォーミュラとして利用します。この関数は、引数としてコレクションを 1つ受け取り、中身は以下のように定義されてています:

Function _averageNonZeroValues($values : Collection) : Real
    // レンジに含まれる 0 または Null でない値の平均
	
    // コレクションの値の合計
    var $total:=$values.flat(2).sum()
    // 0 または Null でない値を持つセルの数を計算します
    var $NonZeroValueNumber : Integer:=$values.flat(2).count()-$values.flat(2).countValues(0)
	
    // セルに表示する計算結果を返します
    return $NonZeroValueNumber>0 ? $total/$NonZeroValueNumber : 0

2. カスタムファンクションの定義

_averageNonZeroValues() クラス関数を作成したので、これをカスタムファンクションとして 4D View Pro で使用できるようにします。これには VP SET CUSTOM FUNCTIONS コマンドを使用しますが、カスタムファンクションの定義に必要な情報を格納したオブジェクト引数を用意しなくてはなりません。このコマンドの使い方についての詳細は、4D View Pro: 4D のフォーミュラをスプレッドシートで使用する を参照ください。

この例題では、VP SET CUSTOM FUNCTIONS コマンドに必要なすべてのパラメーターを収容するオブジェクトを構築するために、 CustomFunctionCreator クラスにaverageNonZeroValues() クラス関数を実装します:

Function averageNonZeroValues()->$customFunction : Object
    var $this : Object
	
    $customFunction:={}
    $this:=This // フォーミュラの定義に使用する This を取得します
	
    // スプレッドシート内でカスタムファンクションが使われたときに呼び出されるフォーミュラ
    $customFunction.formula:=Formula($this._averageNonZeroValues($1))

    // 引数がコレクション型の場合、カスタムファンクションの引数の宣言は必須です
    $customFunction.parameters:=[{name: "値のレンジ"; type: Is collection}]

    // 自動補完ポップアップに表示されるカスタムファンクションの概要 
    $customFunction.summary:="ゼロでない値の平均を計算します。"

    // 受け入れる引数の数
    $customFunction.minParams:=1
    $customFunction.maxParams:=1

オブジェクトを扱う場合

SpreadJS はオブジェクト生成用に設計された OBJECT ファンクションを提供しており、これを使用すると複数のセルの内容を 1つのオブジェクトに統合することができます。オブジェクトを使用したカスタムファンクションの例として、複数セル内で変更された箇所が存在するかを評価するファンクションを見てみましょう。さきほどのコレクションと同様に、これを実現するには、まず 2つの基本ステップが必要です:

  1. 4D View Pro に呼び出されたカスタムファンクションが、評価を実行するのに使用するフォーミュラを作成します。
  2. カスタムファンクションのオプションを定義するオブジェクトを作成します。

ここでも引き続き CustomFunctionCreator クラスを使用します。

1. フォーミュラの作成

まず、4D View Pro が呼び出すファンクションの動作を定義するためのフォーミュラが必要です。CustomFunctionCreator クラスに _modifiedProperties() という名のクラス関数を作成して、フォーミュラとして利用します。このクラス関数は、引数としてオブジェクトを 1つ受け取り、中身は以下のように定義されてています:

Function _modifiedProperties($object: Object) : Text
    // スプレッドシートの表のデータと、その元となった Form.people のデータを比較します

    var $myObject : Object:=$object.value

     // スプレッドシートの表のデータと、その元となった Form.people 間で値の異なる属性を検索します
     For each ($property; $myObject)
          // スプレッドシートから受け取ったオブジェクト引数と Form.people オブジェクトを比較します
          If ($myObject[$property]#Form.people[$property])
               // データが変更されている場合にセルに表示するメッセージ
               return "データが変更されています"
          End if 
     End for each 
     return ""

2. カスタムファンクションの定義

averageNonZeroValues() の例と同様に、4D View Pro のカスタムファンクションとして _modifiedProperties() クラス関数を実行できるようにするには、VP SET CUSTOM FUNCTIONS コマンドが必要とするパラメーターを収容するオブジェクトを構築する必要があります。これをおこなうため、CustomFunctionCreator クラスに modifiedProperties() クラス関数を実装します:

Function modifiedProperties()->$customFunction : Object
    var $this : Object
	
    $customFunction:={}
    $this:=This // フォーミュラの定義に使用する This を取得します
	
    // スプレッドシート内でカスタムファンクションが使われたときに呼び出されるフォーミュラ 
    $customFunction.formula:=Formula($this._modifiedProperties($1))

    // オブジェクト引数の宣言
    $customFunction.parameters:=[{name: "値"; type: Is object}]

    // 自動補完ポップアップに表示されるカスタムファンクションの概要 
    $customFunction.summary:="ユーザーがデータを変更した場合、メッセージを表示します。"

    // 受け入れる引数の数
    $customFunction.minParams:=1
    $customFunction.maxParams:=1

3. カスタムファンクションの宣言

仕上げのステップでは、フォームの “On Load” イベントにおいて、averageNonZeroValues() とmodifiedProperties() クラス関数を使って、VP SET CUSTOM FUNCTIONS を呼び出します:

Case of 
		
  : (FORM Event.code=On Load)
    var $customFunctions:={}

    // 4D View Pro エリアにおいて使用が許可されるカスタムファンクションを宣言します
    var $creator:=cs.CustomFunctionsCreator.new()
    $customFunctions.MY_AVERAGENONZEROVALUES:=$creator.averageNonZeroValues()
    $customFunctions.MY_MODIFICATIONS:=$creator.modifiedProperties()

    VP SET CUSTOM FUNCTIONS("ViewProArea"; $customFunctions)
End case 

これで、4D View Pro エリアで利用可能な 2つの新しいカスタムファンクションが追加されました:

  • “MY_AVERAGENONZEROVALUES”:

  • “MY_MODIFICATIONS”:

blank

4D View Pro でカスタムファンクションを使用することで、スプレッドシートの可能性を新たな高みへと引き上げ、オーダーメイドの計算や操作が可能になります。より詳細な情報についてはドキュメントをご覧ください。

Fabrice Mainguené
- Product Owner -Fabrice Mainguenéは、2016年11月に4D Programチームに参加しました。プロダクトオーナーとして、彼はユーザーストーリーを書き、それを機能仕様に変換する役割を担っています。CNAMでコンピュータサイエンスの学士号を取得した後、FabriceはWindev開発者として小さなソフトウェア出版社に入社しました。その後、彼は産業および貿易分野のさまざまな企業で、Windev および Web 開発者として、また新機能の技術アドバイザーとして働きました。