以下代码在指示的行上产生“ItemNotFound”错误。直到最近,我相信它运作良好。 如果我注释掉“addCoumns”行(并使rowsToAdd = 0),则没有错误。
背景:我在Word文档中有很多表。所有表都在内容控件中。我的代码循环遍历表并更新值(基于Excel数据)。在更新值之前,它通常会插入/删除行/列,以使表格与源数据的大小相匹配(Excel范围)。 注意:我循环遍历每个单元格,因为它比从2D数组设置整个表格要快得多(特别是如果不是所有单元格都需要更新)。
如何修改代码以避免错误?我认为我的getFirst ... getNext ...方法不是最好的。
在脚本实验室中运行:
$("#run").click(updateTables);
//first insert a table inside a content control
function updateTables() {
Word.run(function (context) {
var CCs = context.document.contentControls;
context.load(CCs, "tag, id");
return context.sync().then(function () {
var myTable = CCs.items[0].tables.getFirst();
var arrValues = myTable.load("values");
return context.sync().then(function () {
var rowsToAdd = 1;
var colsToAdd = 1;
var rows = arrValues.values.length + rowsToAdd;
var cols = arrValues.values[0].length + colsToAdd;
CCs.items[0].tables.getFirst().addRows("end", rowsToAdd);
CCs.items[0].tables.getFirst().addColumns("end", colsToAdd);
return context.sync().then(function () {
var tCell;
//ItemNotFound error occurs on this line:
var tRow = CCs.items[0].tables.getFirst().rows.getFirst();
for (var row = 0; row < rows; row++) {
tCell = tRow.cells.getFirst();
for (var col = 0; col < cols; col++) {
tCell.value = 'r' + row + ':c' + col;;
if (col < cols - 1) {
tCell = tCell.getNext();
}
}
if (row < rows - 1) {
tRow = tRow.getNext();
}
}
return context.sync().then(function () {
console.log("Done");
});
});
});
});
})
.catch(OfficeHelpers.Utilities.log);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Word使用deleteColumns或deleteRows冻结。通常在Mac上与Windows相似。
答案 0 :(得分:0)
超级有趣的问题我需要更详细地研究为什么你的脚本表现得像这样。 但与此同时,我创建了一个等同于你的代码的打字稿,请试一试,我认为它解决了这个问题。
https://gist.github.com/JuaneloJuanelo/f40eab599d7fc7b95a1f942a689ef243