如何通过Excel JavaScript API仅锁定专用单元格

时间:2017-08-02 14:25:04

标签: office-js

正如记载here我试图仅锁定一些单元格(在我的情况下是一列的所有单元格),但整个文档的所有单元格都被锁定,而不仅仅是该范围的单元格。我已经尝试仅锁定一些像“D1:D5”这样的细胞,但是所有的细胞都被锁定了,而不仅仅是这5个细胞。

这是我的代码:

function lockColumnHandler() {
    lockColumn("Sheet1", "D:D");
}

function lockColumn(sheetName, columnRange) {
    Excel.run(function (ctx) {
        var sheet = ctx.workbook.worksheets.getItem(sheetName);
        var range = sheet.getRange(columnRange);

        if (range) {
            range.format.protection.locked = true;
        }

        sheet.protection.protect({
            allowAutoFilter: true,
            allowDeleteColumns: true,
            allowDeleteRows: true,
            allowFormatCells: true,
            allowFormatColumns: true,
            allowFormatRows: true,
            allowInsertColumns: true,
            allowInsertHyperlinks: true,
            allowInsertRows: true,
            allowPivotTables: true,
            allowSort: true
        });

        return ctx.sync();
    })
    .catch(errorHandler);
}

2 个答案:

答案 0 :(得分:2)

Excel中的默认状态是所有单元格都标记为已锁定(您可以右键单击Excel中的任何单元格,转到格式化单元格 - >保护,您将找到"已锁定"已勾选默认情况下)。

因此,为了仅锁定这些单元格,除了要锁定的单元格之外,您必须解锁工作表的所有单元格。

答案 1 :(得分:1)

如果我在Excel中创建一个新工作表,用一些测试数据填充它,并运行以下代码,看起来 columnRange 范围内的单元格的初始状态已锁定< / EM>:

function lockColumn(sheetName, columnRange) {

    Excel.run(function (ctx) {
        var sheet = ctx.workbook.worksheets.getItem(sheetName);
        var range = sheet.getRange(columnRange);

        if (range) {
            range.load(['address', 'format/protection/locked']);
            ctx.sync()
                .then(function () {
                    console.log(`The range address is: "${range.address}".`);
                    console.log('Initial value of range.format.protection.locked: ' + range.format.protection.locked);
                });
        };
        return ctx.sync();
    })
    .catch(errorHandler);
}

在新工作表中运行此代码的控制台输出是:

console output

根据这些调查结果,我怀疑您所描述的结果可能是由于新表中所有单元格的初始状态已锁定(即,您认为您的代码只是锁定工作表中的某些单元格,但实际上,您的代码没有任何效果,因为工作表中的所有单元格都已默认锁定)。也许先尝试解锁工作表中的所有单元格,然后再显示只锁定要锁定的单元格?