G Sheets:Group/Separate 基于列值的行,添加具有值或条件边框格式的行
G Sheets: Group/Separate Rows based on column value, Adding Rows with value or conditional border format
所以我拥有多个脚本,其中之一是根据 C 列(日期)自动对 sheet 进行排序的脚本。
这是示例 sheet:https://docs.google.com/spreadsheets/d/1nP4kZEikx1li8JNwCjsEc3ooadr0fiboglUizUcUdAQ/edit?usp=sharing
基本上,这个想法是让人们能够在底部添加行,添加信息,并在设置日期后立即将其移动到它所属的位置。
问题是我需要在不同的日期之间使用 space,但是手动添加一个空行是行不通的,因为自动排序将它发送到底部,因为日期单元格是空白的。
是否可以使用 OnOpen 触发器将每个日期与每一天的 sub-header 行分组?基本上是识别 C 列中的不同值并为每个值添加一行或字面上任何具有颜色格式的文本的东西?因为我有自动排序脚本,所以即使它们被添加到 sheet 的末尾也没有关系,因为除了 D 列之外的所有其他单元格都是空的,它应该只在每个日期的顶部发送它。
我确实遇到过这个解决方案
但我似乎无法让它工作。
这是我正在使用的自动排序脚本,以备不时之需
SHEET_NAME = "North Tonawanda";
SORT_DATA_RANGE = "A:S";
SORT_ORDER = [
{column: 3, ascending: true}, // 3 = column number, sorting by descending order
{column: 4, ascending: true} // 1 = column number, sort by ascending order
];
function onEdit(e){
multiSortColumns();
}
function multiSortColumns(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
var range = sheet.getRange(SORT_DATA_RANGE);
range.sort(SORT_ORDER);
ss.toast('Sort complete.');
}
我过去只使用过几个脚本,所以我不知道我在做什么,而且数据透视表并不是一个真正的选择。我将不胜感激!
谢谢你!
我明白了。我最终创建了一个菜单来触发一切。我感到很沮丧,所以我创建了一个用于排序的菜单项并加快了我录制一个宏的过程,在顶部添加一行并将日期单元格更改为“添加日期”。因此,任何时候有人添加带有新日期的行时,他们都可以在顶部添加一行,添加日期,点击排序,一切都归于它所属的位置。
这不是 eloquent 解决方案,但最终效果更好。这样,如果需要编辑多行,它们就不会全部跳来跳去。
在之前的评论中我提到我尝试了 的解决方案并说它没有用。
这是一个简单的修复。我不得不将日期列的格式更改为纯文本。
下面是按2列排序并在行组之间添加边框的成品。
感谢您的帮助和耐心等待!
SHEET_NAME = "North Tonawanda";
SORT_DATA_RANGE = "A:S";
SORT_ORDER = [
{column: 3, ascending: true}, // 3 = column number, sorting by descending order
{column: 4, ascending: true} // 1 = column number, sort by ascending order
];
function multiSortColumns(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
var range = sheet.getRange(SORT_DATA_RANGE);
range.sort(SORT_ORDER);
ss.toast('Sort complete.');
sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null,
null, null, null, false, false);
var values = sheet.getRange(3, 3, sheet.getLastRow() - 1, 1).getValues();
var rangeList = values.reduce(function(ar, e, i) {
if (i > 0 && values[i - 1][0] != e[0] && e[0] != "") {
ar.push("A" + (i + 2) + ":S" + (i + 2));
}
return ar;
}, [])
rangeList.push(sheet.getRange(sheet.getLastRow(), 1, 1,
sheet.getLastColumn()).getA1Notation());
sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false,
"black", SpreadsheetApp.BorderStyle.SOLID_THICK);
}
所以我拥有多个脚本,其中之一是根据 C 列(日期)自动对 sheet 进行排序的脚本。
这是示例 sheet:https://docs.google.com/spreadsheets/d/1nP4kZEikx1li8JNwCjsEc3ooadr0fiboglUizUcUdAQ/edit?usp=sharing
基本上,这个想法是让人们能够在底部添加行,添加信息,并在设置日期后立即将其移动到它所属的位置。 问题是我需要在不同的日期之间使用 space,但是手动添加一个空行是行不通的,因为自动排序将它发送到底部,因为日期单元格是空白的。
是否可以使用 OnOpen 触发器将每个日期与每一天的 sub-header 行分组?基本上是识别 C 列中的不同值并为每个值添加一行或字面上任何具有颜色格式的文本的东西?因为我有自动排序脚本,所以即使它们被添加到 sheet 的末尾也没有关系,因为除了 D 列之外的所有其他单元格都是空的,它应该只在每个日期的顶部发送它。
我确实遇到过这个解决方案
这是我正在使用的自动排序脚本,以备不时之需
SHEET_NAME = "North Tonawanda";
SORT_DATA_RANGE = "A:S";
SORT_ORDER = [
{column: 3, ascending: true}, // 3 = column number, sorting by descending order
{column: 4, ascending: true} // 1 = column number, sort by ascending order
];
function onEdit(e){
multiSortColumns();
}
function multiSortColumns(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
var range = sheet.getRange(SORT_DATA_RANGE);
range.sort(SORT_ORDER);
ss.toast('Sort complete.');
}
我过去只使用过几个脚本,所以我不知道我在做什么,而且数据透视表并不是一个真正的选择。我将不胜感激! 谢谢你!
我明白了。我最终创建了一个菜单来触发一切。我感到很沮丧,所以我创建了一个用于排序的菜单项并加快了我录制一个宏的过程,在顶部添加一行并将日期单元格更改为“添加日期”。因此,任何时候有人添加带有新日期的行时,他们都可以在顶部添加一行,添加日期,点击排序,一切都归于它所属的位置。
这不是 eloquent 解决方案,但最终效果更好。这样,如果需要编辑多行,它们就不会全部跳来跳去。
在之前的评论中我提到我尝试了
感谢您的帮助和耐心等待!
SHEET_NAME = "North Tonawanda";
SORT_DATA_RANGE = "A:S";
SORT_ORDER = [
{column: 3, ascending: true}, // 3 = column number, sorting by descending order
{column: 4, ascending: true} // 1 = column number, sort by ascending order
];
function multiSortColumns(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
var range = sheet.getRange(SORT_DATA_RANGE);
range.sort(SORT_ORDER);
ss.toast('Sort complete.');
sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null,
null, null, null, false, false);
var values = sheet.getRange(3, 3, sheet.getLastRow() - 1, 1).getValues();
var rangeList = values.reduce(function(ar, e, i) {
if (i > 0 && values[i - 1][0] != e[0] && e[0] != "") {
ar.push("A" + (i + 2) + ":S" + (i + 2));
}
return ar;
}, [])
rangeList.push(sheet.getRange(sheet.getLastRow(), 1, 1,
sheet.getLastColumn()).getA1Notation());
sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false,
"black", SpreadsheetApp.BorderStyle.SOLID_THICK);
}