对于知道自己在做什么的人来说,这非常简单。
我有一个小脚本,用于提取当前选择并格式化单元格背景以匹配值(假设单元格为十六进制值)。我想在选定的任何范围内完成这项工作。我将不得不做一些检查,每个字符串是一个十六进制值等,但我在通过范围迭代时被阻止。
关于如何使用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));
}
});
}
);
答案 0 :(得分:2)
根据你的描述,听起来你想要这样的东西吗?
这里有两个函数,一个是将随机十六进制值写入单元格,另一个是实际着色它们。请注意,通常最好不要在同一代码块中混合使用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);
}