Office-js:在 Excel 中插入一个新列并用新数据部分填充它

Office-js: Insert a new column in Excel and partially fill it with new data

虽然我对 the new Office.js 很兴奋,但我似乎很难让它执行最基本的 excel 操作,并且在他们的 [=40= 上找到答案的成功率非常有限].

无论如何,如何将新列插入 excel 并用数据部分填充它?

我有类似的东西:

Excel.run(async (ctx) => { 
    let sheet = ctx.workbook.worksheets.getItem("Sheet1");
    let range = sheet.getRange("C4:C5").insert('right');
    range.values = [["foo"],["bar"]];
    await ctx.sync();   
}).catch(function (error) {
    console.log(error);
});

但是这段代码的问题在于它在我想要的地方插入了新数据,即 C 列的右侧,但它没有创建新列,而是 移动了所有其他列中的数据,但仅在第 4-5 行 上,这弄乱了我 spreadsheet/table.

的其余部分

相反,我想首先在 C 的右侧插入一个新列,然后在该新列中,为其分配一个值数组以部分填充它。谢谢。


编辑:
这是我得到的:

 _______________________
|  C  |  D  |  E  |  F  |
-------------------------
| ... | john| 4   | ... |
| ... | jeff| 87  | ... |
| ... | mary| 9   | ... |
| ... |  foo| cory| 54  |    <--- just shifts data in rows 4 and 5 over
| ... |  bar| eric| 33  |
| ... | paul| 5   | ... |
-------------------------
   ^----------------------------- column I have a reference/address too (column C)

这就是我想要的:

 _______________________
|  C  |  D  |  E  |  F  |
-------------------------
| ... |     | john| 4   |   
| ... |     | jeff| 87  |
| ... |     | mary| 9   |
| ... |  foo| cory| 54  |
| ... |  bar| eric| 33  |
| ... |     | paul| 5   |
-------------------------

我很难理解 Office-js 的做事方式,但我能够让它主要与类似的东西一起工作:

  ...
  sheet = ctx.workbook.worksheets.getItem("Sheet1");
  sheet.getRange("C:C").insert('right'); 
  await ctx.sync();

  let range = sheet.getRange("C4:C7");
  range.values = [["foo"],["bar"]];
  await ctx.sync();
  ...

我原本希望在我开始的列的右侧添加一个新列并在该新列中添加数据,但由于我实际上并没有在我的代码中硬编码地址,所以结果是更容易并且仍然足够接近我想要的......但我绝对仍然愿意接受更好或更正确的方法。

我为此苦苦挣扎,来自 VBA。我花了一段时间才理解的技巧是必须将整个列传递给 .insert.

我制作了一个小函数,它将 return 相对于旧范围的新范围并采用可选列 header,您可以指定“第 header 列”。

这是因为我给函数的范围是 table 中的单个列,但只有 body,不包括 header。 returning 范围也是body,但header 已设置为比rng 高出一行。

示例:

function Get_InsertCol(rng, opt_colheader, opt_colheaderupone, opt_shiftdir) {
    if (opt_shiftdir == undefined) { opt_shiftdir = 'right' }
    rng.getColumn(0).getEntireColumn().getOffsetRange(0, 1).insert(opt_shiftdir);
    if (opt_colheader != undefined) {
        if (opt_colheaderupone == undefined) {
            rng.getRow(0).getOffsetRange(0, 1).values = opt_colheader
        } else {
            rng.getRow(0).getOffsetRange(-1, 1).values = opt_colheader
        }
    };
    return rng.getOffsetRange(0, 1);
}

export async function helloworld(event) {
    try {
        await Excel.run(async (context) => {
            //Start Func
            var ws = context.workbook.worksheets.getActiveWorksheet();

            ws.getRange("B2").values = "ColumnHeader"
            var rng = ws.getRange("B3:B5")
            rng.values = "testdata"

            var offsetrng = Get_InsertCol(rng,"ColHeader",true)
            offsetrng.select();

            await context.sync();
        });
    } catch (error) {
        console.error(error);
    }
    event.completed();
}

结果: