hyperlink() {
        return new ArgHandler('Sheet.hyperlink')
            .case('string', address => {
                const hyperlinkNode = this._hyperlinks[address];
                if (!hyperlinkNode) return;
                const relationship = this._relationships.findById(hyperlinkNode.attributes['r:id']);
                return relationship && relationship.attributes.Target;
            })
            .case(['string', 'nil'], address => {
                // TODO: delete relationship
                delete this._hyperlinks[address];
                return this;
            })
            .case(['string', 'string'], (address, hyperlink) => {
                return this.hyperlink(address, hyperlink, false);
            })
            .case(['string', 'string', 'boolean'], (address, hyperlink, internal) => {
                const isHyperlinkInternalAddress = internal || addressConverter.fromAddress(hyperlink);
                let nodeAttributes;
                if (isHyperlinkInternalAddress) {
                    nodeAttributes = {
                        ref: address,
                        location: hyperlink,
                        display: hyperlink
                    };
                } else {
                    const relationship = this._relationships.add("hyperlink", hyperlink, "External");
                    nodeAttributes = {
                        ref: address,
                        'r:id': relationship.attributes.Id
                    };
                }
                this._hyperlinks[address] = {
                    name: 'hyperlink',
                    attributes: nodeAttributes,
                    children: []
                };
                return this;
            })
            .case(['string', 'object'], (address, opts) => {
                if (opts instanceof Cell) {
                    const cell = opts;
                    const hyperlink = cell.address({ includeSheetName: true });
                    this.hyperlink(address, hyperlink, true);
                } else if (opts.hyperlink) {
                    this.hyperlink(address, opts.hyperlink);
                } else if (opts.email) {
                    const email = opts.email;
                    const subject = opts.emailSubject || '';
                    this.hyperlink(address, encodeURI(`mailto:${email}?subject=${subject}`));
                }
                const hyperlinkNode = this._hyperlinks[address];
                if (hyperlinkNode) {
                    if (opts.tooltip) {
                        hyperlinkNode.attributes.tooltip = opts.tooltip;
                    }
                }
                return this;
            })
            .handle(arguments);
    }
Set the hyperlink on the cell with the given address and options.
@param {string} address - The address of the hyperlinked cell.
@param {{}|Cell} opts - Options or Cell. If opts is a Cell then an internal hyperlink is added.
@param {string|Cell} [opts.hyperlink] - The hyperlink to set, can be a Cell or an internal/external string.
@param {string} [opts.tooltip] - Additional text to help the user understand more about the hyperlink.
@param {string} [opts.email] - Email address, ignored if opts.hyperlink is set.
@param {string} [opts.emailSubject] - Email subject, ignored if opts.hyperlink is set.
@returns {Sheet} The sheet.