将一组值分配给一个范围

Assign an array of values to a range

我想用一组值启动一系列工作表。我有以下代码。

function initiate(address, values) {
    return Excel.run(function (ctx) {
        var sheet = ctx.workbook.worksheets.getActiveWorksheet();
        var range = sheet.getRange(address);
        var range.values = values;
        return ctx.sync()
    }
}

我的测试表明 仅当 values 具有与 address 完全相同的尺寸(即高度、宽度)时,或者当 values 是单个值。否则会报错。

有人可以证实吗?

如果是这样,我需要调整address以适应values的维度。很容易获得 values 的维度,但我无法 find a function 获得范围,例如,1 个左上角单元格 + 1 个行数 + 1 个列数,或 1 个左上角单元格和右下角的 1 个单元格。

我是不是漏掉了什么?

在 VBA 中,您将使用 Range.Resize. In OfficeJS there seems to be a function called getResizedRange 其中

[g]ets a Range object similar to the current Range object, but with its bottom-right corner expanded (or contracted) by some number of rows and columns.

不幸的是,它接受 delta 值,因此您需要计算当前范围大小与目标大小之间的差异。 例如,如果您想通过 cols 个单元格获得 rows 的范围,您可以尝试

var originalRange = sheet.getRange(address);
var range = originalRange.getResizedRange(
     rows - originalRange.rowCount, cols - originalRange.columnCount);

正如 CompuChip 所说,(还)没有 API 用于将范围调整为特定的 绝对 大小,尽管即将推出。

就是说:如果您有一个数组,只需从一个单元格开始,然后按数组的行数减 1(即 array.length - 1)调整其大小,然后按列减 1 (array[0].length - 1)

const values = [
    [1, 2, 3],
    ["Hello", "Bonjour", "Привет"]
]

await Excel.run(async (context) => {
    const sheet = context.workbook.worksheets.getActiveWorksheet();
    const range = sheet.getRange("D3").getResizedRange(
        values.length - 1, values[0].length - 1);
    range.values = values;
    await context.sync();
});

您可以在新的 Script Lab (https://aka.ms/getscriptlab). Simply install the Script Lab add-in (free), then choose "Import" in the navigation menu, and use the following GIST URL: https://gist.github.com/Zlatkovsky/6bc4a7ab36a81be873697cab0fa0b653. See more info about importing snippets to Script Lab.

中单击五下即可实时试用此代码段