从范围列表中大写



我想大写所有单元格的文本从一个范围列表。这能做到吗?

目前我有

function onEdit(e) {
var myRange = SpreadsheetApp.getActiveSheet().getRange('triggerRange'); //My range
var row = e.range.getRow();
var col = e.range.getColumn();
var activeSheet = e.source.getActiveSheet();
if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow()) {
capit(e);
} else if (activeSheet.getName() == 'Roster' && e.range.getValue() != "TRIGGER TEXT") {
unborder(e);
} else if (activeSheet.getName() == 'Roster' && e.range.getValue() == "TRIGGER TEXT") {
border(e);
}
}
// CAP IT
function capit(e) {
e.range.setValue(e.value.toUpperCase());
}
// UNBORDER
function unborder() {
SpreadsheetApp.getActiveSheet().getRange("B12:F22").setBorder(false, false, false, false, false, false);
}
// BORDER
function border() {
SpreadsheetApp.getActiveSheet().getRange("B12:F12").setBorder(true, true, true, true, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_THICK); //HEADER
SpreadsheetApp.getActiveSheet().getRange("B13:B18").setBorder(true, true, true, true, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_THICK); //ROW HEADER
SpreadsheetApp.getActiveSheet().getRange("B13:B18").setBorder(null, null, null, null, true, true, "black", SpreadsheetApp.BorderStyle.SOLID); //ROW HEADER
SpreadsheetApp.getActiveSheet().getRange("C13:F18").setBorder(true, true, true, true, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_THICK); //PLAYERS
SpreadsheetApp.getActiveSheet().getRange("C13:F18").setBorder(null, null, null, null, true, true, "black", SpreadsheetApp.BorderStyle.SOLID); //PLAYERS
SpreadsheetApp.getActiveSheet().getRange("B20:B22").setBorder(true, true, true, true, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_THICK); //LOWER ROW HEADER
SpreadsheetApp.getActiveSheet().getRange("B20:B22").setBorder(null, null, null, null, true, true, "black", SpreadsheetApp.BorderStyle.SOLID); //LOWER ROW HEADER
SpreadsheetApp.getActiveSheet().getRange("C20:F22").setBorder(true, true, true, true, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_THICK); //LOWER CONTENT
SpreadsheetApp.getActiveSheet().getRange("C20:F22").setBorder(null, null, null, null, true, true, "black", SpreadsheetApp.BorderStyle.SOLID); //LOWER CONTENT
}

但是,而不是设置我的'triggerRange',我希望它是非连续的列和行。专门[' B4: F10"、"C13: F18 ', '甜:——F22 ']

我怎样才能做到这一点?我一定要用循环吗?

注:有时候我的borderunborder函数按预期调用,但其他时候它们不执行,知道为什么吗?

我相信你的目标是这样的。

  • 使用['B4:F10','C13:F18','C20:F22']~myRange的范围列表。并且,当编辑的范围在范围列表中时,要运行capit

在这种情况下,修改后的脚本如何?

修改脚本:

onEditcapit的功能进行了修改。为了使用['B4:F10','C13:F18','C20:F22']的范围列表,使用了Class Sheet的rangeList的方法。请将onEditcapit的功能修改如下,并重新测试。

function onEdit(e) {
var activeSheet = e.source.getActiveSheet();
var myRange = activeSheet.getRangeList(['B4:F10','C13:F18','C20:F22']).getRanges();
var range = e.range;
myRange.forEach(r => {
var startRow = r.getRow();
var startCol = r.getColumn();
var endRow = startRow + r.getNumRows() - 1;
var endCol = startCol + r.getNumColumns() - 1;
if (range.columnStart >= startCol && range.columnEnd <= endCol && range.rowStart >= startRow && range.rowEnd <= endRow) {
capit(e);
} else if (activeSheet.getName() == 'Roster' && e.range.getValue() != "TRIGGER TEXT") {
unborder(e);
} else if (activeSheet.getName() == 'Roster' && e.range.getValue() == "TRIGGER TEXT") {
border(e);
}
});
}
function capit(e) {
e.range.setValues(e.range.getValues().map(r => r.map(c => c.toUpperCase())));
}
参考:

  • getRangeList ()

最新更新