如何从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() 语句。这对性能会更好。
我正在开发 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() 语句。这对性能会更好。