1

所以我让所有的东西都使用多个脚本,其中一个是一个脚本,可以根据 C 列(日期)自动对工作表进行排序。

这是样本表:https ://docs.google.com/spreadsheets/d/1nP4kZEikx1li8JNwCjsEc3ooadr0fiboglUizUcUdAQ/edit?usp=sharing

基本上,这个想法是让人们能够在底部添加行,添加信息,并在设置日期后立即将其移动到它所属的位置。问题是我需要在不同日期之间留一个空格,但是手动添加一个空行是行不通的,因为自动排序将它发送到底部,因为日期单元格是空白的。

无论如何,是否使用 OnOpen 触发器将每个日期与每一天的子标题行分组?基本上可以识别来自 C 列的不同值并为每个值添加一行或从字面上添加任何具有颜色格式的文本?因为我有自动排序脚本,所以即使它们被添加到工作表的末尾也没关系,因为除了 D 列之外的所有其他单元格都是空的,它应该只在每个日期的顶部发送它。

我确实遇到了这个解决方案https://stackoverflow.com/a/55944980/13895051 但我似乎无法让它工作。

这是我正在使用的自动排序脚本,以防万一

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.');
}

我过去只使用过几个脚本,所以我不知道我在做什么,而且数据透视表并不是一个真正的选择。我将不胜感激!感谢您!

4

1 回答 1

0

我想到了。我最终创建了一个菜单来触发一切。我很沮丧,所以我为排序创建了一个菜单项,为了加快处理过程,我录制了一个宏,在顶部添加了一行并将日期单元格更改为“添加日期”。因此,任何时候有人添加新日期的行,他们都可以在顶部添加一行,添加日期,点击排序,一切都在它所属的地方。

这不是一个雄辩的解决方案,但最终效果更好。这样,如果需要编辑多行,它们就不会全部跳来跳去。

在之前的评论中,我提到我尝试了https://stackoverflow.com/a/55944980/13895051的解决方案并说它不起作用。这是一个简单的修复。我不得不将日期列的格式更改为纯文本。下面是按 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);
  }
于 2021-03-19T18:20:03.017 回答