问题描述
我正在尝试从 Web 上的 Excel 调用外部 API。但是,我一直试图从 fetch 调用中获取结果。我什至使用 Office 文档示例来确保
在 Excel 中,单击“自动化”以创建新脚本
async function main(workbook: ExcelScript.Workbook): Promise<void> {
let fetchResult = await fetch('https://jsonplaceholder.typicode.com/todos/1');
let json = await fetchResult.json();
}
我不断收到以下消息(在 fetchResult.json() 调用中)
"Office Scripts 无法推断此变量的数据类型或推断它可能会导致意外错误。请注释变量的类型以避免此错误。您也可以使用编辑器中提供的快速修复选项来自动填充类型基于用法。可以通过右键单击变量名称并选择快速修复链接来访问快速修复。"
运行 Chrome 检查器时,API 请求似乎被搁置“注意:请求尚未完成”
PS:我不是 Office 管理员,现在无法访问,但希望这不是我的用户或 Office 帐户配置的问题
知道可能是什么问题吗? 谢谢!
解决方法
OfficeScript 中不允许的“任何”类型是设计使然。我们认为任何类型一般都会导致开发人员错误。我知道声明类型可能很困难——但是现在最流行的 API 为您提供了可以使用的接口(或 d.ts)。 其次,有诸如 https://quicktype.io/typescript 之类的工具,您可以在其中输入示例 JSON,它会为您提供完整的接口,然后您可以使用 interface 关键字在代码中声明。 请参阅此代码,例如:https://github.com/sumurthy/officescripts-projects/blob/main/API%20Calls/APICall.ts
您不需要声明所有属性——只需声明您将使用的属性。 这是更多的前期工作 - 但最终质量更好。
,为预期的 JSON 类型添加 interface
定义解决了我的问题。
interface Todo {
userId: number;
id: number;
title: string;
completed: boolean
}
async function main(workbook: ExcelScript.Workbook): Promise<void> {
let fetchResult = await fetch('https://jsonplaceholder.typicode.com/todos/1');
let json: Todo = await fetchResult.json();
console.log(json);
}
如果您调用的 Web API 返回不同的数据结构,您可能需要定义不同的接口。