Office js Office插件按钮不调用函数

Office js Office插件按钮不调用函数,office-js,Office Js,我一直在做这个项目,一个简单的Excel目录插件。我似乎无法启动我的按钮。我可以调试并查看任务窗格,但单击按钮什么也做不了 有两个按钮:创建和删除。我的js文件是 编辑 使用ScriptLab,我成功地测试了以下代码。但是,当我尝试将其移植回VS时,单击按钮时什么也不做 $("#run").click(() => tryCatch(run)); async function run() { await Excel.run(async (context) => { va

我一直在做这个项目,一个简单的Excel目录插件。我似乎无法启动我的按钮。我可以调试并查看任务窗格,但单击按钮什么也做不了

有两个按钮:创建和删除。我的js文件是

编辑

使用ScriptLab,我成功地测试了以下代码。但是,当我尝试将其移植回VS时,单击按钮时什么也不做

$("#run").click(() => tryCatch(run));

async function run() {
  await Excel.run(async (context) => {

    var sheets = context.workbook.worksheets;
    sheets.load("items/name");
    var sheetName = 'Table of Contents';
    await context.sync();

    return context.sync()
      .then(function () {

        var toc = sheets.items.find(ws => ws.name == sheetName);
        if (!toc) {
          toc = sheets.add(sheetName);
          context.sync();
        } else {
          toc.getUsedRange().clear();
        }
        toc.load("name, position");
        context.sync();

        var values = [];
        var count = 0;
        sheets.items.forEach((ws) => {
          if (ws.name !== sheetName) {
            values.push([(count + 1), "=HYPERLINK(\"#\"&\"'\" & \"" + ws.name + "\" & \"'!A1\",\"" + ws.name + "\")"]);
            count++;
          }
        })

        toc.position = 0;
        toc.activate();
        toc.getRange("A:A").format.columnWidth = 2;
        toc.getRange("B:B").format.columnWidth = 20;
        toc.getRange("C:C").format.columnWidth = 200;
        toc.getRange("C:C").format.wrapText = true;
        toc.getRange("1:1").format.rowHeight = 5;
        toc.getRange("3:3").format.rowHeight = 5;
        toc.getRange("B2").values = [["Table of Contents"]];
        toc.getRange("B2").format.font.size = 18;
        toc.getRange("B2").format.font.bold = true;

        if (values.length === 0) {
          console.log('error 1');
          return context.sync();
        }

        var dataRangeAddress = `B4:C${3 + (count || 1)}`;
        var dataRange = toc.getRange(dataRangeAddress);
        context.sync();
        dataRange.values = values;
        toc.calculate(false);

        return context.sync();
      });

    await context.sync();
  });
};

/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
  try {
    await callback();
  } catch (error) {
    // Note: In a production add-in, you'd want to notify the user through your add-in's UI.
    console.error(error);
  }
};

我注意到的一件事是,你有一个
用于。。。在
循环中,在
工作表上运行。项目

for (i in sheets.items)
但这是一个数组。对…使用
被认为是一种不好的做法。。。在
数组上循环。(请参阅。)除此之外,做一些非标准的事情会让其他人更难对您的代码进行推理

更重要的是,您需要获得更多有关出错原因的信息。请下载。您可以使用它来测试您的方法,它有一个很好的控制台,可以向您报告错误


更新:我还看到您的
removeTableOfContents
函数测试了
的真实性!工作表
,但文件中未声明名为
工作表
的变量,因此
!工作表
将始终解析为真实

最初我是从一个模板开始工作并调整它。这是在升级到2019年之前在VS(2015)的早期版本中创建的。因此,我发现命名约定略有不同

此特定问题与'element'和'messageBanner'变量中的Office.initialize函数有关。调整此代码可以让按钮发挥作用。我怀疑如果我没有在早期版本中创建原始项目,它可能会工作得很好

原始/违规代码:

    var element = document.querySelector('.ms-MessageBanner');
    messageBanner = new fabric.MessageBanner(element);
调整/工作代码:

    var element = document.querySelector('.MessageBanner');
    messageBanner = new components.MessageBanner(element);

啊,好的。我认为这是一个需要迭代的对象。我大致理解其中的差异。谢谢你的链接。我尝试了ScriptLab,但出现了一个错误。不知道如何发布我使用的代码,这些注释是有限制的。非常感谢您的帮助!另外,我得到的原始纸张循环来自:。很好。我会把那个循环修好的。更新了帖子里的代码。让它在ScriptLab中工作,但在VS项目中仍然不工作。可能是回调?您的处理程序分配在处理程序名称周围加上双引号,如
$(“#toCreate”)。单击(“createTableOfContents”)
。删除双引号。