Как извлечь текст комментария из выбранных ячеек в office js?

#office-js #office-js-store

Вопрос:

Я работаю над надстройкой office js, я не могу получать комментарии из нескольких ячеек, которые уже прокомментировали

скриншот

кроме того, я прочитал документ office js. доступен только один пример комментария. Мой код возвращает только комментарий к первым ячейкам. Я не знаю, что я делаю не так.

  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));
    }
 

Ответ №1:

Проблема в том, что 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();
    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);
    }
  });
}
 

Ответ №2:

Поскольку вы повторяете массив rangeAddresses, вы можете создать новый массив (например, cellComments) с помощью метода map и вернуть комментарии со свойством содержимого, которое будет загружено. Как только вы это сделаете, выполните другую инструкцию 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() в цикле. Это будет лучше для производительности.

Комментарии:

1. спасибо за помощь.пожалуйста, помогите мне, как я могу найти подходящий документ office js для моего дальнейшего использования, потому что документы Microsoft office JS не так удобны для разработчиков.

2. В общем случае вам необходимо загрузить свойство объекта, прежде чем вы сможете его использовать. Я сделал это как со свойствами rowCount, так и со свойствами colCount и другими. После их загрузки вы можете использовать их после выполнения инструкции context.sync. Я все еще учусь сам. В качестве примера я только что узнал, что вам не нужно загружать свойство address, чтобы использовать метод getItemByCell. Этот метод принимает как строки, так и диапазоны. Таким образом, вы можете передать ссылку на ячейку напрямую. Вы также можете объявить переменную с типом объекта, чтобы просмотреть элементы этого объекта. Это также поможет изучить объектную модель.