自定义函数 JSAFETCH2 在单元格中返回请求响应的异步数据
var asyncResultDict = {};
function JSAFETCH2(url, init) { // 全局变量法
url = url.valueOf();
init = (init === undefined || init === -2147352572) ? undefined : JSON.parse(init.valueOf());
let rng = Application.Caller();
let ws = rng.Worksheet;
let wb = ws.Parent;
let cellKey = `'${wb.Path}\\[${wb.Name}]${ws.Name}'!${rng.Address()}`;
if (Object.hasOwn(asyncResultDict, cellKey)) {
let result = asyncResultDict[cellKey];
//console.log(JSON.stringify(asyncResultDict));
delete asyncResultDict[cellKey];
//console.log(JSON.stringify(asyncResultDict));
return result;
}
function addAttributeDirtyCalculate(text) {
asyncResultDict[cellKey] = text;
rng.Dirty(); // 标记为脏单元格。
if (Application.Calculation == xlCalculationManual) { // 自动重算:xlCalculationAutomatic、手动重算:xlCalculationManual
rng.Calculate(); // 手动重算模式,需设置此项,相当于手动进入单元格按Enter或按F9。自动重算模式,不需要设置此项。
}
}
return (async () => {
let response = await fetch(url, init);
if (!response.ok) {
const statusAndStatusText = `HTTP ${response.status}: ${response.statusText}`;
addAttributeDirtyCalculate(statusAndStatusText);
return statusAndStatusText;
}
const text = await response.text();
addAttributeDirtyCalculate(text);
return text;
})();
}插入函数对话框、函数参数对话框:
加载宏文件function Workbook_Open(){}中添加以下代码。
Application.MacroOptions("JSAFETCH2","发起获取资源的请求,返回一个会在请求响应后兑现的promise。该promise会兑现一个表示请求响应的Response对象。",undefined,undefined,undefined,undefined,14,undefined,undefined,undefined,["想要获取的资源的URL。","一个可选对象的JSON格式,包含希望被包括到请求中的各种自定义选项。"])