SpreadJS製品ヘルプ
Function コンストラクタ
GC.Spread.CalcEngine.Functions 名前空間 > Function タイプ : Function コンストラクタ
関数の名前。
関数の引数の最小数。
関数の引数の最大数。
関数の記述オブジェクト。
関数の記述。
関数のパラメーターの記述配列。
パラメーター名。
パラメーターが繰り返し可能かどうか。
パラメーターがオプションであるかどうか。
関数を定義するための抽象基本クラスを表します。
シンタックス
var instance = new GC.Spread.CalcEngine.Functions.Function(name,
                                                          minArgs,
                                                          maxArgs,
                                                          functionDescription,
                                                          functionDescription.description,
                                                          functionDescription.parameter,
                                                          functionDescription.parameter.name,
                                                          functionDescription.parameter.repeatable,
                                                          functionDescription.parameter.optional);
function Function( 
   name : string,
   minArgs : number,
   maxArgs : number,
   functionDescription : Object,
   (optional) functionDescription.description : string,
   (optional) functionDescription.parameter : undefined,
   functionDescription.parameter.name : string,
   (optional) functionDescription.parameter.repeatable : boolean,
   (optional) functionDescription.parameter.optional : boolean
) : Function;

パラメータ

name
関数の名前。
minArgs
関数の引数の最小数。
maxArgs
関数の引数の最大数。
functionDescription
関数の記述オブジェクト。
functionDescription.description
関数の記述。
functionDescription.parameter
関数のパラメーターの記述配列。
functionDescription.parameter.name
パラメーター名。
functionDescription.parameter.repeatable
パラメーターが繰り返し可能かどうか。
functionDescription.parameter.optional
パラメーターがオプションであるかどうか。
使用例
次のサンプルコードは、カスタムスパークラインを作成します。
function Clock() {
    GC.Spread.Sheets.Sparklines.SparklineEx.call(this);
}
Clock.prototype = new GC.Spread.Sheets.Sparklines.SparklineEx();
Clock.prototype.createFunction = function () {
    var func = new GC.Spread.CalcEngine.Functions.Function("CLOCK", 1, 1);
    func.evaluate = function (args) {
        return args[0];
    };
    return func;
};
Clock.prototype._drawCircle = function (context, centerX, centerY, radius) {
    context.beginPath();
    context.arc(centerX, centerY, radius, 0, Math.PI * 2, true);
    context.stroke();
};
Clock.prototype._drawCenter = function (context, centerX, centerY, radius) {
    context.beginPath();
    context.arc(centerX, centerY, radius, 0, Math.PI * 2, true);
    context.fill();
};
Clock.prototype._drawHand = function (context, centerX, centerY, loc, radius) {
    var angle = (Math.PI * 2) * (loc / 60) - Math.PI / 2;
    context.beginPath();
    context.moveTo(centerX, centerY);
    context.lineTo(centerX + Math.cos(angle) * radius, centerY + Math.sin(angle) * radius);
    context.stroke();
};
Clock.prototype._drawHands = function (context, value, centerX, centerY, radius) {
    var date = value, hour = date.getHours();
    hour = hour > 12 ? hour - 12 : hour;
    this._drawHand(context, centerX, centerY, hour * 5 + (date.getMinutes() / 60) * 5, radius / 2);
    this._drawHand(context, centerX, centerY, date.getMinutes(), radius * 3 / 4);
    context.strokeStyle = "red";
    this._drawHand(context, centerX, centerY, date.getSeconds(), radius * 3 / 4);

};
Clock.prototype._drawNumerals = function (context, centerX, centerY, radius) {
    var numerals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
        angle,
        numeralWidth;
    if (radius > 0) {
        numerals.forEach(function (numeral) {
            angle = Math.PI / 6 * (numeral - 3);
            numeralWidth = context.measureText(numeral).width;
            context.beginPath();
            context.fillText(numeral, centerX + Math.cos(angle) * radius + numeralWidth / 2, centerY + Math.sin(angle) * radius + numeralWidth / 2);
        });
    }
};
Clock.prototype.paint = function (context, value, x, y, width, height) {
    if (!(value instanceof Date)) {
        return;
    }
    var centerX = x + width / 2,
        centerY = y + height / 2,
        margin = 10,
        padding = 10,
        radius = Math.min(width, height) / 2 - margin;
    if (radius <= 0) {
        return;
    }
    context.save();

    //draw circle
    this._drawCircle(context, centerX, centerY, radius);
    //draw center
    this._drawCenter(context, centerX, centerY, 3);
    //draw hands
    this._drawHands(context, value, centerX, centerY, radius);
    //draw numerals
    this._drawNumerals(context, centerX, centerY, radius - padding);

    context.restore();
};
spread.addSparklineEx(new Clock());

var sheet = spread.getActiveSheet();

var style = new GC.Spread.Sheets.Style();
style.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
style.vAlign = GC.Spread.Sheets.VerticalAlign.center;
sheet.setDefaultStyle(style);
sheet.getCell(0, 1, GC.Spread.Sheets.SheetArea.viewport).value("Universal Time").font("20px Arial");
sheet.setValue(1, 0, "Beijing");
sheet.setValue(1, 1, "Tokyo");
sheet.setValue(1, 2, "New York");
sheet.setFormula(2, 0, '=CLOCK(A4)');
sheet.setFormula(2, 1, '=CLOCK(B4)');
sheet.setFormula(2, 2, '=CLOCK(C4)');
sheet.getRange(3, -1, 1, -1, GC.Spread.Sheets.SheetArea.viewport).formatter("hh:mm:ss tt");
sheet.setRowHeight(0, 50);
sheet.setRowHeight(2, 200);
sheet.setColumnWidth(0, 200);
sheet.setColumnWidth(1, 200);
sheet.setColumnWidth(2, 200);
function updateTime() {
    var now = new Date();
    var utcNow = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    sheet.setValue(3, 0, new Date(utcNow.setHours(utcNow.getHours() + 8)));//+8
    sheet.setValue(3, 1, new Date(utcNow.setHours(utcNow.getHours() + 1)));//+9
    sheet.setValue(3, 2, new Date(utcNow.setHours(utcNow.getHours() - 14)));//-5
}
setInterval(updateTime, 1000);
updateTime();
function Clock() {
    GC.Spread.Sheets.Sparklines.SparklineEx.call(this);
}
Clock.prototype = new GC.Spread.Sheets.Sparklines.SparklineEx();
Clock.prototype.createFunction = function () {
    var func = new GC.Spread.CalcEngine.Functions.Function("CLOCK", 1, 1);
    func.evaluate = function (args) {
        return args[0];
    };
    return func;
};
Clock.prototype._drawCircle = function (context, centerX, centerY, radius) {
    context.beginPath();
    context.arc(centerX, centerY, radius, 0, Math.PI * 2, true);
    context.stroke();
};
Clock.prototype._drawCenter = function (context, centerX, centerY, radius) {
    context.beginPath();
    context.arc(centerX, centerY, radius, 0, Math.PI * 2, true);
    context.fill();
};
Clock.prototype._drawHand = function (context, centerX, centerY, loc, radius) {
    var angle = (Math.PI * 2) * (loc / 60) - Math.PI / 2;
    context.beginPath();
    context.moveTo(centerX, centerY);
    context.lineTo(centerX + Math.cos(angle) * radius, centerY + Math.sin(angle) * radius);
    context.stroke();
};
Clock.prototype._drawHands = function (context, value, centerX, centerY, radius) {
    var date = value, hour = date.getHours();
    hour = hour > 12 ? hour - 12 : hour;
    this._drawHand(context, centerX, centerY, hour * 5 + (date.getMinutes() / 60) * 5, radius / 2);
    this._drawHand(context, centerX, centerY, date.getMinutes(), radius * 3 / 4);
    context.strokeStyle = "red";
    this._drawHand(context, centerX, centerY, date.getSeconds(), radius * 3 / 4);

};
Clock.prototype._drawNumerals = function (context, centerX, centerY, radius) {
    var numerals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
        angle,
        numeralWidth;
    if (radius > 0) {
        numerals.forEach(function (numeral) {
            angle = Math.PI / 6 * (numeral - 3);
            numeralWidth = context.measureText(numeral).width;
            context.beginPath();
            context.fillText(numeral, centerX + Math.cos(angle) * radius + numeralWidth / 2, centerY + Math.sin(angle) * radius + numeralWidth / 2);
        });
    }
};
Clock.prototype.paint = function (context, value, x, y, width, height) {
    if (!(value instanceof Date)) {
        return;
    }
    var centerX = x + width / 2,
        centerY = y + height / 2,
        margin = 10,
        padding = 10,
        radius = Math.min(width, height) / 2 - margin;
    if (radius <= 0) {
        return;
    }
    context.save();

    //draw circle
    this._drawCircle(context, centerX, centerY, radius);
    //draw center
    this._drawCenter(context, centerX, centerY, 3);
    //draw hands
    this._drawHands(context, value, centerX, centerY, radius);
    //draw numerals
    this._drawNumerals(context, centerX, centerY, radius - padding);

    context.restore();
};
spread.addSparklineEx(new Clock());

var sheet = spread.getActiveSheet();

var style = new GC.Spread.Sheets.Style();
style.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
style.vAlign = GC.Spread.Sheets.VerticalAlign.center;
sheet.setDefaultStyle(style);
sheet.getCell(0, 1, GC.Spread.Sheets.SheetArea.viewport).value("Universal Time").font("20px Arial");
sheet.setValue(1, 0, "Beijing");
sheet.setValue(1, 1, "Tokyo");
sheet.setValue(1, 2, "New York");
sheet.setFormula(2, 0, '=CLOCK(A4)');
sheet.setFormula(2, 1, '=CLOCK(B4)');
sheet.setFormula(2, 2, '=CLOCK(C4)');
sheet.getRange(3, -1, 1, -1, GC.Spread.Sheets.SheetArea.viewport).formatter("hh:mm:ss tt");
sheet.setRowHeight(0, 50);
sheet.setRowHeight(2, 200);
sheet.setColumnWidth(0, 200);
sheet.setColumnWidth(1, 200);
sheet.setColumnWidth(2, 200);
function updateTime() {
    var now = new Date();
    var utcNow = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    sheet.setValue(3, 0, new Date(utcNow.setHours(utcNow.getHours() + 8)));//+8
    sheet.setValue(3, 1, new Date(utcNow.setHours(utcNow.getHours() + 1)));//+9
    sheet.setValue(3, 2, new Date(utcNow.setHours(utcNow.getHours() - 14)));//-5
}
setInterval(updateTime, 1000);
updateTime();
関連トピック

参照

Function タイプ