迭代范围选择

时间:2016-11-11 23:11:12

标签: ms-office office-js

对于知道自己在做什么的人来说,这非常简单。

我有一个小脚本,用于提取当前选择并格式化单元格背景以匹配值(假设单元格为十六进制值)。我想在选定的任何范围内完成这项工作。我将不得不做一些检查,每个字符串是一个十六进制值等,但我在通过范围迭代时被阻止。

关于如何使用office.js循环选择范围的任何提示?

Office.context.document.getSelectedDataAsync(Office.CoercionType.Text,
    function (asyncResult) {
        if (asyncResult.status === Office.AsyncResultStatus.Failed) {
            console.log(asyncResult.error.message);
        } else {
            // write the result to range selection variable
            var rsel = asyncResult.value;
        }            


        Excel.run(function(context) {
            // convert to string
            context.workbook.getSelectedRange().format.fill.color = rsel.toString();
            return context.sync();
        }).catch(function(error) {
            console.log(error);
            if (error instanceof OfficeExtension.Error) {
                console.log("Debug info: " + JSON.stringify(error.debugInfo));
            }
        });
    }
);

1 个答案:

答案 0 :(得分:2)

根据你的描述,听起来你想要这样的东西吗?

enter image description here

这里有两个函数,一个是将随机十六进制值写入单元格,另一个是实际着色它们。请注意,通常最好不要在同一代码块中混合使用ExcelApi 1.1 API语法和Office 2013 getSelectedDataAsync,否则回调与承诺模式可能会有点混乱 - 尽管您确实已经在上面使用它。但是,对于我的示例,我将仅使用ExcelApi 1.1语法:

function setRandomValues() {
    Excel.run(function (context) {
        var selection = context.workbook.getSelectedRange();
        selection.format.fill.clear();
        selection.load("rowCount, columnCount");

        return context.sync()
            .then(function() {
                var valuesArray = [];
                for (var r = 0; r < selection.rowCount; r++) {
                    var rowValues = [];
                    for (var c = 0; c < selection.columnCount; c++) {
                        rowValues.push(getRandomColor());
                    }
                    valuesArray.push(rowValues);
                }
                selection.values = valuesArray;
            })
            .then(context.sync);

        function getRandomColor() {
            // from http://stackoverflow.com/a/5092872/678505
            return "#000000".replace(/0/g, function(){ 
                return (~~(Math.random()*16)).toString(16);
            });
        }
    })
    .catch(console.log)
}

function highlightSelection() {
    Excel.run(function (context) {
        var selection = context.workbook.getSelectedRange();
        selection.load("rowCount, columnCount, values");

        return context.sync()
            .then(function() {
                for (var r = 0; r < selection.rowCount; r++) {
                    for (var c = 0; c < selection.columnCount; c++) {
                        selection.getCell(r, c).format.fill.color = selection.values[r][c];
                    }
                }
            })
            .then(context.sync);
    })
    .catch(console.log);
}