如何在office.js中获取工作表的所有公式

时间:2018-02-28 14:20:02

标签: office-js office-addins

如果工作表名称为Sheet1,我希望在该工作表的单元格中使用所有公式的数组。像这样:

Excel.run(function (ctx) {
    var formulas = getAllFormulasOfSheet(ctx, 'Sheet1')
    // or
    getAllFormulasOfSheet(ctx, 'Sheet1').then(function(result){
        var formulas = result;
    });

    // formulas should be like:
    ['SUM(A1:B3)', 'SUM(A3:C3)']
})

2 个答案:

答案 0 :(得分:3)

使用usedRange公式可能更合理,因为您不需要完整的公式。下面的脚本将导致返回使用范围的二维数组公式。 [['=sum(a1:b2)', '=sum(a2:b2)']]。如果需要,您还可以加载formulaR1C1formulaLocal。不支持检索无界范围(整行,列,表)。你必须对它们调用usedRange()方法来获取所有有用的单元格。

async function getFormulas() {
    try {
        await Excel.run(async (context) => {
            const sheet = context.workbook.worksheets.getItem("Sample");
            const range = sheet.getUsedRange();
            // const range = sheet.getRange("B2:E6"); //if you need specific address. You can also use named item based fetch.
            range.load("formulas");

            await context.sync();

            console.log(JSON.stringify(range.formulas, null, 4));
        });
    }
    catch (error) {
        //handle error
    }
}

答案 1 :(得分:2)

(Sudhi的答案是正确的,是第一个,所以它应该是“已接受”的答案。我正在添加这个答案以提供一些补充信息。)

正如Sudhi的回答所示,您应该使用Worksheet.GetUsedRange()方法获取实际使用的工作表的范围,然后引用该范围的formulas属性来标识该范围的公式包含。

但请注意,Range.formulas属性将包含一系列数组,其中包含范围内所有单元格的内容 - 而不仅仅是范围中的公式。例如,如果工作表包含此数据,则只有范围E3:E5中的单元格和范围C6:E6中的单元格包含公式:

enter image description here

然后工作表的“使用范围”的Range.formulas属性将返回此JSON:

[
    [
        "Product",
        "Qty",
        "Unit Price",
        "Total Price"
    ],
    [
        "Almonds",
        2,
        7.5,
        "=C3*D3"
    ],
    [
        "Coffee",
        1,
        34.5,
        "=C4*D4"
    ],
    [
        "Chocolate",
        5,
        9.56,
        "=C5*D5"
    ],
    [
        "TOTAL",
        "=SUM(C3:C5)",
        "=SUM(D3:D5)",
        "=SUM(E3:E5)"
    ]
]

我已经创建了一个可以与Script Lab(一个免费的插件,你可以在这里找到:aka.ms/getscriptlab)一起使用的要点,看看这一切是如何工作的。在Excel中安装Script Lab加载项后,打开脚本实验室代码窗格,从菜单中选择导入,然后导入此要点:{{ 3}}