Excel office-js:合并 2 个或更多单元格

Excel office-js: Merge 2 or more cells

我需要合并 2 个单元格并在合并后的单元格中有一个值。
我的(失败)尝试:

#1

Excel.run(function (context) {
    const newSheet = context.workbook.worksheets.add("New sheet 1");
    newSheet.activate();
    const values = [
        ["Row 1", "", "Row 1"],
        ["Row 2", "Row 2", "Row 2"]
    ];
    newSheet.getRange("A1").values = values;
    newSheet.getRange("A1:B1").merge = true;
});

#2

Excel.run(function (context) {
    const newSheet = context.workbook.worksheets.add("New sheet 1");
    newSheet.activate();
    const values = [
        ["Row 1", "", "Row 1"],
        ["Row 2", "Row 2", "Row 2"]
    ];
    newSheet.getRange("A1").values = values;
    newSheet.getRange("A1").getResizedRange(0, 1).merge = true;
});

我哪里做错了?

编辑:标记的答案是正确的,不是因为它的主要内容——而是因为Kim Brandl's later reply - in which, my solution is using API 1.1 - but the merge() can only work in API 1.2

非常感谢!

您的第一个问题是 merge() 是一种方法,而不是 属性。对于像这样的范围内的单元格的简单合并,语法为:

var range = newSheet.getRange("A1:B1");
range.merge();

第二个问题是您需要在此之后 sync 才能将更改提交到工作表:

Excel.run(function (context) {
  const newSheet = context.workbook.worksheets.add("New sheet 1");
  newSheet.load('name');
  return context.sync().then(function () {                       
      var range = newSheet.getRange("A1:B1");
      range.merge();       
      newSheet.activate(); 
      return context.sync();
  });        
});

试试官方的 doc

        Excel.run(function (ctx) {
        var sheetName = "New Sheet 1";
        var rangeAddress = "A1:B1"; 
        var range = ctx.workbook.worksheets.getItem(sheetName).getRange(rangeAddress);
        range.select();
        return ctx.sync(); 
    }).catch(function(error) {
            console.log("Error: " + error);
            if (error instanceof OfficeExtension.Error) {
                console.log("Debug info: " + JSON.stringify(error.debugInfo));
            }
    });

下面是创建新 sheet 的代码片段,向 sheet 添加 2 行数据,然后合并单元格 A1 和 B1。

Excel.run(function (context) {

    // create new sheet, add 2 rows of data
    const newSheet = context.workbook.worksheets.add("New sheet 1");
    newSheet.activate();
    const values = [
        ["Row 1", "Row 2", "Row 1"],
        ["Row 2", "Row 2", "Row 2"]
    ];
    newSheet.getRange("A1").getResizedRange(values.length - 1, values[0].length - 1).values = values;

    // merge cells A1 and B1 
    var myRange = newSheet.getRange("A1:B1");
    myRange.merge();

    return context.sync();
})
    .catch(function (error) {
        console.log('error: ' + error);
        if (error instanceof OfficeExtension.Error) {
            console.log('Debug info: ' + JSON.stringify(error.debugInfo));
        }
    });

这是 运行 此代码在 Excel 中的结果:

注意以下几点:

  • 如果要合并的范围内的多个单元格包含值,则只有范围的第一个单元格(即范围中最左上角的单元格)中的值是持久化——所有后续的单元格值都被清除。例如,上面示例中的 sheet 最初在单元格 B1 中包含一个值 ("Row 2") - 但如上面的屏幕截图所示,只要单元格 B1 与单元格 A1 合并,该值就会消失.

  • 您只需要一个 context.sync()——因为您只是将数据写入 sheet 并合并单元格,这些命令可以排队并使用最后是单个 sync()。

  • 重要的是始终包含错误处理(正如我对 catch 语句所做的那样),以确保事情不会在您不知情的情况下悄无声息地失败。

更新(添加关于需求集的信息)

一点额外的信息 -- 看起来 range.merge() 已添加到 Excel JavaScript API 作为要求集 1.2 的一部分。我建议您在 Office 加载项文档中确认您 运行 version/platform 支持要求集 1.2(或更高版本)的 Office -- https://dev.office.com/reference/add-ins/requirement-sets/excel-api-requirement-sets. For information about how to get the latest version of Office, see this topic