SpreadJS Documentation
GC.Spread.CalcEngine.Functions Namespace / Function type / Function Constructor
The name of the function.
The minimum number of arguments for the function.
The maximum number of arguments for the function.
The description object of the function.
The description of the function.
The parameters' description array of the function.
The parameter name..
Whether the parameter is repeatable.
Whether the parameter is optional.
In This Topic
    Function Constructor
    In This Topic
    Represents an abstract base class for defining functions.
    Syntax
    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;

    Parameters

    name
    The name of the function.
    minArgs
    The minimum number of arguments for the function.
    maxArgs
    The maximum number of arguments for the function.
    functionDescription
    The description object of the function.
    functionDescription.description
    The description of the function.
    functionDescription.parameter
    The parameters' description array of the function.
    functionDescription.parameter.name
    The parameter name..
    functionDescription.parameter.repeatable
    Whether the parameter is repeatable.
    functionDescription.parameter.optional
    Whether the parameter is optional.
    Example
    This example creates a custom sparkline.
    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();
    See Also

    Reference

    Function type