自定义函数 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。']);