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。
我需要合并 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。