SharePoint Excel代码编辑器类型推断错误排查求助
问题说明
我在SharePoint Excel代码编辑器中编写关联Microsoft Power Automate的脚本,需求如下:
- 打开两个数据文档
- 对比两文档信息,检查H列内容相同的行
- 若File1的H列值在File2中存在,将该行从File1复制到File3,并追加File2对应行的K列信息
运行代码时,即便尝试替换var为特定类型,仍出现大量「Office Scripts无法推断变量数据类型,请声明类型」的错误,原代码及错误信息如下:
原代码
Excel.run(function (context) { //open files var file1 = context.workbook.application.workbooks.open("pathfile1.xlsx"); var file2 = context.workbook.application.workbooks.open("pathfile2.xlsx"); // get worksheet of files var sheet1 = file1.worksheets.getActiveWorksheet(); var sheet2 = file2.worksheets.getActiveWorksheet(); // column range i want to compare between both documents var range1 = sheet1.getRange("H:H"); var range2 = sheet2.getRange("H:H"); // load data range1.load("values"); range2.load("values"); return context.sync().then(function () { // comparison var data1 = range1.values; for (var i = 0; i < data1.length; i++) { var value = data1[i][0]; // check if it exists if (value !== "") { var existsInFile2 = false; var data2 = range2.values; for (var j = 0; j < data2.length; j++) { if (data2[j][0] === value) { existsInFile2 = true; break; } } // if exists, copy and paste into do3 if (existsInFile2) { var rowToCopy = sheet1.getRange("A" + (i + 1) + ":Z" + (i + 1)); var destinationRange = file1.worksheets.getItem("Sheet1").getRange("A1"); // rowToCopy.copyTo(destinationRange); // path3 var file3Path = "pathfile3.xlsx"; // save file3 return file1.saveCopyAs(file3Path).then(function (file3) { // add infos of additional column var sheet3 = file3.worksheets.getActiveWorksheet(); var range2B = sheet2.getRange("L:L"); range2B.load("values"); return context.sync().then(function () { var data2B = range2B.values; var columnBValues = []; for (var k = 0; k < data2B.length; k++) { columnBValues.push([data2B[k][0]]); } // add the new column at the end of the document of file3 var usedRange3 = sheet3.getUsedRange(); var lastColumn = usedRange3.getLastColumn(); var destinationRangeB = usedRange3.getCell(1, lastColumn + 1); destinationRangeB.values = columnBValues; // save return file3.save(); }); }); } } } // Close file1.close(); file2.close(); return context.sync(); }).catch(function (error) { console.log(error); }); });
错误信息
错误: 第3行第7列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第4行第7列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第7行第7列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第8行第7列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第11行第7列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第12行第7列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第20行第9列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第22行第11列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第27行第13列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第37行第15列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第38行第15列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第49行第17列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第50行第17列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第55行第19列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第62行第19列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第63行第19列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第64行第19列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。 第56行第19列:Office Scripts无法推断该变量的数据类型,请为变量声明类型。
解决方案
Office Scripts基于TypeScript,要求必须显式声明变量类型,不能依赖隐式推断。以下是修正后的代码,不仅添加了正确的类型声明,还修复了原代码中的逻辑问题(如提前return导致仅处理第一行匹配项、复制目标错误、追加列逻辑不匹配等):
Excel.run(async (context) => { // 打开文件并声明类型 const file1: Excel.Workbook = context.workbook.application.workbooks.open("pathfile1.xlsx"); const file2: Excel.Workbook = context.workbook.application.workbooks.open("pathfile2.xlsx"); // 获取工作表并声明类型 const sheet1: Excel.Worksheet = file1.worksheets.getActiveWorksheet(); const sheet2: Excel.Worksheet = file2.worksheets.getActiveWorksheet(); // 获取对比列范围并声明类型 const range1: Excel.Range = sheet1.getRange("H:H"); const range2: Excel.Range = sheet2.getRange("H:H"); // 获取File2的K列范围(原代码误写为L列) const rangeK: Excel.Range = sheet2.getRange("K:K"); // 加载所需数据 range1.load("values"); range2.load("values"); rangeK.load("values"); await context.sync(); // 声明数据类型 const data1: (string | number | boolean)[][] = range1.values; const data2: (string | number | boolean)[][] = range2.values; const dataK: (string | number | boolean)[][] = rangeK.values; // 收集所有匹配行的数据 const matchedRows: (string | number | boolean)[][] = []; const matchedKValues: (string | number | boolean)[][] = []; for (let i = 0; i < data1.length; i++) { const value: string | number | boolean = data1[i][0]; if (value !== "" && value !== undefined) { // 查找File2中匹配的行 for (let j = 0; j < data2.length; j++) { if (data2[j][0] === value) { // 获取File1当前行的A-Z数据 const rowRange: Excel.Range = sheet1.getRange(`A${i+1}:Z${i+1}`); rowRange.load("values"); await context.sync(); matchedRows.push(rowRange.values[0]); // 获取对应行的K列数据 matchedKValues.push([dataK[j][0]]); break; } } } } // 创建File3并写入数据 const file3Path: string = "pathfile3.xlsx"; const file3: Excel.Workbook = await file1.saveCopyAs(file3Path); const sheet3: Excel.Worksheet = file3.worksheets.getActiveWorksheet(); // 写入匹配行数据 if (matchedRows.length > 0) { const writeRange: Excel.Range = sheet3.getRange(`A1:Z${matchedRows.length}`); writeRange.values = matchedRows; // 写入K列追加数据 const lastCol: number = sheet3.getUsedRange().getLastColumn(); const kWriteRange: Excel.Range = sheet3.getRange(1, lastCol + 1, matchedKValues.length, 1); kWriteRange.values = matchedKValues; await context.sync(); await file3.save(); } // 关闭文件 file1.close(); file2.close(); await context.sync(); }).catch((error: Error) => { console.log(error); });
关键修改点
- 给所有Office API对象(
Excel.Workbook、Excel.Worksheet、Excel.Range)显式声明类型 - 给数组、基础类型(字符串、数字、布尔值)添加类型声明
- 改用
async/await替代链式then,提升代码可读性 - 修复原代码中提前
return导致仅处理第一行匹配项的问题 - 修正原代码中误将K列写为L列的错误
- 调整数据收集逻辑,确保追加的K列数据与匹配行一一对应
- 优化文件写入逻辑,批量写入数据提升效率
内容的提问来源于stack exchange,提问作者AoLMatthieu
相关产品推荐
相关产品推荐

