Google 工作表中的条件边框
Conditional borders in Google Sheets
我正在尝试完全按照 的要求进行操作,但接受的答案根本行不通。原来的post说的很清楚了,这里再说一遍:
Excel apparently has this type of conditional formatting
built-in.
I'd like to accomplish the same in Google Sheets via Google Apps
Script. The following should demonstrate the before and after
conditions:
Example Dataset
A B C
1 apple Macintosh
2 apple Granny Smith
3 orange Florida
4 orange Valencia
5 pear Garden
6 banana Chiquita
Resulting Example Dataset
A B C
1 apple Macintosh
2 apple Granny Smith
-----------------------------------
3 orange Florida
4 orange Valencia
-----------------------------------
5 pear Garden
-----------------------------------
6 banana Chiquita
-----------------------------------
The script/answer to this question should display a bottom border
under the entire row (of columns 'A', 'B' & 'C') for rows: 2, 4, 5, & 6.
这个原始 post 的已接受答案提供了以下脚本:
function onOpen() {
GroupMyData(); // trigger this function on sheet opening
}
function GroupMyData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Sheet 1'); // apply to sheet name only
var rows = sheet.getRange('a1:g'); // 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('a1:a').getValues(); // array of values to be tested (1st column of the range named above)
rows.setBorder(false, false, false, false, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // 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('a' + n + ':g' + n).setBorder(null, null, true, null, null, null, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
}
}
};
该脚本的功能如下:
A 列的单元格中有一个数字(没有字母)的每一行的底部都会出现一个边框,无论该数字与上面单元格中的数字相同还是不同。
然而,目标是让 A 有文本,并且在 A 列下方的连续文本从重复字符串变为不同字符串的任何地方,不同字符串之间应该有一个边框。
提问者提到了之前基于评估数字的问答。在提问者的情况下,评估是基于一个字符串。
我参考了提问者提到的问题。我还提到了 How to compare strings in google apps script which contains a very elegant and efficient approach by Harold ,我已经在这个答案中进行了。这使用 indexof
来检测新值,因此下划线可以与每个新值相关联。
function so53053492() {
//setup spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet1");
// get key variables
var LastRow = sheet.getLastRow();
var LastColumn = sheet.getLastColumn();
//erase any current formatting
var ClearRange = sheet.getRange(1, 1, LastRow, LastColumn).setBorder(false, false, false, false, false, false); // clear all formatting
// get the data
var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();
// setup new array
var ListofFruits = new Array();
// Loop through the fruits (Column A)
for (var i in data) {
var row = data[i][0].toString();
// search for unqiue values
if (ListofFruits.indexOf(row) == -1) { // if value =-1, then the variable is unique
// Logger.log(row+" is not referenced. Adding it");//DEBUG
// underline the previous row
var range = sheet.getRange((+i + 1), 1, 1, 2).setBorder(true, false, false, false, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
// continue to build array
ListofFruits.push(row);
}
}
// underline the last row of the fruits column
var range = sheet.getRange(LastRow, 1, 1, LastColumn).setBorder(null, null, true, null, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
// Logger.log(ListofFruits);// DEBUG
}
更新 - 会计 Headers
之前的版本假设没有headers。此版本考虑了 headers。有几行代码受到影响,但关键变量是 headerRows
,它允许用户指定 headers.
的深度
function so53053492_01() {
//setup spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet3");
// get key variables
var LastRow = sheet.getLastRow();
var LastColumn = sheet.getLastColumn();
var NumColumns = sheet.getMaxColumns();
// allow for headers
var headerRows = 2;
//erase any current formatting
var ClearRange = sheet.getRange(1, 1, LastRow, NumColumns).setBorder(false, false, false, false, false, false); // clear all formatting
// get the data
var data = sheet.getRange((+1 + headerRows), 1, (LastRow - headerRows), LastColumn).getValues();
// setup new array
var ListofFruits = new Array();
// Loop through the fruits (Column A)
for (var i in data) {
var row = data[i][0].toString();
// Logger.log("Inside LOOP: i = "+i+", value = "+ row);// DEBUG
// search for unqiue values
if (ListofFruits.indexOf(row) == -1) { // if value =-1, then the variable is unique
// Logger.log("Inside IF#1: i = "+i+", "+row+" is not referenced. Adding it");//DEBUG
// underline the previous row
if (i != 0) {
// This IF statement to avoid underlining the Header row
var range = sheet.getRange((+i + 1 + headerRows), 1, 1, NumColumns).setBorder(true, false, false, false, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
}
// continue to build array
ListofFruits.push(row);
}
}
// underline the last row of the fruits column
var range = sheet.getRange(LastRow, 1, 1, NumColumns).setBorder(null, null, true, null, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
//Logger.log(ListofFruits);// DEBUG
}
我正在尝试完全按照
Excel apparently has this type of conditional formatting built-in.
I'd like to accomplish the same in Google Sheets via Google Apps Script. The following should demonstrate the before and after conditions:
Example Dataset
A B C 1 apple Macintosh 2 apple Granny Smith 3 orange Florida 4 orange Valencia 5 pear Garden 6 banana Chiquita
Resulting Example Dataset
A B C 1 apple Macintosh 2 apple Granny Smith ----------------------------------- 3 orange Florida 4 orange Valencia ----------------------------------- 5 pear Garden ----------------------------------- 6 banana Chiquita -----------------------------------
The script/answer to this question should display a bottom border under the entire row (of columns 'A', 'B' & 'C') for rows: 2, 4, 5, & 6.
这个原始 post 的已接受答案提供了以下脚本:
function onOpen() {
GroupMyData(); // trigger this function on sheet opening
}
function GroupMyData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Sheet 1'); // apply to sheet name only
var rows = sheet.getRange('a1:g'); // 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('a1:a').getValues(); // array of values to be tested (1st column of the range named above)
rows.setBorder(false, false, false, false, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // 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('a' + n + ':g' + n).setBorder(null, null, true, null, null, null, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
}
}
};
该脚本的功能如下: A 列的单元格中有一个数字(没有字母)的每一行的底部都会出现一个边框,无论该数字与上面单元格中的数字相同还是不同。
然而,目标是让 A 有文本,并且在 A 列下方的连续文本从重复字符串变为不同字符串的任何地方,不同字符串之间应该有一个边框。
提问者提到了之前基于评估数字的问答。在提问者的情况下,评估是基于一个字符串。
我参考了提问者提到的问题。我还提到了 How to compare strings in google apps script which contains a very elegant and efficient approach by Harold ,我已经在这个答案中进行了。这使用 indexof
来检测新值,因此下划线可以与每个新值相关联。
function so53053492() {
//setup spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet1");
// get key variables
var LastRow = sheet.getLastRow();
var LastColumn = sheet.getLastColumn();
//erase any current formatting
var ClearRange = sheet.getRange(1, 1, LastRow, LastColumn).setBorder(false, false, false, false, false, false); // clear all formatting
// get the data
var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();
// setup new array
var ListofFruits = new Array();
// Loop through the fruits (Column A)
for (var i in data) {
var row = data[i][0].toString();
// search for unqiue values
if (ListofFruits.indexOf(row) == -1) { // if value =-1, then the variable is unique
// Logger.log(row+" is not referenced. Adding it");//DEBUG
// underline the previous row
var range = sheet.getRange((+i + 1), 1, 1, 2).setBorder(true, false, false, false, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
// continue to build array
ListofFruits.push(row);
}
}
// underline the last row of the fruits column
var range = sheet.getRange(LastRow, 1, 1, LastColumn).setBorder(null, null, true, null, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
// Logger.log(ListofFruits);// DEBUG
}
更新 - 会计 Headers
之前的版本假设没有headers。此版本考虑了 headers。有几行代码受到影响,但关键变量是 headerRows
,它允许用户指定 headers.
function so53053492_01() {
//setup spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet3");
// get key variables
var LastRow = sheet.getLastRow();
var LastColumn = sheet.getLastColumn();
var NumColumns = sheet.getMaxColumns();
// allow for headers
var headerRows = 2;
//erase any current formatting
var ClearRange = sheet.getRange(1, 1, LastRow, NumColumns).setBorder(false, false, false, false, false, false); // clear all formatting
// get the data
var data = sheet.getRange((+1 + headerRows), 1, (LastRow - headerRows), LastColumn).getValues();
// setup new array
var ListofFruits = new Array();
// Loop through the fruits (Column A)
for (var i in data) {
var row = data[i][0].toString();
// Logger.log("Inside LOOP: i = "+i+", value = "+ row);// DEBUG
// search for unqiue values
if (ListofFruits.indexOf(row) == -1) { // if value =-1, then the variable is unique
// Logger.log("Inside IF#1: i = "+i+", "+row+" is not referenced. Adding it");//DEBUG
// underline the previous row
if (i != 0) {
// This IF statement to avoid underlining the Header row
var range = sheet.getRange((+i + 1 + headerRows), 1, 1, NumColumns).setBorder(true, false, false, false, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
}
// continue to build array
ListofFruits.push(row);
}
}
// underline the last row of the fruits column
var range = sheet.getRange(LastRow, 1, 1, NumColumns).setBorder(null, null, true, null, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
//Logger.log(ListofFruits);// DEBUG
}