如何从office js中的选定单元格中提取评论文本?

How to Extract Comment Text from Selected cells in office js?

我正在开发 office js 加载项,我无法从多个已评论的单元格中获取评论

截图

另外,我读过office js document。只有一个评论示例可用。我的代码只有 returns 第一个单元格注释。我不知道我做错了什么。

 try {
      await Excel.run(async (context) => {
        let wb = context.workbook;
        let rang = wb.getSelectedRange();
        rang.load("rowCount, columnCount");
        await context.sync();
        let rangRowCount = rang.rowCount;
        let rangColCount = rang.columnCount;

        let rangeAddresses = [];
        for (let i = 0; i < rangRowCount; i++) {
          {
            for (let j = 0; j < rangColCount; j++) {
              let newRang = rang.getCell(i, j);
              rangeAddresses.push(newRang.load("address"));
            }
          }
        }
        await context.sync();
        rangeAddresses.forEach(async (e) => {
          console.log("address ", e.address);
          var comment = wb.comments.getItemByCell(e.address);
          comment.load("content");
          await context.sync();
          console.log("selected cell comment", comment.content);
        });
      });
    } catch (error) {
      ErrorProvider.getInstance().notify(JSON.stringify(error));
    }

问题是 forEach 不是 promise-aware。它不支持异步和等待。请尝试以下代码段:

async function run() {
  await Excel.run(async (context) => {
    let wb = context.workbook;
    let rang = wb.getSelectedRange();
    rang.load("rowCount, columnCount");
    await context.sync();
    let rangRowCount = rang.rowCount;
    let rangColCount = rang.columnCount;

    let rangeAddresses = [];
    for (let i = 0; i < rangRowCount; i++) {
      {
        for (let j = 0; j < rangColCount; j++) {
          let newRang = rang.getCell(i, j);
          rangeAddresses.push(newRang.load("address"));
        }
      }
    }
    await context.sync();
    for (let index = 0; index < rangeAddresses.length; index++){
      console.log("address ", rangeAddresses[index].address);
      var comment = wb.comments.getItemByCell(rangeAddresses[index].address);
      comment.load("content");
      await context.sync();
      console.log("selected cell comment", comment.content);
    }
  });
}

由于您正在遍历 rangeAddresses 数组,因此您可以使用 map 方法创建一个新数组(例如 cellComments),并return 加载内容为 属性 的评论。完成后,执行另一个 context.sync() 语句来加载 属性,然后使用 foreach 遍历新数组。你可以这样做:

async function run() {
  await Excel.run(async (context) => {
    let wb = context.workbook;
    let rang = wb.getSelectedRange();
    rang.load("rowCount, columnCount");
    await context.sync();
    let rangRowCount = rang.rowCount;
    let rangColCount = rang.columnCount;

    let rangeAddresses = [];
    for (let i = 0; i < rangRowCount; i++) {
      {
        for (let j = 0; j < rangColCount; j++) {
          let newRang = rang.getCell(i, j);
          rangeAddresses.push(newRang.load("address"));
        }
      }
    }
    await context.sync();
    let cellComments : Excel.Comment[] = rangeAddresses.map((e)=>
    {
      console.log("address ", e.address);
      let comment = wb.comments.getItemByCell(e.address);
      return comment.load("content");
    })
    await context.sync()
    cellComments.forEach((comment)=>console.log(comment.content))
  })
};

使用此方法将避免您需要在循环中执行一堆 context.sync() 语句。这对性能会更好。