自定义函数 JSA_A_FETCHAIRSCRIPT 返回AirScript脚本的返回值

var JSA_A_FETCHAIRSCRIPT_asyncResultDict = {};
function JSA_A_FETCHAIRSCRIPT(url, token, argv, waitTime) {
//    函数定义地点:JSA中。
//    函数使用地点:A(工作表中、JSA代码中)。
//    函数说明:返回AirScript脚本的返回值(data.result)。
//    参数说明:
//        url:脚本webhook。单个单元格、String。
//        token:用户脚本令牌。单个单元格、String。
//        argv:脚本参数。单个单元格、String、Object。
//        waitTime:等待秒数,默认等待60秒。单个单元格、Number。
    
    url = (url === undefined || url === -2147352572) ? undefined : url.valueOf();
    token = (token === undefined || token === -2147352572) ? undefined : token.valueOf();
    argv = (argv === undefined || argv === -2147352572) ? undefined : argv.valueOf();
    waitTime = (waitTime === undefined || waitTime === -2147352572) ? 60 * 1000 : waitTime.valueOf() * 1000;
    
    const data = JSON.stringify({
        "Context": {
            "argv": (() => {
                if (typeof argv == "string") { // 脚本参数
                    return JSON.parse(argv);
                } else if (typeof argv == "object") {
                    return argv;
                }
            })()
        }
    });
    
    let rng = Application.Caller();
    let ws = rng.Worksheet;
    let wb = ws.Parent;
    let cellKey = `'${wb.Path}\\[${wb.Name}]${ws.Name}'!${rng.Address()}`;
    
    const startTime = Date.now(); // 记录开始时间
    
    if (Object.hasOwn(JSA_A_FETCHAIRSCRIPT_asyncResultDict, cellKey)) {
        let result = JSA_A_FETCHAIRSCRIPT_asyncResultDict[cellKey];
        //console.log(JSON.stringify(JSA_A_FETCHAIRSCRIPT_asyncResultDict));
        delete JSA_A_FETCHAIRSCRIPT_asyncResultDict[cellKey];
        //console.log(JSON.stringify(JSA_A_FETCHAIRSCRIPT_asyncResultDict));
        return JSON.parse(result);
    }
    
    function addAttributeDirtyCalculate(text) {
        JSA_A_FETCHAIRSCRIPT_asyncResultDict[cellKey] = text;
        rng.Dirty();
        
        if (Application.Calculation == xlCalculationManual) {
            rng.Calculate();
        }
    }
    
    return (async () => {
        var response = await fetch(url, { // 脚本webhook。
            "method": "POST",
            "headers": {
                "Content-Type": "application/json",
                "AirScript-Token": token // 用户脚本令牌。
            },
            "body": data // 脚本参数。
        });
        
        if (!response.ok) {
            const statusAndStatusText = `HTTP ${response.status}: ${response.statusText}`;
            addAttributeDirtyCalculate(statusAndStatusText);
            return statusAndStatusText;
        }
        
        while (response.status !== 200) { // 循环等待结果。
            DoEvents();
            if (new Date().getTime() - startTime > waitTime) { // 如果请求时间超过设置的秒数。
                const timeout = `请求超时:请求超过${waitTime / 1000}秒`; // 请求超时
                addAttributeDirtyCalculate(timeout);
                return timeout;
            }
        }
        
        const text = JSON.stringify(JSON.parse(await response.text()).data.result);
        addAttributeDirtyCalculate(text);
        return text;
    })();
}

插入函数对话框、函数参数对话框:

加载宏文件function Workbook_Open(){}中添加以下代码。

Application.MacroOptions("JSA_A_FETCHAIRSCRIPT","返回AirScript脚本的返回值(data.result)。\n函数定义地点:JSA中。\n函数使用地点:A(工作表中、JSA代码中)。",undefined,undefined,undefined,undefined,14,undefined,undefined,undefined,['脚本webhook。单个单元格、String。','用户脚本令牌。单个单元格、String。','脚本参数。单个单元格、String、Object。','等待秒数,默认等待60秒。单个单元格、Number。']);

云南省
浏览 1140
收藏
2
分享
2 +1
+1
全部评论