TypeScript 版本的 Office Addins 文件不起作用
Office Addins file in its TypeScript version doesn't work
我正在使用 https://github.com/OfficeDev/Excel-Add-In-TS-Start
中的模板
基本上,它是 Visual Studio 生成的默认 Excel Office Addins 模板,但修改后也支持 TypeScript。
根目录中的文件 Home.ts
已经是其 TypeScript 版本。
还有一个名为 FunctionFile.js
的文件(在 Functions
文件夹中),我想在那里编写我自己的函数,但是是在 TypeScript 中。
因此,我创建了一个 ExecuteFunction
类型的功能区控件,指向一个名为 myTest
.
的函数
在 FunctionFile.js
中,我写了下面的代码,当我点击插件命令时,它按预期工作:
(function () {
Office.initialize = function (reason) {
};
})();
function myTest() {
Excel.run(function (ctx) {
ctx.workbook.worksheets.getActiveWorksheet().getRange("A1").values = [["I was clicked!"]];
return ctx.sync();
}).catch(errorHandler);
}
function errorHandler(error) {
console.log(error.message);
}
到目前为止,还不错。但是,正如我提到的,我希望一切都在 TypeScript 中工作,所以我尝试将它重命名为 FunctionFile.ts
并用它的 TypeScript 版本替换代码:
(() => {
Office.initialize = () => {
}
})();
function myTest(): void {
Excel.run(async (ctx) => {
ctx.workbook.worksheets.getActiveWorksheet().getRange("A1").values = [["I as clicked!"]];
await ctx.sync();
}).catch(errorHandler);
}
function errorHandler(error): void {
console.log(error);
}
当我尝试 运行 时,函数 myTest
被调用,但是当它到达(我认为)Excel.run
方法时我得到了这个错误:
HTML1300: Ocorreu navegação.
FunctionFile.html
ReferenceError: 'Promise' is not defined (I translated this)
{
[functions]: ,
__proto__: { },
description: "'Promise' não está definido",
message: "'Promise' não está definido",
name: "ReferenceError",
number: -2146823279,
stack: "ReferenceError: 'Promise' não está definido
at Anonymous function (https://localhost:44356/Functions/FunctionFile.js:2:5)
at Anonymous function (https://localhost:44356/Functions/FunctionFile.js:42:32)
at Anonymous function (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:205600)
at yi (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:236067)
at st (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:236154)
at d (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:235974)
at c (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:234560)"
}
其实错误发生在下面的JavaScript层(太乱了,无法分析):
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
})
为什么当我将 Home.js
转换为 Home.ts
时它有效,但将 FunctionFile.js
转换为 FunctionFile.ts
却没有发生同样的情况?我是不是做错了什么?
当您使用 async/await
关键字时,TypeScript 希望您提供 Promise 实现。
来自书 "Building Office Add-ins using Office.js" (https://leanpub.com/buildingofficeaddins/) [免责声明,我是该书的作者]:
在您的情况下(以及我将在书中添加说明的内容),async
关键字有效地为您创建了一个 Promise,因此上述指导仍然适用。在 Script Lab 中,我们默认包含库 core-js(选项 #3),它提供了一个 Promise polyfill:
如果您不想引入额外的库,您也可以依赖 Office.js(只要您使用的是 ExcelApi 1.2+ 或 WordApi 1.2+)包含一个 Promise 库。因此,如果你愿意,你需要做的就是在 Office.initialized = function() { ... }
中添加以下一行,这将用 Office.js-provided-one 填充全局 window.Promise
:
window.Promise = OfficeExtension.Promise;
希望对您有所帮助!
我正在使用 https://github.com/OfficeDev/Excel-Add-In-TS-Start
中的模板基本上,它是 Visual Studio 生成的默认 Excel Office Addins 模板,但修改后也支持 TypeScript。
根目录中的文件 Home.ts
已经是其 TypeScript 版本。
还有一个名为 FunctionFile.js
的文件(在 Functions
文件夹中),我想在那里编写我自己的函数,但是是在 TypeScript 中。
因此,我创建了一个 ExecuteFunction
类型的功能区控件,指向一个名为 myTest
.
在 FunctionFile.js
中,我写了下面的代码,当我点击插件命令时,它按预期工作:
(function () {
Office.initialize = function (reason) {
};
})();
function myTest() {
Excel.run(function (ctx) {
ctx.workbook.worksheets.getActiveWorksheet().getRange("A1").values = [["I was clicked!"]];
return ctx.sync();
}).catch(errorHandler);
}
function errorHandler(error) {
console.log(error.message);
}
到目前为止,还不错。但是,正如我提到的,我希望一切都在 TypeScript 中工作,所以我尝试将它重命名为 FunctionFile.ts
并用它的 TypeScript 版本替换代码:
(() => {
Office.initialize = () => {
}
})();
function myTest(): void {
Excel.run(async (ctx) => {
ctx.workbook.worksheets.getActiveWorksheet().getRange("A1").values = [["I as clicked!"]];
await ctx.sync();
}).catch(errorHandler);
}
function errorHandler(error): void {
console.log(error);
}
当我尝试 运行 时,函数 myTest
被调用,但是当它到达(我认为)Excel.run
方法时我得到了这个错误:
HTML1300: Ocorreu navegação.
FunctionFile.html
ReferenceError: 'Promise' is not defined (I translated this)
{
[functions]: ,
__proto__: { },
description: "'Promise' não está definido",
message: "'Promise' não está definido",
name: "ReferenceError",
number: -2146823279,
stack: "ReferenceError: 'Promise' não está definido
at Anonymous function (https://localhost:44356/Functions/FunctionFile.js:2:5)
at Anonymous function (https://localhost:44356/Functions/FunctionFile.js:42:32)
at Anonymous function (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:205600)
at yi (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:236067)
at st (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:236154)
at d (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:235974)
at c (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:234560)"
}
其实错误发生在下面的JavaScript层(太乱了,无法分析):
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
})
为什么当我将 Home.js
转换为 Home.ts
时它有效,但将 FunctionFile.js
转换为 FunctionFile.ts
却没有发生同样的情况?我是不是做错了什么?
当您使用 async/await
关键字时,TypeScript 希望您提供 Promise 实现。
来自书 "Building Office Add-ins using Office.js" (https://leanpub.com/buildingofficeaddins/) [免责声明,我是该书的作者]:
在您的情况下(以及我将在书中添加说明的内容),async
关键字有效地为您创建了一个 Promise,因此上述指导仍然适用。在 Script Lab 中,我们默认包含库 core-js(选项 #3),它提供了一个 Promise polyfill:
如果您不想引入额外的库,您也可以依赖 Office.js(只要您使用的是 ExcelApi 1.2+ 或 WordApi 1.2+)包含一个 Promise 库。因此,如果你愿意,你需要做的就是在 Office.initialized = function() { ... }
中添加以下一行,这将用 Office.js-provided-one 填充全局 window.Promise
:
window.Promise = OfficeExtension.Promise;
希望对您有所帮助!