Excel Script技术问询:如何将数据输出至同文件夹外部工作簿
解决方案:用Office Script + OneDrive REST API写入外部工作簿
Office Script本身无直接操作外部工作簿的原生API,但可借助OneDrive/SharePoint的REST API实现同文件夹下外部工作簿的数据追加,无需依赖Power Automate。
核心逻辑
- 收集当前工作簿的目标数据
- 通过API定位同文件夹下的目标工作簿
- 获取目标工作表的已用范围,计算数据追加的起始行
- 调用API将数据写入目标工作表的对应位置
完整脚本代码
async function main(workbook: ExcelScript.Workbook) { // 收集当前工作簿的待写入数据 const activeSheet = workbook.getActiveWorksheet(); const data = [ activeSheet.getRange('H13').getText(), activeSheet.getRange('H14').getText(), activeSheet.getRange('H15').getText(), activeSheet.getRange('H16').getText(), activeSheet.getRange('H23').getText(), activeSheet.getRange('H22').getText(), activeSheet.getRange('H21').getText(), activeSheet.getRange('H20').getText(), activeSheet.getRange('H18').getText() ]; // 配置目标工作簿参数,替换为实际名称 const targetWorkbookName = "Database.xlsx"; const targetSheetName = "Zapier"; // 获取当前工作簿所在文件夹路径 const currentWorkbookUrl = workbook.getUrl(); const folderUrl = currentWorkbookUrl.substring(0, currentWorkbookUrl.lastIndexOf('/')); // 调用OneDrive API搜索目标工作簿,获取文件ID const searchResponse = await fetch(`${folderUrl}/search(q='${targetWorkbookName}')?select=id,name`, { method: 'GET', headers: { 'Accept': 'application/json;odata.metadata=none' } }); const searchResult = await searchResponse.json(); if (searchResult.value.length === 0) { throw new Error(`未找到目标工作簿:${targetWorkbookName}`); } const targetFileId = searchResult.value[0].id; // 获取目标工作表的已用范围,计算追加起始行 const usedRangeResponse = await fetch(`https://graph.microsoft.com/v1.0/me/drive/items/${targetFileId}/workbook/worksheets/${targetSheetName}/usedRange`, { method: 'GET', headers: { 'Accept': 'application/json' } }); let startRow = 1; try { const usedRange = await usedRangeResponse.json(); startRow = usedRange.rowCount + usedRange.rowIndex + 1; // Excel API行索引从0开始,需转成实际行号 } catch (e) { // 工作表为空时,从第1行开始写入 startRow = 1; } // 调用API写入数据到目标工作表 const writeResponse = await fetch(`https://graph.microsoft.com/v1.0/me/drive/items/${targetFileId}/workbook/worksheets/${targetSheetName}/range(address='A${startRow}:I${startRow}')`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ values: [data] }) }); if (!writeResponse.ok) { const errorDetails = await writeResponse.json(); throw new Error(`写入失败:${errorDetails.error.message}`); } console.log(`数据已成功追加到${targetWorkbookName}的${targetSheetName}工作表第${startRow}行`); }
关键注意事项
- 确保当前用户对目标工作簿拥有编辑权限
- 若使用SharePoint站点下的文件,需将API路径中的
me/drive替换为sites/{site-id}/drive(site-id可从SharePoint站点URL获取) - Excel Online环境下的
fetch会自动携带用户身份凭证,无需额外配置
内容的提问来源于stack exchange,提问作者Bnikushev
相关产品推荐
相关产品推荐

