在 MS Word 加载项 Javascript API 中读取 table 边框的颜色和宽度

Read color and width of table border in MS Word add-in Javascript APIs

我正在尝试使用 Word 加载项 Javascript API 来打印文档中所有表格的顶部边框的颜色和宽度。

我正在使用以下代码:

    Word.run(function (context) {
        var range = context.document.getSelection();
        var tables = context.document.body.tables;
        context.load(range);
        context.load(tables);
        return context.sync().then(function () {
            for (var i = 0; i < tables.items.length; i++) {
                var topBorder = tables.items[i].getBorder("Top");
                context.load(topBorder, ['color', 'width']);
                var color = "1", width = "1";
                context.sync().then(function () {
                    color = topBorder.color.toString();
                    width = topBorder.width.toString();
                });
                range.insertText(color, "End");
                range.insertText(width, "End");
            }
            return context.sync();
        });
    });

但是当我 运行 这个时,它打印 11 而不是打印正确的值。

我试过在线搜索一些示例代码,但只能找到设置值的代码。我错过了什么?

谢谢!

您的代码中存在一些问题:

  1. 次要:您不需要加载范围对象,因为您正在写入它,而不是读取它。
  2. 你在循环中有一个 context.sync。这很少是个好主意。它会损害性能并使您的代码难以推理。通常的解决方法是循环两次,循环之间有一个 context.sync 。第一个循环填充一个数组(将在第二个循环中循环)并加载将在第二个循环中读取的每个 Office 对象 属性。请参阅下面的代码。
  3. 你有一个 context.sync().then(),里面还有一个 context.sync().then()。如果你把 console.log("outer then") 作为外层 then 的最后一行,把 console.log("inner then") 作为内层 then 的第一行,你会看到你的外层 then 在内部 then 之前完成。这就是为什么你得到“11”。在这些变量已从其初始值更改之前写入文档 运行 的行。
  4. 我从 运行 在 Script Lab 工具中使用你的代码发现 color = topBorder.color.toString(); 行抛出一个错误,指出 color 属性 是未加载。这可能是您的分支 Promise 链的另一个副作用。

以下代码有效、更简单且性能更高,因为无论文档中有多少表,它都只同步 3 次。

Word.run(function (context) {
    var range = context.document.getSelection();
    var tables = context.document.body.tables.load("items");
    var topBorders = [];
    return context.sync()
      .then(function () {
        for (var i = 0; i < tables.items.length; i++) {
          topBorders.push(tables.items[i].getBorder("Top").load(['color', 'width']));
        }
      })
      .then(context.sync)
      .then(function () {
        for (var i = 0; i < topBorders.length; i++) {
          range.insertText(topBorders[i].color.toString(), "End");
          range.insertText(topBorders[i].width.toString(), "End");
        }
      })
      .then(context.sync)
});