在 Office 脚本(打字稿)中编辑单元格时出现问题
Problem editing cell in office script (typescript)
大家。
我需要一些代码来监视活动或选定的单元格,以便在用户不在其中时阻止它们。我知道最终的问题是当用户选择单元格但仍未进行任何更改时,但这是我必须处理的事情,因为我们还不支持 'onChange' 之类的东西。问题是,如果用户开始编辑,getActiveCell/getSelectedRange 方法会失败并停止脚本,即使我在 try 块中调用它也是如此。下面的代码显示了这个想法的核心,当代码设法知道用户在哪个单元格中以及他何时离开该单元格时。下一步是使用 setLock 代替 console.log,一切都会好起来的。
function main(workbook: ExcelScript.Workbook)
{
while(true){
try{
let cell = workbook.getSelectedRange().getAddress();
}
catch(e){}
console.log(cell)
while(workbook.getSelectedRange().getAddress() == cell){}
}
}
如果您想在用户完成编辑并离开后锁定某个单元格,您可以尝试如下操作:
function main(workbook: ExcelScript.Workbook) {
let lastSelectedCell = "";
let cell = "";
let errorCaughtBefore = false;
let worksheet = workbook.getActiveWorksheet();
if (!worksheet.getProtection().getProtected()) {
worksheet.getProtection().protect();
}
while (true) {
try {
cell = workbook.getSelectedRange().getAddress();
if (errorCaughtBefore && lastSelectedCell) {
console.log(lastSelectedCell);
worksheet.getProtection().unprotect();
worksheet.getRange(lastSelectedCell).getFormat().getProtection().setLocked(true);
worksheet.getProtection().protect();
errorCaughtBefore = false;
}
}
catch (e) {
errorCaughtBefore = true;
lastSelectedCell = cell;
}
}
}
请注意:
- 如果没有适当的事件支持,所有这些变通方法都非常笨拙并且可能不可靠。
- 此外,根据 https://docs.microsoft.com/en-us/office/dev/scripts/develop/web-client-performance#avoid-using-trycatch-blocks-in-or-surrounding-loops,在循环内调用
try/catch
可能会导致脚本性能下降。
大家。
我需要一些代码来监视活动或选定的单元格,以便在用户不在其中时阻止它们。我知道最终的问题是当用户选择单元格但仍未进行任何更改时,但这是我必须处理的事情,因为我们还不支持 'onChange' 之类的东西。问题是,如果用户开始编辑,getActiveCell/getSelectedRange 方法会失败并停止脚本,即使我在 try 块中调用它也是如此。下面的代码显示了这个想法的核心,当代码设法知道用户在哪个单元格中以及他何时离开该单元格时。下一步是使用 setLock 代替 console.log,一切都会好起来的。
function main(workbook: ExcelScript.Workbook)
{
while(true){
try{
let cell = workbook.getSelectedRange().getAddress();
}
catch(e){}
console.log(cell)
while(workbook.getSelectedRange().getAddress() == cell){}
}
}
如果您想在用户完成编辑并离开后锁定某个单元格,您可以尝试如下操作:
function main(workbook: ExcelScript.Workbook) {
let lastSelectedCell = "";
let cell = "";
let errorCaughtBefore = false;
let worksheet = workbook.getActiveWorksheet();
if (!worksheet.getProtection().getProtected()) {
worksheet.getProtection().protect();
}
while (true) {
try {
cell = workbook.getSelectedRange().getAddress();
if (errorCaughtBefore && lastSelectedCell) {
console.log(lastSelectedCell);
worksheet.getProtection().unprotect();
worksheet.getRange(lastSelectedCell).getFormat().getProtection().setLocked(true);
worksheet.getProtection().protect();
errorCaughtBefore = false;
}
}
catch (e) {
errorCaughtBefore = true;
lastSelectedCell = cell;
}
}
}
请注意:
- 如果没有适当的事件支持,所有这些变通方法都非常笨拙并且可能不可靠。
- 此外,根据 https://docs.microsoft.com/en-us/office/dev/scripts/develop/web-client-performance#avoid-using-trycatch-blocks-in-or-surrounding-loops,在循环内调用
try/catch
可能会导致脚本性能下降。