You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Office JS提取选中的多个单元格中的批注文本

问题原因

你代码的核心问题出在forEach循环搭配异步函数的逻辑上:Array.prototype.forEach不支持等待异步回调执行完成,你在回调里写的await context.sync()不会阻塞外层函数执行,会导致所有批注的加载和同步逻辑并发混乱,最终只能拿到第一个有效结果。
同时多次循环调用context.sync也会大幅降低执行效率,完全可以一次加载所有批注后统一同步。另外原代码使用的getItemByCell如果对应单元格没有批注会直接抛出异常,兼容性较差。

修复后的代码
try {
  await Excel.run(async (context) => {
    const wb = context.workbook;
    const selectedRange = wb.getSelectedRange();
    selectedRange.load("rowCount, columnCount");
    await context.sync();

    const rowCount = selectedRange.rowCount;
    const colCount = selectedRange.columnCount;
    const cellCommentList = [];

    // 先批量创建所有批注对象并加载所需属性
    for (let i = 0; i < rowCount; i++) {
      for (let j = 0; j < colCount; j++) {
        const currentCell = selectedRange.getCell(i, j);
        const comment = wb.comments.getItemOrNullObject(currentCell);
        comment.load("content, author, date");
        cellCommentList.push({
          cell: currentCell.load("address"),
          comment
        });
      }
    }

    // 仅需一次同步即可拿到所有加载的数据
    await context.sync();

    // 遍历输出所有结果
    cellCommentList.forEach(item => {
      console.log("单元格地址:", item.cell.address);
      if (item.comment.isNullObject) {
        console.log("该单元格无批注");
      } else {
        console.log("选中单元格批注:", item.comment.content);
      }
    });
  });
} catch (error) {
  ErrorProvider.getInstance().notify(JSON.stringify(error));
}
核心优化点
  • 替换forEach异步逻辑为预加载方案,解决同步混乱导致只能拿到第一个批注的问题
  • 仅执行1次context.sync,相比循环多次同步执行效率提升数倍
  • 用getItemOrNullObject替代getItemByCell,兼容无批注的单元格,避免异常报错
  • 省略提前批量查询单元格地址的冗余步骤,直接传入单元格对象查询批注,简化逻辑

内容的提问来源于stack exchange,提问作者Vineet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:15:03