Google工作表脚本-为多个工作表添加跨行边框



我有一系列带有帐户余额的选项卡。它们都有相同的7行标题。从第8行开始,我希望所有行的内容都在"B"列(日期)要有边框。我发现了一些有用的脚本工作(见链接),只要我指定表的名称:https://docs.google.com/spreadsheets/d/1v5w3Sd4BWubJVliZz03oqfnYIq2UkoufD_-cDtAcWkE/edit?usp=sharing

但我现在想修改脚本,使其适用于工作簿中的每个选项卡(甚至尚未创建的选项卡),无论名称如何。同样,在所有制表符中,第1-7行是相同的。

下面是上面链接对应的脚本:

function onEdit() {
GroupMyData(); // trigger this function when edits are made
}
function GroupMyData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Fam Lobo Murillo'); // apply to sheet name only
var rows = sheet.getRange('b8:J'); // range to apply formatting to
var numRows = rows.getNumRows(); // no. of rows in the range named above
var values = rows.getValues(); // array of values in the range named above
var testvalues = sheet.getRange('j1:j').getValues(); // array of values to be tested (1st column of the range named above)
rows.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID); // remove existing borders before applying rule below
//Logger.log(numRows);
for (var i = 0; i <= numRows - 1; i++) {
var n = i + 1;
//Logger.log(n);
//Logger.log(testvalues[i] > 0);
//Logger.log(testvalues[i]);
if (testvalues[i] > 0) { // test applied to array of values
sheet.getRange('b' + n + ':j' + n).setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID); // format if true
}
}
};

试试这样做:

function onEdit(e) {
const sh = e.range.getSheet();
if (e.range.rowStart >= 8 && e.range.columnStart == 2) {
sh.getRange(e.range.rowStart, 2, e.range.rowEnd - e.range.rowStart + 1, sh.getLastColumn() - 1).setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID)
}
}

我认为完成你想做的事情的最好方法是:

function onEdit(e) {
if (e.range.rowStart >= 8 && e.range.columnStart === 2) {
const sheet = e.source.getActiveSheet()
const numOfRows = (e.range.rowStart !== e.range.rowEnd) ? e.range.rowEnd-e.range.rowStart+1 : 1
const wasRemoved = sheet.getRange(e.range.rowStart, 2, numOfRows, sheet.getLastColumn()-1)
.getValues()
.every(row => row.every(col => col === ``))
if (wasRemoved) {
const dataAbove = sheet.getRange(e.range.rowStart-1, 2, 1, sheet.getLastColumn()-1)
.getDisplayValues()
.flat()
.some(cell => cell !== ``)
const dataBelow = sheet.getRange(e.range.rowEnd+1, 2, 1, sheet.getLastColumn()-1)
.getDisplayValues()
.flat()
.some(cell => cell !== ``)
sheet.getRange(e.range.rowStart, 2, numOfRows, sheet.getLastColumn()-1)
.setBorder(dataAbove, false, dataBelow, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID)

} else {
sheet.getRange(e.range.rowStart, 2, numOfRows, sheet.getLastColumn()-1)
.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID)

}
}
}

这将替换当前提供的代码。这将在任何从第8行开始的行周围添加边框,并在删除时删除边框。

当前你的脚本工作在之后的每一个编辑,它删除所有边框并重新添加它们。当在指定范围内编辑某些内容时,我提供的代码将严格运行。

最新更新